From 2a3bf9743083c7cb26eee0f702dbb1aa840227ee Mon Sep 17 00:00:00 2001 From: armerian Date: Tue, 13 Aug 2024 05:22:40 +0000 Subject: [PATCH] deploy: f4d54ed6353d3a58fde3686330f7d7994782f80b --- .buildinfo | 2 +- .doctrees/auth.doctree | Bin 86164 -> 86164 bytes .doctrees/client-cli.doctree | Bin 44515 -> 44515 bytes .doctrees/client-java.doctree | Bin 94993 -> 94993 bytes .doctrees/concepts.doctree | Bin 26292 -> 26292 bytes .doctrees/environment.pickle | Bin 45215 -> 45215 bytes .doctrees/index.doctree | Bin 30588 -> 30588 bytes .doctrees/known-issues.doctree | Bin 25098 -> 25098 bytes .doctrees/mirroring.doctree | Bin 67564 -> 67564 bytes .doctrees/setup-configuration.doctree | Bin 135183 -> 135183 bytes .doctrees/setup-installation.doctree | Bin 17508 -> 17508 bytes .doctrees/setup.doctree | Bin 10162 -> 10162 bytes _static/documentation_options.js | 2 +- apidocs/allclasses-index.html | 482 ++- apidocs/allpackages-index.html | 2 +- .../client/AbstractCentralDogma.html | 2 +- .../client/AbstractCentralDogmaBuilder.html | 2 +- .../centraldogma/client/CentralDogma.html | 2 +- .../client/CentralDogmaRepository.html | 2 +- .../centraldogma/client/CommitRequest.html | 2 +- .../centraldogma/client/DiffFilesRequest.html | 2 +- .../centraldogma/client/DiffRequest.html | 2 +- .../centraldogma/client/FileRequest.html | 2 +- .../centraldogma/client/FilesRequest.html | 2 +- .../centraldogma/client/HistoryRequest.html | 2 +- .../linecorp/centraldogma/client/Latest.html | 2 +- .../centraldogma/client/MergeRequest.html | 2 +- .../client/PreviewDiffRequest.html | 2 +- .../centraldogma/client/RepositoryInfo.html | 2 +- .../client/WatchFilesRequest.html | 2 +- .../centraldogma/client/WatchRequest.html | 2 +- .../linecorp/centraldogma/client/Watcher.html | 2 +- .../centraldogma/client/WatcherRequest.html | 2 +- .../AbstractArmeriaCentralDogmaBuilder.html | 2 +- .../armeria/ArmeriaCentralDogmaBuilder.html | 2 +- .../armeria/ArmeriaClientConfigurator.html | 2 +- .../armeria/CentralDogmaEndpointGroup.html | 2 +- .../CentralDogmaEndpointGroupBuilder.html | 2 +- .../DnsAddressEndpointGroupConfigurator.html | 2 +- .../client/armeria/EndpointListDecoder.html | 2 +- .../legacy/LegacyCentralDogmaBuilder.html | 2 +- .../armeria/legacy/package-summary.html | 2 +- .../client/armeria/legacy/package-tree.html | 2 +- .../client/armeria/package-summary.html | 2 +- .../client/armeria/package-tree.html | 2 +- .../centraldogma/client/package-summary.html | 2 +- .../centraldogma/client/package-tree.html | 2 +- .../CentralDogmaClientAutoConfiguration.html | 2 +- ...CentralDogmaClientFactoryConfigurator.html | 2 +- .../client/spring/CentralDogmaSettings.html | 2 +- .../client/spring/package-summary.html | 2 +- .../client/spring/package-tree.html | 2 +- .../client/updater/CentralDogmaBean.html | 2 +- .../updater/CentralDogmaBeanConfig.html | 2 +- .../CentralDogmaBeanConfigBuilder.html | 2 +- .../updater/CentralDogmaBeanFactory.html | 2 +- .../client/updater/package-summary.html | 2 +- .../client/updater/package-tree.html | 2 +- .../linecorp/centraldogma/common/Author.html | 2 +- .../common/AuthorizationException.html | 2 +- .../common/CentralDogmaException.html | 2 +- .../linecorp/centraldogma/common/Change.html | 2 +- .../common/ChangeConflictException.html | 2 +- .../common/ChangeFormatException.html | 2 +- .../centraldogma/common/ChangeType.html | 2 +- .../linecorp/centraldogma/common/Commit.html | 2 +- .../centraldogma/common/ContentHolder.html | 2 +- .../linecorp/centraldogma/common/Entry.html | 2 +- .../common/EntryNoContentException.html | 2 +- .../common/EntryNotFoundException.html | 2 +- .../centraldogma/common/EntryType.html | 2 +- .../common/InvalidPushException.html | 2 +- .../linecorp/centraldogma/common/Markup.html | 2 +- .../centraldogma/common/MergeQuery.html | 2 +- .../centraldogma/common/MergeSource.html | 2 +- .../centraldogma/common/MergedEntry.html | 2 +- .../centraldogma/common/PathPattern.html | 2 +- .../common/ProjectExistsException.html | 2 +- .../common/ProjectNotFoundException.html | 2 +- .../centraldogma/common/PushResult.html | 2 +- .../linecorp/centraldogma/common/Query.html | 2 +- .../common/QueryExecutionException.html | 2 +- .../common/QuerySyntaxException.html | 2 +- .../centraldogma/common/QueryType.html | 2 +- .../common/ReadOnlyException.html | 2 +- .../common/RedundantChangeException.html | 2 +- .../common/RepositoryExistsException.html | 2 +- .../common/RepositoryNotFoundException.html | 2 +- .../centraldogma/common/Revision.html | 2 +- .../common/RevisionJsonDeserializer.html | 2 +- .../common/RevisionJsonSerializer.html | 2 +- .../common/RevisionNotFoundException.html | 2 +- .../centraldogma/common/RevisionRange.html | 2 +- .../common/ShuttingDownException.html | 2 +- .../common/TooManyRequestsException.html | 2 +- .../centraldogma/common/package-summary.html | 2 +- .../centraldogma/common/package-tree.html | 2 +- .../common/util/NonNullByDefault.html | 2 +- .../common/util/package-summary.html | 2 +- .../common/util/package-tree.html | 2 +- .../centraldogma/server/CentralDogma.html | 2 +- .../server/CentralDogmaBuilder.html | 2 +- .../server/CentralDogmaConfig.html | 2 +- .../server/ConfigValueConverter.html | 2 +- .../centraldogma/server/CorsConfig.html | 2 +- .../server/GracefulShutdownTimeout.html | 2 +- .../linecorp/centraldogma/server/Main.html | 2 +- .../centraldogma/server/MirrorException.html | 2 +- .../centraldogma/server/MirroringService.html | 2 +- .../centraldogma/server/QuotaConfig.html | 2 +- .../server/ReplicationConfig.html | 2 +- .../server/ReplicationMethod.html | 2 +- .../centraldogma/server/TlsConfig.html | 2 +- .../server/ZooKeeperReplicationConfig.html | 2 +- .../server/ZooKeeperServerConfig.html | 2 +- .../centraldogma/server/auth/AuthConfig.html | 2 +- .../server/auth/AuthException.html | 2 +- .../server/auth/AuthProvider.html | 6 +- .../server/auth/AuthProviderFactory.html | 2 +- .../server/auth/AuthProviderParameters.html | 2 +- .../auth/RawSessionJsonDeserializer.html | 2 +- .../server/auth/RawSessionJsonSerializer.html | 2 +- .../centraldogma/server/auth/Session.html | 2 +- .../server/auth/SessionManager.html | 2 +- .../server/auth/package-summary.html | 2 +- .../server/auth/package-tree.html | 2 +- .../server/auth/saml/SamlAuthProvider.html | 4 +- .../auth/saml/SamlAuthProviderFactory.html | 2 +- .../server/auth/saml/package-summary.html | 2 +- .../server/auth/saml/package-tree.html | 2 +- .../server/auth/shiro/ShiroAuthProvider.html | 2 +- .../auth/shiro/ShiroAuthProviderFactory.html | 2 +- .../server/auth/shiro/package-summary.html | 2 +- .../server/auth/shiro/package-tree.html | 2 +- .../SearchFirstActiveDirectoryRealm.html | 2 +- .../auth/shiro/realm/package-summary.html | 2 +- .../server/auth/shiro/realm/package-tree.html | 2 +- .../command/AbstractCommandExecutor.html | 2 +- .../server/command/AbstractPushCommand.html | 2 +- .../centraldogma/server/command/Command.html | 2 +- .../server/command/CommandExecutor.html | 2 +- .../command/CommandExecutorStatusManager.html | 2 +- .../server/command/CommandType.html | 2 +- .../server/command/CommitResult.html | 2 +- .../server/command/CreateProjectCommand.html | 2 +- .../command/CreateRepositoryCommand.html | 2 +- .../server/command/CreateSessionCommand.html | 2 +- .../server/command/ForcePushCommand.html | 2 +- .../command/ForwardingCommandExecutor.html | 2 +- .../command/NormalizingPushCommand.html | 2 +- .../server/command/PurgeProjectCommand.html | 2 +- .../command/PurgeRepositoryCommand.html | 2 +- .../server/command/PushAsIsCommand.html | 2 +- .../server/command/RemoveProjectCommand.html | 2 +- .../command/RemoveRepositoryCommand.html | 2 +- .../server/command/RemoveSessionCommand.html | 2 +- .../server/command/RepositoryCommand.html | 2 +- .../server/command/RootCommand.html | 2 +- .../server/command/SessionCommand.html | 2 +- .../command/StandaloneCommandExecutor.html | 2 +- .../command/UnremoveProjectCommand.html | 2 +- .../command/UnremoveRepositoryCommand.html | 2 +- .../command/UpdateServerStatusCommand.html | 2 +- .../server/command/package-summary.html | 2 +- .../server/command/package-tree.html | 2 +- .../server/management/ServerStatus.html | 2 +- .../management/ServerStatusManager.html | 2 +- .../server/management/package-summary.html | 2 +- .../server/management/package-tree.html | 2 +- .../server/metadata/Identifiable.html | 2 +- .../centraldogma/server/metadata/Member.html | 2 +- .../server/metadata/MetadataService.html | 2 +- .../metadata/MetadataServiceInjector.html | 2 +- .../server/metadata/PerRolePermissions.html | 2 +- .../server/metadata/Permission.html | 2 +- .../server/metadata/ProjectMetadata.html | 2 +- .../server/metadata/ProjectRole.html | 2 +- .../server/metadata/RepositoryMetadata.html | 2 +- .../centraldogma/server/metadata/Token.html | 2 +- .../server/metadata/TokenRegistration.html | 2 +- .../centraldogma/server/metadata/Tokens.html | 2 +- .../centraldogma/server/metadata/User.html | 2 +- .../server/metadata/UserAndTimestamp.html | 2 +- .../server/metadata/UserWithToken.html | 2 +- .../server/metadata/package-summary.html | 2 +- .../server/metadata/package-tree.html | 2 +- .../centraldogma/server/mirror/Mirror.html | 2 +- .../server/mirror/MirrorContext.html | 2 +- .../server/mirror/MirrorCredential.html | 14 +- .../server/mirror/MirrorDirection.html | 2 +- .../server/mirror/MirrorProvider.html | 2 +- .../server/mirror/MirrorSchemes.html | 2 +- .../server/mirror/MirrorUtil.html | 2 +- .../mirror/MirroringServicePluginConfig.html | 2 +- .../server/mirror/package-summary.html | 2 +- .../server/mirror/package-tree.html | 2 +- .../centraldogma/server/package-summary.html | 2 +- .../centraldogma/server/package-tree.html | 2 +- .../server/plugin/AbstractPluginConfig.html | 2 +- .../server/plugin/AllReplicasPlugin.html | 2 +- .../centraldogma/server/plugin/Plugin.html | 2 +- .../server/plugin/PluginConfig.html | 2 +- .../plugin/PluginConfigDeserializer.html | 2 +- .../server/plugin/PluginContext.html | 2 +- .../server/plugin/PluginInitContext.html | 2 +- .../server/plugin/PluginTarget.html | 2 +- .../server/plugin/package-summary.html | 2 +- .../server/plugin/package-tree.html | 2 +- .../server/storage/StorageException.html | 2 +- .../server/storage/StorageManager.html | 2 +- .../server/storage/package-summary.html | 2 +- .../server/storage/package-tree.html | 2 +- .../project/InternalProjectInitializer.html | 32 +- .../server/storage/project/Project.html | 2 +- .../storage/project/ProjectManager.html | 2 +- .../storage/project/package-summary.html | 2 +- .../server/storage/project/package-tree.html | 2 +- .../storage/repository/DiffResultType.html | 246 -- .../server/storage/repository/FindOption.html | 2 +- .../storage/repository/FindOptions.html | 2 +- .../storage/repository/MetaRepository.html | 4 +- .../server/storage/repository/Repository.html | 54 +- .../storage/repository/RepositoryManager.html | 2 +- .../storage/repository/package-summary.html | 28 +- .../storage/repository/package-tree.html | 16 +- .../junit/AbstractAllOrEachExtension.html | 2 +- .../testing/junit/CentralDogmaExtension.html | 2 +- .../testing/junit/package-summary.html | 2 +- .../testing/junit/package-tree.html | 2 +- .../testing/junit4/CentralDogmaRule.html | 2 +- .../testing/junit4/package-summary.html | 2 +- .../testing/junit4/package-tree.html | 2 +- apidocs/constant-values.html | 10 +- apidocs/deprecated-list.html | 2 +- apidocs/help-doc.html | 2 +- apidocs/index-all.html | 48 +- apidocs/index.html | 4 +- apidocs/member-search-index.js | 2 +- apidocs/overview-summary.html | 2 +- apidocs/overview-tree.html | 3 +- apidocs/search.html | 2 +- apidocs/serialized-form.html | 2 +- apidocs/type-search-index.js | 2 +- auth.html | 4 +- client-cli.html | 4 +- client-java.html | 12 +- concepts.html | 4 +- genindex.html | 4 +- index.html | 10 +- known-issues.html | 4 +- mirroring.html | 4 +- objects.inv | Bin 732 -> 732 bytes search.html | 4 +- setup-configuration.html | 4 +- setup-installation.html | 10 +- setup.html | 4 +- xref/allclasses-frame.html | 12 +- .../client/armeria/legacy/package-frame.html | 2 +- .../armeria/legacy/package-summary.html | 2 +- .../client/armeria/package-frame.html | 2 +- .../client/armeria/package-summary.html | 2 +- .../centraldogma/client/package-frame.html | 2 +- .../centraldogma/client/package-summary.html | 2 +- .../client/spring/package-frame.html | 2 +- .../client/spring/package-summary.html | 2 +- .../updater/CentralDogmaBeanFactory.html | 2 +- .../client/updater/package-frame.html | 2 +- .../client/updater/package-summary.html | 2 +- .../centraldogma/common/package-frame.html | 2 +- .../centraldogma/common/package-summary.html | 2 +- .../common/util/package-frame.html | 2 +- .../common/util/package-summary.html | 2 +- .../internal/api/v1/package-frame.html | 2 +- .../internal/api/v1/package-summary.html | 2 +- .../internal/client/package-frame.html | 2 +- .../internal/client/package-summary.html | 2 +- .../internal/jsonpatch/package-frame.html | 2 +- .../internal/jsonpatch/package-summary.html | 2 +- .../centraldogma/internal/package-frame.html | 2 +- .../internal/package-summary.html | 2 +- .../internal/thrift/package-frame.html | 2 +- .../internal/thrift/package-summary.html | 2 +- .../centraldogma/server/CentralDogma.html | 2209 ++++++------ .../server/auth/AuthProvider.html | 215 +- .../server/auth/package-frame.html | 2 +- .../server/auth/package-summary.html | 2 +- .../server/auth/saml/package-frame.html | 2 +- .../server/auth/saml/package-summary.html | 2 +- .../server/auth/shiro/package-frame.html | 2 +- .../server/auth/shiro/package-summary.html | 2 +- .../auth/shiro/realm/package-frame.html | 2 +- .../auth/shiro/realm/package-summary.html | 2 +- .../server/command/package-frame.html | 2 +- .../server/command/package-summary.html | 2 +- .../internal/admin/auth/package-frame.html | 2 +- .../internal/admin/auth/package-summary.html | 2 +- .../internal/admin/dto/package-frame.html | 2 +- .../internal/admin/dto/package-summary.html | 2 +- .../admin/service/RepositoryService.html | 18 +- .../internal/admin/service/UserService.html | 57 +- .../internal/admin/service/package-frame.html | 2 +- .../admin/service/package-summary.html | 2 +- .../internal/admin/util/package-frame.html | 2 +- .../internal/admin/util/package-summary.html | 2 +- .../server/internal/api/AbstractService.html | 51 +- .../server/internal/api/ContentServiceV1.html | 902 ++--- .../internal/api/CredentialServiceV1.html | 211 +- .../internal/api/HttpApiExceptionHandler.html | 229 +- .../internal/api/MetadataApiService.html | 705 ++-- .../internal/api/MirroringServiceV1.html | 150 +- .../server/internal/api/ProjectServiceV1.html | 34 +- .../internal/api/RepositoryServiceV1.html | 390 +- .../server/internal/api/TokenService.html | 338 +- .../internal/api/auth/package-frame.html | 2 +- .../internal/api/auth/package-summary.html | 2 +- .../internal/api/converter/package-frame.html | 2 +- .../api/converter/package-summary.html | 2 +- .../server/internal/api/package-frame.html | 2 +- .../server/internal/api/package-summary.html | 2 +- .../mirror/MirroringMigrationService.html | 438 +-- .../AccessTokenMirrorCredential.html | 127 +- .../credential/NoneMirrorCredential.html | 37 +- .../credential/PasswordMirrorCredential.html | 149 +- .../credential/PublicKeyMirrorCredential.html | 246 +- .../mirror/credential/package-frame.html | 2 +- .../mirror/credential/package-summary.html | 2 +- .../server/internal/mirror/package-frame.html | 2 +- .../internal/mirror/package-summary.html | 2 +- .../server/internal/package-frame.html | 2 +- .../server/internal/package-summary.html | 2 +- .../internal/replication/package-frame.html | 2 +- .../internal/replication/package-summary.html | 2 +- .../internal/storage/package-frame.html | 2 +- .../internal/storage/package-summary.html | 2 +- .../storage/project/package-frame.html | 2 +- .../storage/project/package-summary.html | 2 +- .../storage/repository/RepositoryWrapper.html | 350 +- .../cache/CacheableMultiDiffCall.html | 134 +- .../repository/cache/CachingRepository.html | 540 ++- .../repository/cache/package-frame.html | 2 +- .../repository/cache/package-summary.html | 2 +- .../storage/repository/git/GitRepository.html | 3208 ++++++++--------- .../repository/git/GitRepositoryManager.html | 171 +- .../storage/repository/git/package-frame.html | 5 +- .../repository/git/package-summary.html | 7 +- .../storage/repository/package-frame.html | 2 +- .../storage/repository/package-summary.html | 2 +- .../server/internal/thrift/package-frame.html | 2 +- .../internal/thrift/package-summary.html | 2 +- .../server/management/package-frame.html | 2 +- .../server/management/package-summary.html | 2 +- .../server/metadata/package-frame.html | 2 +- .../server/metadata/package-summary.html | 2 +- .../server/mirror/MirrorCredential.html | 7 +- .../server/mirror/package-frame.html | 2 +- .../server/mirror/package-summary.html | 2 +- .../centraldogma/server/package-frame.html | 2 +- .../centraldogma/server/package-summary.html | 2 +- .../server/plugin/package-frame.html | 2 +- .../server/plugin/package-summary.html | 2 +- .../server/storage/package-frame.html | 2 +- .../server/storage/package-summary.html | 2 +- .../project/InternalProjectInitializer.html | 269 +- .../server/storage/project/package-frame.html | 2 +- .../storage/project/package-summary.html | 2 +- .../storage/repository/DiffResultType.html | 49 - .../server/storage/repository/Repository.html | 611 ++-- .../storage/repository/package-frame.html | 5 +- .../storage/repository/package-summary.html | 7 +- .../testing/internal/package-frame.html | 2 +- .../testing/internal/package-summary.html | 2 +- .../testing/junit/package-frame.html | 2 +- .../testing/junit/package-summary.html | 2 +- .../testing/junit4/package-frame.html | 2 +- .../testing/junit4/package-summary.html | 2 +- .../CentralDogmaSnapshotResources.html | 179 +- .../internal/CentralDogmaXdsResources.html | 175 - .../xds/internal/ControlPlanePlugin.html | 640 ++-- .../xds/internal/package-frame.html | 8 +- .../xds/internal/package-summary.html | 12 +- xref/index.html | 2 +- xref/overview-frame.html | 2 +- xref/overview-summary.html | 4 +- 383 files changed, 6907 insertions(+), 7625 deletions(-) delete mode 100644 apidocs/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html delete mode 100644 xref/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html delete mode 100644 xref/com/linecorp/centraldogma/xds/internal/CentralDogmaXdsResources.html diff --git a/.buildinfo b/.buildinfo index 8912b7b279..7a8b546de8 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: cd4f253fff5a6072513eb57643271100 +config: 5d49d9b02336328b45c23f249af7e949 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/auth.doctree b/.doctrees/auth.doctree index ffe98f2d1a35279b9b9e504f53d4ec7ca44831e5..881aea3913c6e99d300a044aa5a40a7cfed1012c 100644 GIT binary patch delta 99 zcmbQTkafyJ)`l&Ndo;w&^^EnCQ}arS5_3}W({mGb4fM=_V$&~cFjnJ~Ox0w}#wEG^ JxhCUUH2`jDAV2^B delta 99 zcmbQTkafyJ)`l&Ndo;u?^bGWqQ}arS5_3}W({mGb4fM=_V$&~cFjnJ~Ox0w}#wEG^ JxhCUUH2`c)AT$5~ diff --git a/.doctrees/client-cli.doctree b/.doctrees/client-cli.doctree index 0e4dc051acbc8e0769d6ddc1fffacd584e7ba960..444397681298147ab1d8e3993eaeeb81522534d9 100644 GIT binary patch delta 94 zcmaESo9XdwrVV@B#m)7M^^;TcN{SM5Qu5Pt6Lk&r%z$E(ue4X=luPT##wEA;MaORy E0GW{@ga7~l delta 94 zcmaESo9XdwrVV@B#Vzy<^pjKbN{SM5Qu5Pt6Lk&r%z$E(ue4X=luPT##wEA;MaORy E0GEv-cmMzZ diff --git a/.doctrees/client-java.doctree b/.doctrees/client-java.doctree index 199628f4ae2747026b11736bf35656c28ed5bb80..9d28d44ff5e5d40f6bb87f709ef6e8e2113cfdcc 100644 GIT binary patch delta 157 zcmbREjCJBO)(sE1M9uY#r?gIKoKibQBZIYv%|Oo#D6;u0ml`uOkkKs1w_T2pu}u)f z*}hz!F$OHWolTjsTumG(rk|XeS5lOilaimFo2U!XJ$;HNV>M1mH7~|&T$0;Ycrj*b F000bcFRcIo delta 157 zcmbREjCJBO)(sE1L@o3TrnF9JoKibQBZIYv%|Oo#D6;u0ml`uOkkKs1w_T2pu}u)f z*}hz!F$OHWolTjsTumG(rk|XeS5lOilaimFo2U!XJ$;HNV>M1mH7~|&T$0;Ycrj*b F000HSFP8uS diff --git a/.doctrees/concepts.doctree b/.doctrees/concepts.doctree index 880a4225a0f0f4d8d8bf8fcfbb043ad2127baf93..c9c33d13fce45a30068164c57fe414985c675819 100644 GIT binary patch delta 98 zcmdmTmT}8j#toMp#m)7M^^;TcN{SM5Qu5Pt6Lk&r%z$E(Yn&t|GdU&Wkrupw*! delta 98 zcmdmTmT}8j#toMp#Vzy<^pjKbN{SM5Qu5Pt6Lk&r%z$E(Yn&t|GdU&WkpoFQNU diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 67505cf0e624ebfb48736f35654365c42689bb49..b70f8d46564d5ac8fc382764881edebccaf5800e 100644 GIT binary patch delta 2107 zcmY*aeN0nV6z?s}4-g&Ii83>@fJ%h|oeF}=a5}%rK9mI~(P6En^iledwuml8aSAIu zpmLrwMui|w`BKT=mbjU1e=Njo&X_ruNTMRyGB;gx(?z#2Z4-|0Q~ z-gDYEWNaHU_8E;+GE?WN%GgS0h0iT}RV6Y#H6s(I8b6Q2K$^qp^;g(ETV+?7-9nMn zdD?B`nn@7^GELjYanKY0FoJ{QFGyn&BJBZxiK;x~bNU12s$$~a;`aLdc8|yIr(c2C z-nf;~4v!ntTO@m>9hbYkTb)&^GR`4;9nNyUPgSBu7NAp=38h|nyVv6O`2tRijW2Uo zRLB)>uS;v5^`&uFz0qJ;xpd(4x#E_nA!)zP)Q2XiNoR+K{*l5uJG%V3)U30%kH$(Z zI%|KoLjs+B*z=y$ptBQ0SEWXso%-~Nq)gE1nVNVQNXlmQFvUEVS>a`~8FI{Hz-!*f z>a`2z7zUS96JU655T>Ohz~ST|R3#_Cq7)b8SrQ=5Jsa+%*x?w)WQz=&(@@)EgS^yQ zxPkGE#%U0fmd_f&o(6DrZUV#~jt6UcF+Tz62iym*Ub;t!DwiIUp{k|m2sBi&G@TGt zE6pK9l}ZZ;QI*m%LR6u&mXJcI2vIm;9CKLnTG^O$|?{boc)Nwc}2!Uc@g54F?ysmJXx=bi>s*y=#Nd@Rdl}p+&VZ)8Q}Bf= zQ7d{a-iRPptAFDt<6z<14+I!oS0}*sw?YEM7SsyRxqi0*SsT0poGqLs^4#5cKq%@v zB?823o-RU}TSh|H9q)@!rE?pDxAQWf?`Re*PI(SWUHL5qbXWs07?knecficu;_yCp zXEG!v?XeUTK=FJcK)&~g0IVF#qcsP&9TULjJ0U^t8BW*@X6i`df`gg3)R^oeer%PLt@gp zS{emdrS218@W2SDJlG+W&?O-$VUci;q2pFR-K&C)p$1>IotsTj%0lw+5 z?xHpdOa0>whGy&r!Oo9jUyouJMzM>d*ricyZ?wosI|xg)PqTm$1aYcM~J5g@eCoJAjH29@y|p2 z>k$7qBq>_*Nuv?RTxwSic3xRmF51&w%UKgV=vss}t($CVHz|GHOIaB1cPHWz#`P>@ zE%0U!P7A2%Da7Nv)?>xTF|jur?dsn7XsdgZ(4OpFjrNaTJ5wP4RIQkB*J2EYT2&fE zCkEY3A^fNdKMCO$348$lB7{4-@S70s>B8?qc%Tb^3gHn6e02U5W7tK%J4^~6q5p~{ zPe|aC)G(3nECQVvsF6Y#O9G#(+-ICP2Pn`uIMUSBdp z2s24gVEFX8*gAj{Mx(T5G{L zJ3$G}J|pc4N*c{e1%rLM8*iTYmIhR|DR_~FRAyN-g*L0K?DYcLsmkp>jnxN3o1mDd|hOFRp zh|MU1YdH7o&`jveC?-BIXFLOm?TL_SEaR1+-{5|D73f`tSOw@KW?1$#CJGJ9oX%i~ zWliTY#4@G}8DiPeWel-Q=~{+-43#2s2cliF#Tl*(r&3mUdKpb1W{cZyw<^;zjRY>X z#lfZWsS2IHjuEYL<=IaJ=vw%t0Cm|11xQ^~EI=stA%V#IG8X4)NLX3~zjlcz%}aFz ziB>tE*CoKt{Ez@i&+iuC)Uu!et6v-$y0`pou0ZbkWTj_Cn#4o=w8}}~W?2?A7oLDK zK;FHr}y?TSGq4p zLie7xhp_@bR%zc78Emfa|dF}?edmVm#pkO zdPiinG0d|<$NC)|Yj$*OOXygeqhmdej>SaBvO?#Bo@0gCtTbL8!^=Z>c?2&H;N|PR ze7Tpe_VUGE>QmB=OAN`887qOO6S8BlEU9$SgYPPWN-N`887qOO6S8BlEU9$SgYPPWN-GGEL|p?tGoaYyw|6Bb7vD|BBcF{+Zgc*< GT1@~vnj~=m delta 98 zcmaFU&+?|9WrNFIaSJ^I{p8fVlA^?%l>GGEL|p?tGoaYyw|6Bb7vD|BBcF{+Zgc*< GT1@~th9qSG diff --git a/.doctrees/setup-configuration.doctree b/.doctrees/setup-configuration.doctree index fb6fbabb898c493eb195974ffdd5ebd6823e8902..6b73e2c1a328b7a793b7dc64cb14bf48c1ea2606 100644 GIT binary patch delta 114 zcmeBQz|p^eqhSkU*<*2YJ!Adk)Vz|S#GI7;^xQ;U13fdK*z|=@7=@=Vc+8kVPzCFB Q^CyhKxRh-N8kDCE05nS|Q~&?~ delta 114 zcmeBQz|p^eqhSkU*<*1FJp=vZ)Vz|S#GI7;^xQ;U13fdK*z|=@7=@=Vc+8kVPzCFB Q^CyhKxRh-N8kDCE05QubNB{r; diff --git a/.doctrees/setup-installation.doctree b/.doctrees/setup-installation.doctree index 00aafd803768fff31ab5e3d53e312fb2fb9f4fad..086648612dc85399f3f41c43c869931bda25de70 100644 GIT binary patch delta 159 zcmaFT!T6+ual;=jadSOm{p8fVlA^?%l>GGEL|p?tGoaXHVeV{Pa+{}ee`6E{Dw@(d rrEyB_6pakl9yW-!%?o%hFf#+CHWv$W^5ZgK@??c-TymRL744M)b5Sy* delta 159 zcmaFT!T6+ual;=jaSJ^I{p8fVlA^?%l>GGEL|p?tGoaXHVeV{Pa+{}ee`6E{Dw@(d rrEyB_6pakl9yW-!%?o%hFf#+CHWv$W^5ZgK@??c-TymRL744M)Y~3=A diff --git a/.doctrees/setup.doctree b/.doctrees/setup.doctree index e36180d0ca620b67ecb5f05099a4d23aa2be5e52..07b7869c3d80821be45a0008cb9fd2787e078120 100644 GIT binary patch delta 92 zcmdnwzsY}t4Xe1hp0R#%YFz6 delta 92 zcmdnwzsY}t4Xe0?o`HUHYF diff --git a/_static/documentation_options.js b/_static/documentation_options.js index 2afb0eceef..65d9c1b789 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.68.0', + VERSION: '0.67.3', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/apidocs/allclasses-index.html b/apidocs/allclasses-index.html index 0bda1cd3be..40f8509026 100644 --- a/apidocs/allclasses-index.html +++ b/apidocs/allclasses-index.html @@ -2,7 +2,7 @@ -All Classes and Interfaces (Central Dogma 0.68.0 API reference) +All Classes and Interfaces (Central Dogma 0.67.3 API reference) @@ -283,501 +283,497 @@

All Classes and Interfaces<
Prepares to send a CentralDogma.getDiff(String, String, Revision, Revision, Query) request to the Central Dogma repository.
- -
-
The options for diffing a repository.
-
- -
+ +
Configures the DNS resolution of the Armeria client of CentralDogma.
- -
+ +
Decodes the content of a file in Central Dogma into a list of Endpoints.
- -
+ +
A file or a directory in a repository.
- -
+ +
A CentralDogmaException that is raised when attempted to retrieve the content from a directory entry.
- -
+ +
A CentralDogmaException that is raised when attempted to access a non-existent entry in a repository.
- -
+ +
The type of an Entry.
- -
+ +
Prepares to send a CentralDogma.getFile(String, String, Revision, Query) request to the Central Dogma repository.
- -
+ + - -
+ +
An option which is specified when retrieving one or more files.
- -
+ +
Useful FindOption maps.
- -
+ +
A Command which is used to force-push delegate even the server is in read-only mode.
- -
+ +
A CommandExecutor which forwards all its method calls to another CommandExecutor.
- -
+ +
Graceful shutdown timeout.
- -
+ +
Prepares to send a CentralDogma.getHistory(String, String, Revision, Revision, PathPattern, int) request to the Central Dogma repository.
- -
+ +
An interface which provides an identifier of an object.
- -
+ +
Initializes the internal project and repositories.
- -
+ +
A CentralDogmaException that is raised when a push is invalid.
- -
+ +
An immutable holder of the latest known value and its Revision retrieved by a Watcher.
- -
Deprecated. + +
Deprecated.
- -
+ +
Entry point of a standalone server.
- -
+ +
The markup language of a Commit message.
- -
+ +
Specifies details of a member who belongs to the Project.
- -
+ +
A merged entry in a repository.
- -
+ +
A merge query on files.
- -
+ +
Prepares to send a CentralDogma.mergeFiles(String, String, Revision, MergeQuery) request to the Central Dogma repository.
- -
+ +
A merge source that contains a path and isOptional which indicates whether the path is required or not.
- -
+ +
A service class for metadata management.
- -
+ +
Injects the MetadataService instance into the attribute of the ServiceRequestContext.
- -
+ +
A Revision-controlled filesystem-like repository which is named "meta".
- -
+ +
Contains the properties for a mirroring task and performs the task.
- -
+ +
A context of a mirror.
- -
+ +
The authentication credentials which are required when accessing the Git repositories.
- -
+ +
Specifies where the mirrored files come from and where they are to be mirrored.
- -
+ +
A RuntimeException raised when MirroringService failed to mirror a repository.
- -
+ +
Performs mirroring of an external repository into a Central Dogma repository.
- -
+ +
A mirroring service plugin configuration.
- -
+ +
Creates a new Mirror dynamically via Java SPI (Service Provider Interface).
- -
+ +
URL schemes used by mirrors.
- -
+ +
A utility class for creating a mirroring task.
- -
+ +
An annotation that signifies the return values, parameters and fields are non-nullable by default leveraging the JSR-305 Nonnull annotation.
- -
+ +
A Command which is used for pushing changes to the repository.
- -
+ +
A path pattern that represents a variant of glob.
- -
+ +
Permission for accessing a repository.
- -
+ +
A default permission for a Repository.
- -
+ +
An interface which defines callbacks for a plug-in.
- -
+ +
A configuration of a plugin.
- -
+ +
A StdDeserializer that deserializes a PluginConfig.
- -
+ +
A class which is used to pass internally-created instances into the Plugin.
- -
+ +
A context that is used to pass when calling AllReplicasPlugin.init(PluginInitContext).
- -
+ +
Targets that a Plugin is applied to which replica.
- -
+ +
Prepares to send a CentralDogma.getPreviewDiffs(String, String, Revision, Iterable) request to the Central Dogma repository.
- -
+ +
A top-level element in Central Dogma storage model.
- -
+ +
A CentralDogmaException that is raised when attempted to create a project with an existing project name.
- -
+ +
A manager which manages Projects in the Central Dogma.
- -
+ +
Specifies details of a Project.
- -
+ +
A CentralDogmaException that is raised when attempted to access a non-existent project.
- -
+ +
Roles of a User in a project.
- -
+ +
A Command which is used for purging a project that was removed before.
- -
+ +
A Command which is used for purging a repository that was removed before.
- -
+ +
A Command which is used replicate a NormalizingPushCommand to other replicas.
- -
+ +
The result of a push operation.
- -
+ +
A query on a file.
- -
+ +
A CentralDogmaException that is raised when the evaluation of a Query has failed.
- -
+ +
An IllegalArgumentException that is raised when the syntax validation of a Query has failed.
- -
+ +
The type of a Query.
- -
+ +
CentralDogma API quota configuration.
- -
+ +
Deserializes a raw session instance from a base64-encoded string.
- -
+ +
Serializes a raw session instance into a base64-encoded string.
- -
+ +
A CentralDogmaException that is raised when attempted to modify data in read-only mode.
- -
+ +
A CentralDogmaException that is raised when attempted to push a commit without effective changes.
- -
+ +
A Command which is used for removing an existing project.
- -
+ +
A Command which is used for removing an existing repository.
- -
+ +
A Command which is used for removing an existing session.
- -
+ +
Replication settings.
- -
+ +
Replication method.
- -
+ +
Revision-controlled filesystem-like repository.
- -
+ +
A super class of the Commands which perform operations on a repository.
- -
+ +
A CentralDogmaException that is raised when attempted to create a repository with an existing repository name.
- -
+ +
An immutable holder of repository information.
- -
+ +
Manages repositories which belong to a project.
- -
+ +
Specifies details of a Repository.
- -
+ +
A CentralDogmaException that is raised when attempted to access a non-existent repository.
- -
+ +
A revision number of a Commit.
- -
+ +
Deserializes JSON into a Revision.
- -
+ +
Serializes a Revision into JSON.
- -
+ +
A CentralDogmaException that is raised when attempted to access a non-existent revision.
- -
+ +
A class which contains Revisions of from and to.
- -
+ +
A super class of the Commands which perform operations without a project or a repository.
- -
+ +
OpenSAML based AuthProvider implementation.
- -
+ +
A factory for creating an OpenSAML based AuthProvider.
- -
+ +
A variant of ActiveDirectoryRealm that binds first with the privileged credential to search for the DN of a user from a username before the actual authentication.
- -
+ +
The status of the server.
- -
+ +
Manages the server status.
- -
+ +
An authenticated session which can be replicated to the other Central Dogma replicas as a serialized form.
- -
+ +
A super class of the Commands which perform operations on the session storage.
- -
+ +
An interface for session management.
- -
+ +
Apache Shiro based AuthProvider implementation.
- -
+ +
A factory for creating an Apache Shiro based AuthProvider.
- -
+ +
A CentralDogmaException that is raised when Central Dogma cannot handle a request because it's shutting down.
- -
+ +
A CommandExecutor implementation which performs operations on the local storage.
- -
+ +
A RuntimeException that is raised when a potentially irrecoverable storage access failure has occurred.
- -
+ +
An abstract interface to define operations performed on the storage.
- -
+ +
TLS configuration.
- -
+ +
Specifies details of an application token.
- -
+ +
Specifies a registration of a Token.
- -
+ +
Holds a token map and a secret map for fast lookup.
- -
+ +
A CentralDogmaException that is raised when a client is attempting to send requests more than quota limits.
- -
+ +
A Command which is used for restoring a project that was removed before.
- -
+ +
A Command which is used for restoring a repository that was removed before.
- -
+ +
A Command which is used to update the status of all servers in the cluster.
- -
+ +
A user.
- -
+ +
Specifies when an object is accessed by whom.
- -
+ +
A User which accesses the API with a secret.
- -
+ +
Watches the changes of a repository or a file.
- -
+ +
Prepares to create a Watcher.
- -
+ +
Prepares to send a CentralDogma.watchRepository(String, String, Revision, PathPattern, long, boolean) request to the Central Dogma repository.
- -
+ +
Prepares to send a CentralDogma.watchFile(String, String, Revision, Query, long, boolean) request to the Central Dogma repository or create a new Watcher.
- -
+ +
ZooKeeper-based replication configuration.
- -
+ +
Represents the address and port numbers of a ZooKeeper node.
diff --git a/apidocs/allpackages-index.html b/apidocs/allpackages-index.html index eaa22ccd91..810d9776a2 100644 --- a/apidocs/allpackages-index.html +++ b/apidocs/allpackages-index.html @@ -2,7 +2,7 @@ -All Packages (Central Dogma 0.68.0 API reference) +All Packages (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogma.html b/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogma.html index 8dba0db04a..f2aa18a487 100644 --- a/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogma.html +++ b/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogma.html @@ -2,7 +2,7 @@ -AbstractCentralDogma (Central Dogma 0.68.0 API reference) +AbstractCentralDogma (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogmaBuilder.html b/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogmaBuilder.html index e4a233d326..00c46c276e 100644 --- a/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogmaBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/AbstractCentralDogmaBuilder.html @@ -2,7 +2,7 @@ -AbstractCentralDogmaBuilder (Central Dogma 0.68.0 API reference) +AbstractCentralDogmaBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/CentralDogma.html b/apidocs/com/linecorp/centraldogma/client/CentralDogma.html index d74c01fbff..2b88e7eee7 100644 --- a/apidocs/com/linecorp/centraldogma/client/CentralDogma.html +++ b/apidocs/com/linecorp/centraldogma/client/CentralDogma.html @@ -2,7 +2,7 @@ -CentralDogma (Central Dogma 0.68.0 API reference) +CentralDogma (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/CentralDogmaRepository.html b/apidocs/com/linecorp/centraldogma/client/CentralDogmaRepository.html index d726f56191..a2247f21b6 100644 --- a/apidocs/com/linecorp/centraldogma/client/CentralDogmaRepository.html +++ b/apidocs/com/linecorp/centraldogma/client/CentralDogmaRepository.html @@ -2,7 +2,7 @@ -CentralDogmaRepository (Central Dogma 0.68.0 API reference) +CentralDogmaRepository (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/CommitRequest.html b/apidocs/com/linecorp/centraldogma/client/CommitRequest.html index a08b3dddea..e7b30a76ae 100644 --- a/apidocs/com/linecorp/centraldogma/client/CommitRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/CommitRequest.html @@ -2,7 +2,7 @@ -CommitRequest (Central Dogma 0.68.0 API reference) +CommitRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/DiffFilesRequest.html b/apidocs/com/linecorp/centraldogma/client/DiffFilesRequest.html index 5e96414037..f4ed72e9aa 100644 --- a/apidocs/com/linecorp/centraldogma/client/DiffFilesRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/DiffFilesRequest.html @@ -2,7 +2,7 @@ -DiffFilesRequest (Central Dogma 0.68.0 API reference) +DiffFilesRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/DiffRequest.html b/apidocs/com/linecorp/centraldogma/client/DiffRequest.html index 773781ab99..74bc648d8e 100644 --- a/apidocs/com/linecorp/centraldogma/client/DiffRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/DiffRequest.html @@ -2,7 +2,7 @@ -DiffRequest (Central Dogma 0.68.0 API reference) +DiffRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/FileRequest.html b/apidocs/com/linecorp/centraldogma/client/FileRequest.html index 84427fc634..9ec9cd6986 100644 --- a/apidocs/com/linecorp/centraldogma/client/FileRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/FileRequest.html @@ -2,7 +2,7 @@ -FileRequest (Central Dogma 0.68.0 API reference) +FileRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/FilesRequest.html b/apidocs/com/linecorp/centraldogma/client/FilesRequest.html index ef4466b680..8d451dd1e5 100644 --- a/apidocs/com/linecorp/centraldogma/client/FilesRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/FilesRequest.html @@ -2,7 +2,7 @@ -FilesRequest (Central Dogma 0.68.0 API reference) +FilesRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/HistoryRequest.html b/apidocs/com/linecorp/centraldogma/client/HistoryRequest.html index 43f04e22a6..e73152b71f 100644 --- a/apidocs/com/linecorp/centraldogma/client/HistoryRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/HistoryRequest.html @@ -2,7 +2,7 @@ -HistoryRequest (Central Dogma 0.68.0 API reference) +HistoryRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/Latest.html b/apidocs/com/linecorp/centraldogma/client/Latest.html index 753d359376..4c45a85d8a 100644 --- a/apidocs/com/linecorp/centraldogma/client/Latest.html +++ b/apidocs/com/linecorp/centraldogma/client/Latest.html @@ -2,7 +2,7 @@ -Latest (Central Dogma 0.68.0 API reference) +Latest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/MergeRequest.html b/apidocs/com/linecorp/centraldogma/client/MergeRequest.html index 280f30e0b4..1926872acf 100644 --- a/apidocs/com/linecorp/centraldogma/client/MergeRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/MergeRequest.html @@ -2,7 +2,7 @@ -MergeRequest (Central Dogma 0.68.0 API reference) +MergeRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/PreviewDiffRequest.html b/apidocs/com/linecorp/centraldogma/client/PreviewDiffRequest.html index a5095cf54e..077d5c0155 100644 --- a/apidocs/com/linecorp/centraldogma/client/PreviewDiffRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/PreviewDiffRequest.html @@ -2,7 +2,7 @@ -PreviewDiffRequest (Central Dogma 0.68.0 API reference) +PreviewDiffRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/RepositoryInfo.html b/apidocs/com/linecorp/centraldogma/client/RepositoryInfo.html index e5bc989b46..7a4c37f271 100644 --- a/apidocs/com/linecorp/centraldogma/client/RepositoryInfo.html +++ b/apidocs/com/linecorp/centraldogma/client/RepositoryInfo.html @@ -2,7 +2,7 @@ -RepositoryInfo (Central Dogma 0.68.0 API reference) +RepositoryInfo (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/WatchFilesRequest.html b/apidocs/com/linecorp/centraldogma/client/WatchFilesRequest.html index 7f523567d3..aac6f00a90 100644 --- a/apidocs/com/linecorp/centraldogma/client/WatchFilesRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/WatchFilesRequest.html @@ -2,7 +2,7 @@ -WatchFilesRequest (Central Dogma 0.68.0 API reference) +WatchFilesRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/WatchRequest.html b/apidocs/com/linecorp/centraldogma/client/WatchRequest.html index 218e9b3a46..d24e3b2a43 100644 --- a/apidocs/com/linecorp/centraldogma/client/WatchRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/WatchRequest.html @@ -2,7 +2,7 @@ -WatchRequest (Central Dogma 0.68.0 API reference) +WatchRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/Watcher.html b/apidocs/com/linecorp/centraldogma/client/Watcher.html index 68204ecad2..7f81aa45ca 100644 --- a/apidocs/com/linecorp/centraldogma/client/Watcher.html +++ b/apidocs/com/linecorp/centraldogma/client/Watcher.html @@ -2,7 +2,7 @@ -Watcher (Central Dogma 0.68.0 API reference) +Watcher (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/WatcherRequest.html b/apidocs/com/linecorp/centraldogma/client/WatcherRequest.html index 2962f56d0f..2aedab8743 100644 --- a/apidocs/com/linecorp/centraldogma/client/WatcherRequest.html +++ b/apidocs/com/linecorp/centraldogma/client/WatcherRequest.html @@ -2,7 +2,7 @@ -WatcherRequest (Central Dogma 0.68.0 API reference) +WatcherRequest (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/AbstractArmeriaCentralDogmaBuilder.html b/apidocs/com/linecorp/centraldogma/client/armeria/AbstractArmeriaCentralDogmaBuilder.html index 0340c910ed..c52fbabad5 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/AbstractArmeriaCentralDogmaBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/AbstractArmeriaCentralDogmaBuilder.html @@ -2,7 +2,7 @@ -AbstractArmeriaCentralDogmaBuilder (Central Dogma 0.68.0 API reference) +AbstractArmeriaCentralDogmaBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaCentralDogmaBuilder.html b/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaCentralDogmaBuilder.html index b9a222c5c2..8fadfebe48 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaCentralDogmaBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaCentralDogmaBuilder.html @@ -2,7 +2,7 @@ -ArmeriaCentralDogmaBuilder (Central Dogma 0.68.0 API reference) +ArmeriaCentralDogmaBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaClientConfigurator.html b/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaClientConfigurator.html index 78bbe25a1b..3abc8c4bc0 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaClientConfigurator.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/ArmeriaClientConfigurator.html @@ -2,7 +2,7 @@ -ArmeriaClientConfigurator (Central Dogma 0.68.0 API reference) +ArmeriaClientConfigurator (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroup.html b/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroup.html index 0944074300..a5d76f21a3 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroup.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroup.html @@ -2,7 +2,7 @@ -CentralDogmaEndpointGroup (Central Dogma 0.68.0 API reference) +CentralDogmaEndpointGroup (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroupBuilder.html b/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroupBuilder.html index 6236b9cfcb..a40da0cc1e 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroupBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/CentralDogmaEndpointGroupBuilder.html @@ -2,7 +2,7 @@ -CentralDogmaEndpointGroupBuilder (Central Dogma 0.68.0 API reference) +CentralDogmaEndpointGroupBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/DnsAddressEndpointGroupConfigurator.html b/apidocs/com/linecorp/centraldogma/client/armeria/DnsAddressEndpointGroupConfigurator.html index 5e435c5c0a..c9a1a08e2b 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/DnsAddressEndpointGroupConfigurator.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/DnsAddressEndpointGroupConfigurator.html @@ -2,7 +2,7 @@ -DnsAddressEndpointGroupConfigurator (Central Dogma 0.68.0 API reference) +DnsAddressEndpointGroupConfigurator (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/EndpointListDecoder.html b/apidocs/com/linecorp/centraldogma/client/armeria/EndpointListDecoder.html index c60ade0d5c..d4daad61d5 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/EndpointListDecoder.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/EndpointListDecoder.html @@ -2,7 +2,7 @@ -EndpointListDecoder (Central Dogma 0.68.0 API reference) +EndpointListDecoder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/LegacyCentralDogmaBuilder.html b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/LegacyCentralDogmaBuilder.html index 8901e1d168..1058485196 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/LegacyCentralDogmaBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/LegacyCentralDogmaBuilder.html @@ -2,7 +2,7 @@ -LegacyCentralDogmaBuilder (Central Dogma 0.68.0 API reference) +LegacyCentralDogmaBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html index 221a019b45..9e96604916 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.armeria.legacy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.armeria.legacy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-tree.html b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-tree.html index d4a1c6f59d..1443ecaab5 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/legacy/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.armeria.legacy Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.armeria.legacy Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/package-summary.html b/apidocs/com/linecorp/centraldogma/client/armeria/package-summary.html index 3d860f03fa..44249dccbc 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.armeria (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.armeria (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/armeria/package-tree.html b/apidocs/com/linecorp/centraldogma/client/armeria/package-tree.html index 2d28716bfe..c96dc8ffca 100644 --- a/apidocs/com/linecorp/centraldogma/client/armeria/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/client/armeria/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.armeria Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.armeria Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/package-summary.html b/apidocs/com/linecorp/centraldogma/client/package-summary.html index c86580a004..3af2fb8205 100644 --- a/apidocs/com/linecorp/centraldogma/client/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/client/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/package-tree.html b/apidocs/com/linecorp/centraldogma/client/package-tree.html index 2a1f56eff4..56d18e7072 100644 --- a/apidocs/com/linecorp/centraldogma/client/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/client/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientAutoConfiguration.html b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientAutoConfiguration.html index 29fcb5cb19..aa8c0c3e27 100644 --- a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientAutoConfiguration.html +++ b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientAutoConfiguration.html @@ -2,7 +2,7 @@ -CentralDogmaClientAutoConfiguration (Central Dogma 0.68.0 API reference) +CentralDogmaClientAutoConfiguration (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientFactoryConfigurator.html b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientFactoryConfigurator.html index faa38d580f..a43dfb90bc 100644 --- a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientFactoryConfigurator.html +++ b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaClientFactoryConfigurator.html @@ -2,7 +2,7 @@ -CentralDogmaClientFactoryConfigurator (Central Dogma 0.68.0 API reference) +CentralDogmaClientFactoryConfigurator (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaSettings.html b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaSettings.html index 4ee6efb5f8..2ce7066650 100644 --- a/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaSettings.html +++ b/apidocs/com/linecorp/centraldogma/client/spring/CentralDogmaSettings.html @@ -2,7 +2,7 @@ -CentralDogmaSettings (Central Dogma 0.68.0 API reference) +CentralDogmaSettings (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/spring/package-summary.html b/apidocs/com/linecorp/centraldogma/client/spring/package-summary.html index f211da30c1..e6f3928aba 100644 --- a/apidocs/com/linecorp/centraldogma/client/spring/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/client/spring/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.spring (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.spring (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/spring/package-tree.html b/apidocs/com/linecorp/centraldogma/client/spring/package-tree.html index 4940ba8f48..4cf705e5aa 100644 --- a/apidocs/com/linecorp/centraldogma/client/spring/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/client/spring/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.spring Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.spring Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBean.html b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBean.html index 5b9a0b3272..a3c738476a 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBean.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBean.html @@ -2,7 +2,7 @@ -CentralDogmaBean (Central Dogma 0.68.0 API reference) +CentralDogmaBean (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfig.html b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfig.html index 2a550daf8a..acdfac1998 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfig.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfig.html @@ -2,7 +2,7 @@ -CentralDogmaBeanConfig (Central Dogma 0.68.0 API reference) +CentralDogmaBeanConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfigBuilder.html b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfigBuilder.html index feeaa60c54..f7bf493ec4 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfigBuilder.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanConfigBuilder.html @@ -2,7 +2,7 @@ -CentralDogmaBeanConfigBuilder (Central Dogma 0.68.0 API reference) +CentralDogmaBeanConfigBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html index 20ad28d7a5..4a966e75cf 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html @@ -2,7 +2,7 @@ -CentralDogmaBeanFactory (Central Dogma 0.68.0 API reference) +CentralDogmaBeanFactory (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/package-summary.html b/apidocs/com/linecorp/centraldogma/client/updater/package-summary.html index aac1633691..8dbd69c7b0 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.updater (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.updater (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/client/updater/package-tree.html b/apidocs/com/linecorp/centraldogma/client/updater/package-tree.html index a093a452a0..4caf67cdd6 100644 --- a/apidocs/com/linecorp/centraldogma/client/updater/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/client/updater/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.client.updater Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.client.updater Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Author.html b/apidocs/com/linecorp/centraldogma/common/Author.html index c92c107bcd..a05713311d 100644 --- a/apidocs/com/linecorp/centraldogma/common/Author.html +++ b/apidocs/com/linecorp/centraldogma/common/Author.html @@ -2,7 +2,7 @@ -Author (Central Dogma 0.68.0 API reference) +Author (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/AuthorizationException.html b/apidocs/com/linecorp/centraldogma/common/AuthorizationException.html index 3bd0790ed0..9c396fd294 100644 --- a/apidocs/com/linecorp/centraldogma/common/AuthorizationException.html +++ b/apidocs/com/linecorp/centraldogma/common/AuthorizationException.html @@ -2,7 +2,7 @@ -AuthorizationException (Central Dogma 0.68.0 API reference) +AuthorizationException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/CentralDogmaException.html b/apidocs/com/linecorp/centraldogma/common/CentralDogmaException.html index a91dbfddcb..26796bb27e 100644 --- a/apidocs/com/linecorp/centraldogma/common/CentralDogmaException.html +++ b/apidocs/com/linecorp/centraldogma/common/CentralDogmaException.html @@ -2,7 +2,7 @@ -CentralDogmaException (Central Dogma 0.68.0 API reference) +CentralDogmaException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Change.html b/apidocs/com/linecorp/centraldogma/common/Change.html index 82a9215b63..469434f1b5 100644 --- a/apidocs/com/linecorp/centraldogma/common/Change.html +++ b/apidocs/com/linecorp/centraldogma/common/Change.html @@ -2,7 +2,7 @@ -Change (Central Dogma 0.68.0 API reference) +Change (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ChangeConflictException.html b/apidocs/com/linecorp/centraldogma/common/ChangeConflictException.html index 93d139037c..82da26d40d 100644 --- a/apidocs/com/linecorp/centraldogma/common/ChangeConflictException.html +++ b/apidocs/com/linecorp/centraldogma/common/ChangeConflictException.html @@ -2,7 +2,7 @@ -ChangeConflictException (Central Dogma 0.68.0 API reference) +ChangeConflictException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ChangeFormatException.html b/apidocs/com/linecorp/centraldogma/common/ChangeFormatException.html index eb522cb3c5..f23de7c7f1 100644 --- a/apidocs/com/linecorp/centraldogma/common/ChangeFormatException.html +++ b/apidocs/com/linecorp/centraldogma/common/ChangeFormatException.html @@ -2,7 +2,7 @@ -ChangeFormatException (Central Dogma 0.68.0 API reference) +ChangeFormatException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ChangeType.html b/apidocs/com/linecorp/centraldogma/common/ChangeType.html index 66bb59770b..8f57fb85b0 100644 --- a/apidocs/com/linecorp/centraldogma/common/ChangeType.html +++ b/apidocs/com/linecorp/centraldogma/common/ChangeType.html @@ -2,7 +2,7 @@ -ChangeType (Central Dogma 0.68.0 API reference) +ChangeType (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Commit.html b/apidocs/com/linecorp/centraldogma/common/Commit.html index 25dc1425f2..e79c0861df 100644 --- a/apidocs/com/linecorp/centraldogma/common/Commit.html +++ b/apidocs/com/linecorp/centraldogma/common/Commit.html @@ -2,7 +2,7 @@ -Commit (Central Dogma 0.68.0 API reference) +Commit (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ContentHolder.html b/apidocs/com/linecorp/centraldogma/common/ContentHolder.html index 85d1f2bb29..ef4ec894fd 100644 --- a/apidocs/com/linecorp/centraldogma/common/ContentHolder.html +++ b/apidocs/com/linecorp/centraldogma/common/ContentHolder.html @@ -2,7 +2,7 @@ -ContentHolder (Central Dogma 0.68.0 API reference) +ContentHolder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Entry.html b/apidocs/com/linecorp/centraldogma/common/Entry.html index cc2ea150ae..4dbc5251c3 100644 --- a/apidocs/com/linecorp/centraldogma/common/Entry.html +++ b/apidocs/com/linecorp/centraldogma/common/Entry.html @@ -2,7 +2,7 @@ -Entry (Central Dogma 0.68.0 API reference) +Entry (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/EntryNoContentException.html b/apidocs/com/linecorp/centraldogma/common/EntryNoContentException.html index 9e626c2471..4b10412953 100644 --- a/apidocs/com/linecorp/centraldogma/common/EntryNoContentException.html +++ b/apidocs/com/linecorp/centraldogma/common/EntryNoContentException.html @@ -2,7 +2,7 @@ -EntryNoContentException (Central Dogma 0.68.0 API reference) +EntryNoContentException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/EntryNotFoundException.html b/apidocs/com/linecorp/centraldogma/common/EntryNotFoundException.html index 553a1b8e56..c351035e54 100644 --- a/apidocs/com/linecorp/centraldogma/common/EntryNotFoundException.html +++ b/apidocs/com/linecorp/centraldogma/common/EntryNotFoundException.html @@ -2,7 +2,7 @@ -EntryNotFoundException (Central Dogma 0.68.0 API reference) +EntryNotFoundException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/EntryType.html b/apidocs/com/linecorp/centraldogma/common/EntryType.html index cba0c81019..76203e1a9c 100644 --- a/apidocs/com/linecorp/centraldogma/common/EntryType.html +++ b/apidocs/com/linecorp/centraldogma/common/EntryType.html @@ -2,7 +2,7 @@ -EntryType (Central Dogma 0.68.0 API reference) +EntryType (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/InvalidPushException.html b/apidocs/com/linecorp/centraldogma/common/InvalidPushException.html index 2dac7c7d25..b68b310c94 100644 --- a/apidocs/com/linecorp/centraldogma/common/InvalidPushException.html +++ b/apidocs/com/linecorp/centraldogma/common/InvalidPushException.html @@ -2,7 +2,7 @@ -InvalidPushException (Central Dogma 0.68.0 API reference) +InvalidPushException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Markup.html b/apidocs/com/linecorp/centraldogma/common/Markup.html index 3da841e562..6e64360841 100644 --- a/apidocs/com/linecorp/centraldogma/common/Markup.html +++ b/apidocs/com/linecorp/centraldogma/common/Markup.html @@ -2,7 +2,7 @@ -Markup (Central Dogma 0.68.0 API reference) +Markup (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/MergeQuery.html b/apidocs/com/linecorp/centraldogma/common/MergeQuery.html index 30a29620cb..677473dbf0 100644 --- a/apidocs/com/linecorp/centraldogma/common/MergeQuery.html +++ b/apidocs/com/linecorp/centraldogma/common/MergeQuery.html @@ -2,7 +2,7 @@ -MergeQuery (Central Dogma 0.68.0 API reference) +MergeQuery (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/MergeSource.html b/apidocs/com/linecorp/centraldogma/common/MergeSource.html index d9b208947c..07a0dd4943 100644 --- a/apidocs/com/linecorp/centraldogma/common/MergeSource.html +++ b/apidocs/com/linecorp/centraldogma/common/MergeSource.html @@ -2,7 +2,7 @@ -MergeSource (Central Dogma 0.68.0 API reference) +MergeSource (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/MergedEntry.html b/apidocs/com/linecorp/centraldogma/common/MergedEntry.html index 4703bc5834..0f033be884 100644 --- a/apidocs/com/linecorp/centraldogma/common/MergedEntry.html +++ b/apidocs/com/linecorp/centraldogma/common/MergedEntry.html @@ -2,7 +2,7 @@ -MergedEntry (Central Dogma 0.68.0 API reference) +MergedEntry (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/PathPattern.html b/apidocs/com/linecorp/centraldogma/common/PathPattern.html index 9546b3a102..335fe84964 100644 --- a/apidocs/com/linecorp/centraldogma/common/PathPattern.html +++ b/apidocs/com/linecorp/centraldogma/common/PathPattern.html @@ -2,7 +2,7 @@ -PathPattern (Central Dogma 0.68.0 API reference) +PathPattern (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ProjectExistsException.html b/apidocs/com/linecorp/centraldogma/common/ProjectExistsException.html index 75027688ff..e1e83bf3fe 100644 --- a/apidocs/com/linecorp/centraldogma/common/ProjectExistsException.html +++ b/apidocs/com/linecorp/centraldogma/common/ProjectExistsException.html @@ -2,7 +2,7 @@ -ProjectExistsException (Central Dogma 0.68.0 API reference) +ProjectExistsException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ProjectNotFoundException.html b/apidocs/com/linecorp/centraldogma/common/ProjectNotFoundException.html index 2c84bd9457..3c43a4078f 100644 --- a/apidocs/com/linecorp/centraldogma/common/ProjectNotFoundException.html +++ b/apidocs/com/linecorp/centraldogma/common/ProjectNotFoundException.html @@ -2,7 +2,7 @@ -ProjectNotFoundException (Central Dogma 0.68.0 API reference) +ProjectNotFoundException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/PushResult.html b/apidocs/com/linecorp/centraldogma/common/PushResult.html index 143c328b31..68f901ac84 100644 --- a/apidocs/com/linecorp/centraldogma/common/PushResult.html +++ b/apidocs/com/linecorp/centraldogma/common/PushResult.html @@ -2,7 +2,7 @@ -PushResult (Central Dogma 0.68.0 API reference) +PushResult (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Query.html b/apidocs/com/linecorp/centraldogma/common/Query.html index 91c4482964..5e90d245ee 100644 --- a/apidocs/com/linecorp/centraldogma/common/Query.html +++ b/apidocs/com/linecorp/centraldogma/common/Query.html @@ -2,7 +2,7 @@ -Query (Central Dogma 0.68.0 API reference) +Query (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/QueryExecutionException.html b/apidocs/com/linecorp/centraldogma/common/QueryExecutionException.html index 4f68ae459d..9434fe0101 100644 --- a/apidocs/com/linecorp/centraldogma/common/QueryExecutionException.html +++ b/apidocs/com/linecorp/centraldogma/common/QueryExecutionException.html @@ -2,7 +2,7 @@ -QueryExecutionException (Central Dogma 0.68.0 API reference) +QueryExecutionException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/QuerySyntaxException.html b/apidocs/com/linecorp/centraldogma/common/QuerySyntaxException.html index 819720f1b1..780c57add5 100644 --- a/apidocs/com/linecorp/centraldogma/common/QuerySyntaxException.html +++ b/apidocs/com/linecorp/centraldogma/common/QuerySyntaxException.html @@ -2,7 +2,7 @@ -QuerySyntaxException (Central Dogma 0.68.0 API reference) +QuerySyntaxException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/QueryType.html b/apidocs/com/linecorp/centraldogma/common/QueryType.html index a0effd6d76..5b5e842f06 100644 --- a/apidocs/com/linecorp/centraldogma/common/QueryType.html +++ b/apidocs/com/linecorp/centraldogma/common/QueryType.html @@ -2,7 +2,7 @@ -QueryType (Central Dogma 0.68.0 API reference) +QueryType (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ReadOnlyException.html b/apidocs/com/linecorp/centraldogma/common/ReadOnlyException.html index 419b55813c..412acb3659 100644 --- a/apidocs/com/linecorp/centraldogma/common/ReadOnlyException.html +++ b/apidocs/com/linecorp/centraldogma/common/ReadOnlyException.html @@ -2,7 +2,7 @@ -ReadOnlyException (Central Dogma 0.68.0 API reference) +ReadOnlyException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RedundantChangeException.html b/apidocs/com/linecorp/centraldogma/common/RedundantChangeException.html index 06427e12d1..7314824482 100644 --- a/apidocs/com/linecorp/centraldogma/common/RedundantChangeException.html +++ b/apidocs/com/linecorp/centraldogma/common/RedundantChangeException.html @@ -2,7 +2,7 @@ -RedundantChangeException (Central Dogma 0.68.0 API reference) +RedundantChangeException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RepositoryExistsException.html b/apidocs/com/linecorp/centraldogma/common/RepositoryExistsException.html index 1715eadcee..c17c261f79 100644 --- a/apidocs/com/linecorp/centraldogma/common/RepositoryExistsException.html +++ b/apidocs/com/linecorp/centraldogma/common/RepositoryExistsException.html @@ -2,7 +2,7 @@ -RepositoryExistsException (Central Dogma 0.68.0 API reference) +RepositoryExistsException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RepositoryNotFoundException.html b/apidocs/com/linecorp/centraldogma/common/RepositoryNotFoundException.html index 0a5bcf1088..6c7bf074b9 100644 --- a/apidocs/com/linecorp/centraldogma/common/RepositoryNotFoundException.html +++ b/apidocs/com/linecorp/centraldogma/common/RepositoryNotFoundException.html @@ -2,7 +2,7 @@ -RepositoryNotFoundException (Central Dogma 0.68.0 API reference) +RepositoryNotFoundException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/Revision.html b/apidocs/com/linecorp/centraldogma/common/Revision.html index 6e845cc4fe..b96c19ea9f 100644 --- a/apidocs/com/linecorp/centraldogma/common/Revision.html +++ b/apidocs/com/linecorp/centraldogma/common/Revision.html @@ -2,7 +2,7 @@ -Revision (Central Dogma 0.68.0 API reference) +Revision (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RevisionJsonDeserializer.html b/apidocs/com/linecorp/centraldogma/common/RevisionJsonDeserializer.html index 41807cf151..a6400cacfe 100644 --- a/apidocs/com/linecorp/centraldogma/common/RevisionJsonDeserializer.html +++ b/apidocs/com/linecorp/centraldogma/common/RevisionJsonDeserializer.html @@ -2,7 +2,7 @@ -RevisionJsonDeserializer (Central Dogma 0.68.0 API reference) +RevisionJsonDeserializer (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RevisionJsonSerializer.html b/apidocs/com/linecorp/centraldogma/common/RevisionJsonSerializer.html index 2df28ac39d..b881705590 100644 --- a/apidocs/com/linecorp/centraldogma/common/RevisionJsonSerializer.html +++ b/apidocs/com/linecorp/centraldogma/common/RevisionJsonSerializer.html @@ -2,7 +2,7 @@ -RevisionJsonSerializer (Central Dogma 0.68.0 API reference) +RevisionJsonSerializer (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RevisionNotFoundException.html b/apidocs/com/linecorp/centraldogma/common/RevisionNotFoundException.html index 95d4c2b99c..456e8fd6a7 100644 --- a/apidocs/com/linecorp/centraldogma/common/RevisionNotFoundException.html +++ b/apidocs/com/linecorp/centraldogma/common/RevisionNotFoundException.html @@ -2,7 +2,7 @@ -RevisionNotFoundException (Central Dogma 0.68.0 API reference) +RevisionNotFoundException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/RevisionRange.html b/apidocs/com/linecorp/centraldogma/common/RevisionRange.html index 2c8afdd084..8080f67946 100644 --- a/apidocs/com/linecorp/centraldogma/common/RevisionRange.html +++ b/apidocs/com/linecorp/centraldogma/common/RevisionRange.html @@ -2,7 +2,7 @@ -RevisionRange (Central Dogma 0.68.0 API reference) +RevisionRange (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/ShuttingDownException.html b/apidocs/com/linecorp/centraldogma/common/ShuttingDownException.html index 3aa5ee372a..8d5aa3c225 100644 --- a/apidocs/com/linecorp/centraldogma/common/ShuttingDownException.html +++ b/apidocs/com/linecorp/centraldogma/common/ShuttingDownException.html @@ -2,7 +2,7 @@ -ShuttingDownException (Central Dogma 0.68.0 API reference) +ShuttingDownException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/TooManyRequestsException.html b/apidocs/com/linecorp/centraldogma/common/TooManyRequestsException.html index 1800fdc702..46f78e4239 100644 --- a/apidocs/com/linecorp/centraldogma/common/TooManyRequestsException.html +++ b/apidocs/com/linecorp/centraldogma/common/TooManyRequestsException.html @@ -2,7 +2,7 @@ -TooManyRequestsException (Central Dogma 0.68.0 API reference) +TooManyRequestsException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/package-summary.html b/apidocs/com/linecorp/centraldogma/common/package-summary.html index e8ec0ef61f..f4d1bbe0be 100644 --- a/apidocs/com/linecorp/centraldogma/common/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/common/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.common (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.common (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/package-tree.html b/apidocs/com/linecorp/centraldogma/common/package-tree.html index b919122b4f..e5decbdabd 100644 --- a/apidocs/com/linecorp/centraldogma/common/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/common/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.common Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.common Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/util/NonNullByDefault.html b/apidocs/com/linecorp/centraldogma/common/util/NonNullByDefault.html index d1be14c752..7ad33e2356 100644 --- a/apidocs/com/linecorp/centraldogma/common/util/NonNullByDefault.html +++ b/apidocs/com/linecorp/centraldogma/common/util/NonNullByDefault.html @@ -2,7 +2,7 @@ -NonNullByDefault (Central Dogma 0.68.0 API reference) +NonNullByDefault (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/util/package-summary.html b/apidocs/com/linecorp/centraldogma/common/util/package-summary.html index 8ef6013320..78e046cb66 100644 --- a/apidocs/com/linecorp/centraldogma/common/util/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/common/util/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.common.util (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.common.util (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/common/util/package-tree.html b/apidocs/com/linecorp/centraldogma/common/util/package-tree.html index f4ab5d7464..b13dd86e0e 100644 --- a/apidocs/com/linecorp/centraldogma/common/util/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/common/util/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.common.util Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.common.util Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/CentralDogma.html b/apidocs/com/linecorp/centraldogma/server/CentralDogma.html index c91fdf9db9..40a549e25f 100644 --- a/apidocs/com/linecorp/centraldogma/server/CentralDogma.html +++ b/apidocs/com/linecorp/centraldogma/server/CentralDogma.html @@ -2,7 +2,7 @@ -CentralDogma (Central Dogma 0.68.0 API reference) +CentralDogma (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/CentralDogmaBuilder.html b/apidocs/com/linecorp/centraldogma/server/CentralDogmaBuilder.html index 4aa7293933..b0656f24b4 100644 --- a/apidocs/com/linecorp/centraldogma/server/CentralDogmaBuilder.html +++ b/apidocs/com/linecorp/centraldogma/server/CentralDogmaBuilder.html @@ -2,7 +2,7 @@ -CentralDogmaBuilder (Central Dogma 0.68.0 API reference) +CentralDogmaBuilder (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/CentralDogmaConfig.html b/apidocs/com/linecorp/centraldogma/server/CentralDogmaConfig.html index dc1c9476a2..2fecc2663f 100644 --- a/apidocs/com/linecorp/centraldogma/server/CentralDogmaConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/CentralDogmaConfig.html @@ -2,7 +2,7 @@ -CentralDogmaConfig (Central Dogma 0.68.0 API reference) +CentralDogmaConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/ConfigValueConverter.html b/apidocs/com/linecorp/centraldogma/server/ConfigValueConverter.html index 536c458771..d4668aad1a 100644 --- a/apidocs/com/linecorp/centraldogma/server/ConfigValueConverter.html +++ b/apidocs/com/linecorp/centraldogma/server/ConfigValueConverter.html @@ -2,7 +2,7 @@ -ConfigValueConverter (Central Dogma 0.68.0 API reference) +ConfigValueConverter (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/CorsConfig.html b/apidocs/com/linecorp/centraldogma/server/CorsConfig.html index 4b82ee7a94..98a0d1fbfb 100644 --- a/apidocs/com/linecorp/centraldogma/server/CorsConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/CorsConfig.html @@ -2,7 +2,7 @@ -CorsConfig (Central Dogma 0.68.0 API reference) +CorsConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/GracefulShutdownTimeout.html b/apidocs/com/linecorp/centraldogma/server/GracefulShutdownTimeout.html index 60fbaa69c3..04fe3c4cf3 100644 --- a/apidocs/com/linecorp/centraldogma/server/GracefulShutdownTimeout.html +++ b/apidocs/com/linecorp/centraldogma/server/GracefulShutdownTimeout.html @@ -2,7 +2,7 @@ -GracefulShutdownTimeout (Central Dogma 0.68.0 API reference) +GracefulShutdownTimeout (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/Main.html b/apidocs/com/linecorp/centraldogma/server/Main.html index 49e211226a..9c650c0461 100644 --- a/apidocs/com/linecorp/centraldogma/server/Main.html +++ b/apidocs/com/linecorp/centraldogma/server/Main.html @@ -2,7 +2,7 @@ -Main (Central Dogma 0.68.0 API reference) +Main (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/MirrorException.html b/apidocs/com/linecorp/centraldogma/server/MirrorException.html index a1ac1d0b44..106377e451 100644 --- a/apidocs/com/linecorp/centraldogma/server/MirrorException.html +++ b/apidocs/com/linecorp/centraldogma/server/MirrorException.html @@ -2,7 +2,7 @@ -MirrorException (Central Dogma 0.68.0 API reference) +MirrorException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/MirroringService.html b/apidocs/com/linecorp/centraldogma/server/MirroringService.html index cf971178ef..0932fe35d0 100644 --- a/apidocs/com/linecorp/centraldogma/server/MirroringService.html +++ b/apidocs/com/linecorp/centraldogma/server/MirroringService.html @@ -2,7 +2,7 @@ -MirroringService (Central Dogma 0.68.0 API reference) +MirroringService (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/QuotaConfig.html b/apidocs/com/linecorp/centraldogma/server/QuotaConfig.html index 1ddefc672f..6d97d2fd3e 100644 --- a/apidocs/com/linecorp/centraldogma/server/QuotaConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/QuotaConfig.html @@ -2,7 +2,7 @@ -QuotaConfig (Central Dogma 0.68.0 API reference) +QuotaConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/ReplicationConfig.html b/apidocs/com/linecorp/centraldogma/server/ReplicationConfig.html index 2f5203271b..4f01473665 100644 --- a/apidocs/com/linecorp/centraldogma/server/ReplicationConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/ReplicationConfig.html @@ -2,7 +2,7 @@ -ReplicationConfig (Central Dogma 0.68.0 API reference) +ReplicationConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/ReplicationMethod.html b/apidocs/com/linecorp/centraldogma/server/ReplicationMethod.html index 47ba0f8284..7d53229faf 100644 --- a/apidocs/com/linecorp/centraldogma/server/ReplicationMethod.html +++ b/apidocs/com/linecorp/centraldogma/server/ReplicationMethod.html @@ -2,7 +2,7 @@ -ReplicationMethod (Central Dogma 0.68.0 API reference) +ReplicationMethod (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/TlsConfig.html b/apidocs/com/linecorp/centraldogma/server/TlsConfig.html index 7b100a1bf4..1bd0e66602 100644 --- a/apidocs/com/linecorp/centraldogma/server/TlsConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/TlsConfig.html @@ -2,7 +2,7 @@ -TlsConfig (Central Dogma 0.68.0 API reference) +TlsConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/ZooKeeperReplicationConfig.html b/apidocs/com/linecorp/centraldogma/server/ZooKeeperReplicationConfig.html index 93be4bfe4f..b79b5439e3 100644 --- a/apidocs/com/linecorp/centraldogma/server/ZooKeeperReplicationConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/ZooKeeperReplicationConfig.html @@ -2,7 +2,7 @@ -ZooKeeperReplicationConfig (Central Dogma 0.68.0 API reference) +ZooKeeperReplicationConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/ZooKeeperServerConfig.html b/apidocs/com/linecorp/centraldogma/server/ZooKeeperServerConfig.html index ee11684906..9ad7febb34 100644 --- a/apidocs/com/linecorp/centraldogma/server/ZooKeeperServerConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/ZooKeeperServerConfig.html @@ -2,7 +2,7 @@ -ZooKeeperServerConfig (Central Dogma 0.68.0 API reference) +ZooKeeperServerConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/AuthConfig.html b/apidocs/com/linecorp/centraldogma/server/auth/AuthConfig.html index b1dda820d7..570b5ac0e7 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/AuthConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/AuthConfig.html @@ -2,7 +2,7 @@ -AuthConfig (Central Dogma 0.68.0 API reference) +AuthConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/AuthException.html b/apidocs/com/linecorp/centraldogma/server/auth/AuthException.html index c604123837..19c9293f08 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/AuthException.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/AuthException.html @@ -2,7 +2,7 @@ -AuthException (Central Dogma 0.68.0 API reference) +AuthException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/AuthProvider.html b/apidocs/com/linecorp/centraldogma/server/auth/AuthProvider.html index 42edc30dfa..4ade3d89b3 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/AuthProvider.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/AuthProvider.html @@ -2,7 +2,7 @@ -AuthProvider (Central Dogma 0.68.0 API reference) +AuthProvider (Central Dogma 0.67.3 API reference) @@ -302,7 +302,7 @@

Method Details

webLoginService

default HttpService webLoginService()
Returns a Service which handles a login request from a web browser. By default, - the browser would bring a user to the built-in web login page served on "/web/auth/login/".
+ the browser would bring a user to the built-in web login page served on "/web/auth/login".
  • @@ -311,7 +311,7 @@

    webLogoutService

    default HttpService webLogoutService()
    Returns a Service which handles a logout request from a web browser. By default, the browser would bring a user to the built-in web logout page served on - "/web/auth/logout/".
    + "/web/auth/logout".
  • diff --git a/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderFactory.html b/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderFactory.html index 89609f7a75..14210f056a 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderFactory.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderFactory.html @@ -2,7 +2,7 @@ -AuthProviderFactory (Central Dogma 0.68.0 API reference) +AuthProviderFactory (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderParameters.html b/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderParameters.html index ea16584ad4..25c5a32fe4 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderParameters.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/AuthProviderParameters.html @@ -2,7 +2,7 @@ -AuthProviderParameters (Central Dogma 0.68.0 API reference) +AuthProviderParameters (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonDeserializer.html b/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonDeserializer.html index a53a279bc3..9567b84449 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonDeserializer.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonDeserializer.html @@ -2,7 +2,7 @@ -RawSessionJsonDeserializer (Central Dogma 0.68.0 API reference) +RawSessionJsonDeserializer (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonSerializer.html b/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonSerializer.html index b5035621fe..74e3d7be42 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonSerializer.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/RawSessionJsonSerializer.html @@ -2,7 +2,7 @@ -RawSessionJsonSerializer (Central Dogma 0.68.0 API reference) +RawSessionJsonSerializer (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/Session.html b/apidocs/com/linecorp/centraldogma/server/auth/Session.html index f496ff7bb0..b09b5201d5 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/Session.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/Session.html @@ -2,7 +2,7 @@ -Session (Central Dogma 0.68.0 API reference) +Session (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/SessionManager.html b/apidocs/com/linecorp/centraldogma/server/auth/SessionManager.html index c659fba8ce..b2bcb1cec1 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/SessionManager.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/SessionManager.html @@ -2,7 +2,7 @@ -SessionManager (Central Dogma 0.68.0 API reference) +SessionManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/package-summary.html b/apidocs/com/linecorp/centraldogma/server/auth/package-summary.html index 6efbe16368..849bc9c73a 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/package-tree.html b/apidocs/com/linecorp/centraldogma/server/auth/package-tree.html index d8f7da8f24..5ec985b502 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProvider.html b/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProvider.html index b83da14bb1..e88a17a850 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProvider.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProvider.html @@ -2,7 +2,7 @@ -SamlAuthProvider (Central Dogma 0.68.0 API reference) +SamlAuthProvider (Central Dogma 0.67.3 API reference) @@ -158,7 +158,7 @@

    webLoginService

    public HttpService webLoginService()
    Description copied from interface: AuthProvider
    Returns a Service which handles a login request from a web browser. By default, - the browser would bring a user to the built-in web login page served on "/web/auth/login/".
    + the browser would bring a user to the built-in web login page served on "/web/auth/login".
  • Specified by:
    webLoginService in interface AuthProvider
    diff --git a/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProviderFactory.html b/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProviderFactory.html index 2033fb4705..af415bd23f 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProviderFactory.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/saml/SamlAuthProviderFactory.html @@ -2,7 +2,7 @@ -SamlAuthProviderFactory (Central Dogma 0.68.0 API reference) +SamlAuthProviderFactory (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/saml/package-summary.html b/apidocs/com/linecorp/centraldogma/server/auth/saml/package-summary.html index 62d6d1d1fa..3acd3aaae7 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/saml/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/saml/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.saml (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.saml (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/saml/package-tree.html b/apidocs/com/linecorp/centraldogma/server/auth/saml/package-tree.html index 92ce816fa8..01259bd8f2 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/saml/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/saml/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.saml Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.saml Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProvider.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProvider.html index 82a341ba90..c044660451 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProvider.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProvider.html @@ -2,7 +2,7 @@ -ShiroAuthProvider (Central Dogma 0.68.0 API reference) +ShiroAuthProvider (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProviderFactory.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProviderFactory.html index 026beb9010..965931590d 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProviderFactory.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/ShiroAuthProviderFactory.html @@ -2,7 +2,7 @@ -ShiroAuthProviderFactory (Central Dogma 0.68.0 API reference) +ShiroAuthProviderFactory (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-summary.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-summary.html index aa658d1280..62c6dda461 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.shiro (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.shiro (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-tree.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-tree.html index 297bd1a3b2..4604275131 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.shiro Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.shiro Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.html index 0e8fa49a65..0df1c68b4c 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.html @@ -2,7 +2,7 @@ -SearchFirstActiveDirectoryRealm (Central Dogma 0.68.0 API reference) +SearchFirstActiveDirectoryRealm (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html index 6583965c06..4d7d6fd9b3 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.shiro.realm (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.shiro.realm (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-tree.html b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-tree.html index b7ba2f3a7c..341d384933 100644 --- a/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/auth/shiro/realm/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.auth.shiro.realm Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.auth.shiro.realm Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/AbstractCommandExecutor.html b/apidocs/com/linecorp/centraldogma/server/command/AbstractCommandExecutor.html index 2c8d3090ce..d2cf8c1ded 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/AbstractCommandExecutor.html +++ b/apidocs/com/linecorp/centraldogma/server/command/AbstractCommandExecutor.html @@ -2,7 +2,7 @@ -AbstractCommandExecutor (Central Dogma 0.68.0 API reference) +AbstractCommandExecutor (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/AbstractPushCommand.html b/apidocs/com/linecorp/centraldogma/server/command/AbstractPushCommand.html index 6930885416..9c5911caec 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/AbstractPushCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/AbstractPushCommand.html @@ -2,7 +2,7 @@ -AbstractPushCommand (Central Dogma 0.68.0 API reference) +AbstractPushCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/Command.html b/apidocs/com/linecorp/centraldogma/server/command/Command.html index ae1d5dc1c7..b633107458 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/Command.html +++ b/apidocs/com/linecorp/centraldogma/server/command/Command.html @@ -2,7 +2,7 @@ -Command (Central Dogma 0.68.0 API reference) +Command (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CommandExecutor.html b/apidocs/com/linecorp/centraldogma/server/command/CommandExecutor.html index d2ec0e0423..1cdce5c3b6 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CommandExecutor.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CommandExecutor.html @@ -2,7 +2,7 @@ -CommandExecutor (Central Dogma 0.68.0 API reference) +CommandExecutor (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CommandExecutorStatusManager.html b/apidocs/com/linecorp/centraldogma/server/command/CommandExecutorStatusManager.html index e83d090c3a..0de0942879 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CommandExecutorStatusManager.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CommandExecutorStatusManager.html @@ -2,7 +2,7 @@ -CommandExecutorStatusManager (Central Dogma 0.68.0 API reference) +CommandExecutorStatusManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CommandType.html b/apidocs/com/linecorp/centraldogma/server/command/CommandType.html index 918f4f5336..de4c9958ba 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CommandType.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CommandType.html @@ -2,7 +2,7 @@ -CommandType (Central Dogma 0.68.0 API reference) +CommandType (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CommitResult.html b/apidocs/com/linecorp/centraldogma/server/command/CommitResult.html index 4d459f85fa..8697983a74 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CommitResult.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CommitResult.html @@ -2,7 +2,7 @@ -CommitResult (Central Dogma 0.68.0 API reference) +CommitResult (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CreateProjectCommand.html b/apidocs/com/linecorp/centraldogma/server/command/CreateProjectCommand.html index 36017725b3..a6be1e6f6a 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CreateProjectCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CreateProjectCommand.html @@ -2,7 +2,7 @@ -CreateProjectCommand (Central Dogma 0.68.0 API reference) +CreateProjectCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CreateRepositoryCommand.html b/apidocs/com/linecorp/centraldogma/server/command/CreateRepositoryCommand.html index 1902aad650..b437d39335 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CreateRepositoryCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CreateRepositoryCommand.html @@ -2,7 +2,7 @@ -CreateRepositoryCommand (Central Dogma 0.68.0 API reference) +CreateRepositoryCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/CreateSessionCommand.html b/apidocs/com/linecorp/centraldogma/server/command/CreateSessionCommand.html index 93232c156d..53d40f1cea 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/CreateSessionCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/CreateSessionCommand.html @@ -2,7 +2,7 @@ -CreateSessionCommand (Central Dogma 0.68.0 API reference) +CreateSessionCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/ForcePushCommand.html b/apidocs/com/linecorp/centraldogma/server/command/ForcePushCommand.html index 2d5a72c111..eac6501334 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/ForcePushCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/ForcePushCommand.html @@ -2,7 +2,7 @@ -ForcePushCommand (Central Dogma 0.68.0 API reference) +ForcePushCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/ForwardingCommandExecutor.html b/apidocs/com/linecorp/centraldogma/server/command/ForwardingCommandExecutor.html index fe11bbbde8..f4da76b622 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/ForwardingCommandExecutor.html +++ b/apidocs/com/linecorp/centraldogma/server/command/ForwardingCommandExecutor.html @@ -2,7 +2,7 @@ -ForwardingCommandExecutor (Central Dogma 0.68.0 API reference) +ForwardingCommandExecutor (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/NormalizingPushCommand.html b/apidocs/com/linecorp/centraldogma/server/command/NormalizingPushCommand.html index 868182fecb..5166f1e4fb 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/NormalizingPushCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/NormalizingPushCommand.html @@ -2,7 +2,7 @@ -NormalizingPushCommand (Central Dogma 0.68.0 API reference) +NormalizingPushCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/PurgeProjectCommand.html b/apidocs/com/linecorp/centraldogma/server/command/PurgeProjectCommand.html index 21614ea85e..24105e5f91 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/PurgeProjectCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/PurgeProjectCommand.html @@ -2,7 +2,7 @@ -PurgeProjectCommand (Central Dogma 0.68.0 API reference) +PurgeProjectCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/PurgeRepositoryCommand.html b/apidocs/com/linecorp/centraldogma/server/command/PurgeRepositoryCommand.html index 86b5352e04..c712fd8664 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/PurgeRepositoryCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/PurgeRepositoryCommand.html @@ -2,7 +2,7 @@ -PurgeRepositoryCommand (Central Dogma 0.68.0 API reference) +PurgeRepositoryCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/PushAsIsCommand.html b/apidocs/com/linecorp/centraldogma/server/command/PushAsIsCommand.html index 64d4fa92ba..dc0166481b 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/PushAsIsCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/PushAsIsCommand.html @@ -2,7 +2,7 @@ -PushAsIsCommand (Central Dogma 0.68.0 API reference) +PushAsIsCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/RemoveProjectCommand.html b/apidocs/com/linecorp/centraldogma/server/command/RemoveProjectCommand.html index 04a3972282..1f5d958f4a 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/RemoveProjectCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/RemoveProjectCommand.html @@ -2,7 +2,7 @@ -RemoveProjectCommand (Central Dogma 0.68.0 API reference) +RemoveProjectCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/RemoveRepositoryCommand.html b/apidocs/com/linecorp/centraldogma/server/command/RemoveRepositoryCommand.html index 528f535fa2..781bbecc46 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/RemoveRepositoryCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/RemoveRepositoryCommand.html @@ -2,7 +2,7 @@ -RemoveRepositoryCommand (Central Dogma 0.68.0 API reference) +RemoveRepositoryCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/RemoveSessionCommand.html b/apidocs/com/linecorp/centraldogma/server/command/RemoveSessionCommand.html index a3c26391e5..35e859ad30 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/RemoveSessionCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/RemoveSessionCommand.html @@ -2,7 +2,7 @@ -RemoveSessionCommand (Central Dogma 0.68.0 API reference) +RemoveSessionCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/RepositoryCommand.html b/apidocs/com/linecorp/centraldogma/server/command/RepositoryCommand.html index 0edf610774..a396fb08a8 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/RepositoryCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/RepositoryCommand.html @@ -2,7 +2,7 @@ -RepositoryCommand (Central Dogma 0.68.0 API reference) +RepositoryCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/RootCommand.html b/apidocs/com/linecorp/centraldogma/server/command/RootCommand.html index 224b3a6b69..a4523a2695 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/RootCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/RootCommand.html @@ -2,7 +2,7 @@ -RootCommand (Central Dogma 0.68.0 API reference) +RootCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/SessionCommand.html b/apidocs/com/linecorp/centraldogma/server/command/SessionCommand.html index e63d87b416..6d3ce30852 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/SessionCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/SessionCommand.html @@ -2,7 +2,7 @@ -SessionCommand (Central Dogma 0.68.0 API reference) +SessionCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/StandaloneCommandExecutor.html b/apidocs/com/linecorp/centraldogma/server/command/StandaloneCommandExecutor.html index 62888e8c1f..44f2a4a6d7 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/StandaloneCommandExecutor.html +++ b/apidocs/com/linecorp/centraldogma/server/command/StandaloneCommandExecutor.html @@ -2,7 +2,7 @@ -StandaloneCommandExecutor (Central Dogma 0.68.0 API reference) +StandaloneCommandExecutor (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/UnremoveProjectCommand.html b/apidocs/com/linecorp/centraldogma/server/command/UnremoveProjectCommand.html index 7a57744152..808a40af40 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/UnremoveProjectCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/UnremoveProjectCommand.html @@ -2,7 +2,7 @@ -UnremoveProjectCommand (Central Dogma 0.68.0 API reference) +UnremoveProjectCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/UnremoveRepositoryCommand.html b/apidocs/com/linecorp/centraldogma/server/command/UnremoveRepositoryCommand.html index 938d731740..ef8f4eff9a 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/UnremoveRepositoryCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/UnremoveRepositoryCommand.html @@ -2,7 +2,7 @@ -UnremoveRepositoryCommand (Central Dogma 0.68.0 API reference) +UnremoveRepositoryCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/UpdateServerStatusCommand.html b/apidocs/com/linecorp/centraldogma/server/command/UpdateServerStatusCommand.html index 47d34d0af8..0a5afaedf8 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/UpdateServerStatusCommand.html +++ b/apidocs/com/linecorp/centraldogma/server/command/UpdateServerStatusCommand.html @@ -2,7 +2,7 @@ -UpdateServerStatusCommand (Central Dogma 0.68.0 API reference) +UpdateServerStatusCommand (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/package-summary.html b/apidocs/com/linecorp/centraldogma/server/command/package-summary.html index 83fd5e34d3..2dc4d5ab45 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/command/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.command (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.command (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/command/package-tree.html b/apidocs/com/linecorp/centraldogma/server/command/package-tree.html index a40d7ac80f..fc10583c5a 100644 --- a/apidocs/com/linecorp/centraldogma/server/command/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/command/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.command Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.command Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/management/ServerStatus.html b/apidocs/com/linecorp/centraldogma/server/management/ServerStatus.html index 5d7e31924b..6214c6840e 100644 --- a/apidocs/com/linecorp/centraldogma/server/management/ServerStatus.html +++ b/apidocs/com/linecorp/centraldogma/server/management/ServerStatus.html @@ -2,7 +2,7 @@ -ServerStatus (Central Dogma 0.68.0 API reference) +ServerStatus (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/management/ServerStatusManager.html b/apidocs/com/linecorp/centraldogma/server/management/ServerStatusManager.html index 785a1ebe6e..61668055c5 100644 --- a/apidocs/com/linecorp/centraldogma/server/management/ServerStatusManager.html +++ b/apidocs/com/linecorp/centraldogma/server/management/ServerStatusManager.html @@ -2,7 +2,7 @@ -ServerStatusManager (Central Dogma 0.68.0 API reference) +ServerStatusManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/management/package-summary.html b/apidocs/com/linecorp/centraldogma/server/management/package-summary.html index 3bb6e9850c..2f8dbadc70 100644 --- a/apidocs/com/linecorp/centraldogma/server/management/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/management/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.management (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.management (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/management/package-tree.html b/apidocs/com/linecorp/centraldogma/server/management/package-tree.html index 1034d72a0e..81715c1aab 100644 --- a/apidocs/com/linecorp/centraldogma/server/management/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/management/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.management Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.management Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/Identifiable.html b/apidocs/com/linecorp/centraldogma/server/metadata/Identifiable.html index fde659cf40..54839d835a 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/Identifiable.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/Identifiable.html @@ -2,7 +2,7 @@ -Identifiable (Central Dogma 0.68.0 API reference) +Identifiable (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/Member.html b/apidocs/com/linecorp/centraldogma/server/metadata/Member.html index cfca6188ca..487073e849 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/Member.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/Member.html @@ -2,7 +2,7 @@ -Member (Central Dogma 0.68.0 API reference) +Member (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/MetadataService.html b/apidocs/com/linecorp/centraldogma/server/metadata/MetadataService.html index 46395bf22a..9964c0a798 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/MetadataService.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/MetadataService.html @@ -2,7 +2,7 @@ -MetadataService (Central Dogma 0.68.0 API reference) +MetadataService (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/MetadataServiceInjector.html b/apidocs/com/linecorp/centraldogma/server/metadata/MetadataServiceInjector.html index 7e436e8d98..3a02adee8b 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/MetadataServiceInjector.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/MetadataServiceInjector.html @@ -2,7 +2,7 @@ -MetadataServiceInjector (Central Dogma 0.68.0 API reference) +MetadataServiceInjector (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/PerRolePermissions.html b/apidocs/com/linecorp/centraldogma/server/metadata/PerRolePermissions.html index ab91e45b59..603e995d63 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/PerRolePermissions.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/PerRolePermissions.html @@ -2,7 +2,7 @@ -PerRolePermissions (Central Dogma 0.68.0 API reference) +PerRolePermissions (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/Permission.html b/apidocs/com/linecorp/centraldogma/server/metadata/Permission.html index 2f434dd9d6..ad31616080 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/Permission.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/Permission.html @@ -2,7 +2,7 @@ -Permission (Central Dogma 0.68.0 API reference) +Permission (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/ProjectMetadata.html b/apidocs/com/linecorp/centraldogma/server/metadata/ProjectMetadata.html index a4962417e6..5a4504f632 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/ProjectMetadata.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/ProjectMetadata.html @@ -2,7 +2,7 @@ -ProjectMetadata (Central Dogma 0.68.0 API reference) +ProjectMetadata (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/ProjectRole.html b/apidocs/com/linecorp/centraldogma/server/metadata/ProjectRole.html index 72f6bc12a8..eb4df27a42 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/ProjectRole.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/ProjectRole.html @@ -2,7 +2,7 @@ -ProjectRole (Central Dogma 0.68.0 API reference) +ProjectRole (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/RepositoryMetadata.html b/apidocs/com/linecorp/centraldogma/server/metadata/RepositoryMetadata.html index 4c0cdd367f..31d5d499dd 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/RepositoryMetadata.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/RepositoryMetadata.html @@ -2,7 +2,7 @@ -RepositoryMetadata (Central Dogma 0.68.0 API reference) +RepositoryMetadata (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/Token.html b/apidocs/com/linecorp/centraldogma/server/metadata/Token.html index 1a504a9bbd..c0c1a7ff55 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/Token.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/Token.html @@ -2,7 +2,7 @@ -Token (Central Dogma 0.68.0 API reference) +Token (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/TokenRegistration.html b/apidocs/com/linecorp/centraldogma/server/metadata/TokenRegistration.html index 1684cc2b81..b929bdc472 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/TokenRegistration.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/TokenRegistration.html @@ -2,7 +2,7 @@ -TokenRegistration (Central Dogma 0.68.0 API reference) +TokenRegistration (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/Tokens.html b/apidocs/com/linecorp/centraldogma/server/metadata/Tokens.html index 063d965995..792e50451d 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/Tokens.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/Tokens.html @@ -2,7 +2,7 @@ -Tokens (Central Dogma 0.68.0 API reference) +Tokens (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/User.html b/apidocs/com/linecorp/centraldogma/server/metadata/User.html index 5d64a0d5ef..20b0fcb7e2 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/User.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/User.html @@ -2,7 +2,7 @@ -User (Central Dogma 0.68.0 API reference) +User (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/UserAndTimestamp.html b/apidocs/com/linecorp/centraldogma/server/metadata/UserAndTimestamp.html index cf05965115..dd8cbacf22 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/UserAndTimestamp.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/UserAndTimestamp.html @@ -2,7 +2,7 @@ -UserAndTimestamp (Central Dogma 0.68.0 API reference) +UserAndTimestamp (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/UserWithToken.html b/apidocs/com/linecorp/centraldogma/server/metadata/UserWithToken.html index 9f5087cd12..ae215258ad 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/UserWithToken.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/UserWithToken.html @@ -2,7 +2,7 @@ -UserWithToken (Central Dogma 0.68.0 API reference) +UserWithToken (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/package-summary.html b/apidocs/com/linecorp/centraldogma/server/metadata/package-summary.html index 2c8f0f75b0..adae01e03f 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.metadata (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.metadata (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/metadata/package-tree.html b/apidocs/com/linecorp/centraldogma/server/metadata/package-tree.html index 5de27a444f..8de31e7cf3 100644 --- a/apidocs/com/linecorp/centraldogma/server/metadata/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/metadata/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.metadata Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.metadata Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/Mirror.html b/apidocs/com/linecorp/centraldogma/server/mirror/Mirror.html index 42252a7c72..3ac45b103e 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/Mirror.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/Mirror.html @@ -2,7 +2,7 @@ -Mirror (Central Dogma 0.68.0 API reference) +Mirror (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorContext.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorContext.html index 33739a480a..76203236e4 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorContext.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorContext.html @@ -2,7 +2,7 @@ -MirrorContext (Central Dogma 0.68.0 API reference) +MirrorContext (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorCredential.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorCredential.html index de4e74cbbd..f6a0d5503b 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorCredential.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorCredential.html @@ -2,7 +2,7 @@ -MirrorCredential (Central Dogma 0.68.0 API reference) +MirrorCredential (Central Dogma 0.67.3 API reference) @@ -138,11 +138,6 @@

    Method Summary

    Returns true if the specified uri is matched by one of the host name patterns.
    - - -
    -
    Returns a new MirrorCredential that does not contain any sensitive information.
    -
    @@ -203,13 +198,6 @@

    matches

    -
  • -
    -

    withoutSecret

    -
    MirrorCredential withoutSecret()
    -
    Returns a new MirrorCredential that does not contain any sensitive information.
    -
    -
  • diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorDirection.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorDirection.html index 1de00e633a..4961cf4181 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorDirection.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorDirection.html @@ -2,7 +2,7 @@ -MirrorDirection (Central Dogma 0.68.0 API reference) +MirrorDirection (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorProvider.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorProvider.html index c9aac9e56e..705b8a5119 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorProvider.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorProvider.html @@ -2,7 +2,7 @@ -MirrorProvider (Central Dogma 0.68.0 API reference) +MirrorProvider (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorSchemes.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorSchemes.html index 1c8b0e4837..4c959c82cc 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorSchemes.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorSchemes.html @@ -2,7 +2,7 @@ -MirrorSchemes (Central Dogma 0.68.0 API reference) +MirrorSchemes (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorUtil.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorUtil.html index 7c0c107d7f..35786e9d9e 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirrorUtil.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirrorUtil.html @@ -2,7 +2,7 @@ -MirrorUtil (Central Dogma 0.68.0 API reference) +MirrorUtil (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/MirroringServicePluginConfig.html b/apidocs/com/linecorp/centraldogma/server/mirror/MirroringServicePluginConfig.html index 4bf612a9c1..684b55f6c5 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/MirroringServicePluginConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/MirroringServicePluginConfig.html @@ -2,7 +2,7 @@ -MirroringServicePluginConfig (Central Dogma 0.68.0 API reference) +MirroringServicePluginConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/package-summary.html b/apidocs/com/linecorp/centraldogma/server/mirror/package-summary.html index 28d5dbf980..04185d8834 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.mirror (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.mirror (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/mirror/package-tree.html b/apidocs/com/linecorp/centraldogma/server/mirror/package-tree.html index 2f49ca6602..b841f15d9c 100644 --- a/apidocs/com/linecorp/centraldogma/server/mirror/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/mirror/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.mirror Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.mirror Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/package-summary.html b/apidocs/com/linecorp/centraldogma/server/package-summary.html index 2e27753293..7588d96207 100644 --- a/apidocs/com/linecorp/centraldogma/server/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/package-tree.html b/apidocs/com/linecorp/centraldogma/server/package-tree.html index 5c9444778c..50b836a7fb 100644 --- a/apidocs/com/linecorp/centraldogma/server/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/AbstractPluginConfig.html b/apidocs/com/linecorp/centraldogma/server/plugin/AbstractPluginConfig.html index 80bcc1685a..1f28c1ef3d 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/AbstractPluginConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/AbstractPluginConfig.html @@ -2,7 +2,7 @@ -AbstractPluginConfig (Central Dogma 0.68.0 API reference) +AbstractPluginConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/AllReplicasPlugin.html b/apidocs/com/linecorp/centraldogma/server/plugin/AllReplicasPlugin.html index a64d00a9fa..03cc6b905a 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/AllReplicasPlugin.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/AllReplicasPlugin.html @@ -2,7 +2,7 @@ -AllReplicasPlugin (Central Dogma 0.68.0 API reference) +AllReplicasPlugin (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/Plugin.html b/apidocs/com/linecorp/centraldogma/server/plugin/Plugin.html index 2153700aee..6f3210b6ad 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/Plugin.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/Plugin.html @@ -2,7 +2,7 @@ -Plugin (Central Dogma 0.68.0 API reference) +Plugin (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfig.html b/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfig.html index d15cfa5b81..e7bce9deb5 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfig.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfig.html @@ -2,7 +2,7 @@ -PluginConfig (Central Dogma 0.68.0 API reference) +PluginConfig (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfigDeserializer.html b/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfigDeserializer.html index d2fce08aad..aa9c0546c3 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfigDeserializer.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/PluginConfigDeserializer.html @@ -2,7 +2,7 @@ -PluginConfigDeserializer (Central Dogma 0.68.0 API reference) +PluginConfigDeserializer (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/PluginContext.html b/apidocs/com/linecorp/centraldogma/server/plugin/PluginContext.html index 52a4c15fcb..db97330330 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/PluginContext.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/PluginContext.html @@ -2,7 +2,7 @@ -PluginContext (Central Dogma 0.68.0 API reference) +PluginContext (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/PluginInitContext.html b/apidocs/com/linecorp/centraldogma/server/plugin/PluginInitContext.html index 12e2d94a19..c433359f9f 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/PluginInitContext.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/PluginInitContext.html @@ -2,7 +2,7 @@ -PluginInitContext (Central Dogma 0.68.0 API reference) +PluginInitContext (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/PluginTarget.html b/apidocs/com/linecorp/centraldogma/server/plugin/PluginTarget.html index ea4f3ee3be..e45efb7476 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/PluginTarget.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/PluginTarget.html @@ -2,7 +2,7 @@ -PluginTarget (Central Dogma 0.68.0 API reference) +PluginTarget (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/package-summary.html b/apidocs/com/linecorp/centraldogma/server/plugin/package-summary.html index f31c507d9d..acac6b3036 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.plugin (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.plugin (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/plugin/package-tree.html b/apidocs/com/linecorp/centraldogma/server/plugin/package-tree.html index 8efa4c8977..e059b80e99 100644 --- a/apidocs/com/linecorp/centraldogma/server/plugin/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/plugin/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.plugin Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.plugin Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/StorageException.html b/apidocs/com/linecorp/centraldogma/server/storage/StorageException.html index 7bcff318ba..968e0d543c 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/StorageException.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/StorageException.html @@ -2,7 +2,7 @@ -StorageException (Central Dogma 0.68.0 API reference) +StorageException (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/StorageManager.html b/apidocs/com/linecorp/centraldogma/server/storage/StorageManager.html index 473a9f8755..31c71cb6e6 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/StorageManager.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/StorageManager.html @@ -2,7 +2,7 @@ -StorageManager (Central Dogma 0.68.0 API reference) +StorageManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/package-summary.html b/apidocs/com/linecorp/centraldogma/server/storage/package-summary.html index 14677f063d..06e158516f 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/package-tree.html b/apidocs/com/linecorp/centraldogma/server/storage/package-tree.html index b20a0a3172..24fba6eb2a 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html b/apidocs/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html index 84cbd4f6ac..81ccfc7cc3 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html @@ -2,7 +2,7 @@ -InternalProjectInitializer (Central Dogma 0.68.0 API reference) +InternalProjectInitializer (Central Dogma 0.67.3 API reference) @@ -140,17 +140,17 @@

    Method Summary

    void
    -
    Creates an internal project and repositories and a token storage to dogma/dogma/tokens.json.
    +
    Creates an internal project and repositories such as a token storage.
    void
    -
    initialize(String projectName)
    +
    -
    Creates the specified internal project and its internal repositories.
    +
    Creates an internal project and repositories such as a token storage.
    void
    -
    initialize0(String projectName)
    +
    -
    Creates an internal project and repositories such as a token storage.
    +
    Creates the specified internal repositories in the internal project.
    @@ -216,20 +216,13 @@

    Method Details

    initialize

    public void initialize()
    -
    Creates an internal project and repositories and a token storage to dogma/dogma/tokens.json.
    -
    - -
  • -
    -

    initialize

    -
    public void initialize(String projectName)
    -
    Creates the specified internal project and its internal repositories.
    +
    Creates an internal project and repositories such as a token storage.
  • -
    +

    initialize0

    -
    public void initialize0(String projectName)
    +
    public void initialize0()
    Creates an internal project and repositories such as a token storage.
  • @@ -241,6 +234,13 @@

    whenInitialized

    ready.
    +
  • +
    +

    initializeInternalRepos

    +
    public void initializeInternalRepos(List<String> internalRepos)
    +
    Creates the specified internal repositories in the internal project.
    +
    +
  • diff --git a/apidocs/com/linecorp/centraldogma/server/storage/project/Project.html b/apidocs/com/linecorp/centraldogma/server/storage/project/Project.html index f1a0e16b01..12a723d266 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/project/Project.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/project/Project.html @@ -2,7 +2,7 @@ -Project (Central Dogma 0.68.0 API reference) +Project (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/project/ProjectManager.html b/apidocs/com/linecorp/centraldogma/server/storage/project/ProjectManager.html index 5e4f7f7b36..9be02d9f85 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/project/ProjectManager.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/project/ProjectManager.html @@ -2,7 +2,7 @@ -ProjectManager (Central Dogma 0.68.0 API reference) +ProjectManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/project/package-summary.html b/apidocs/com/linecorp/centraldogma/server/storage/project/package-summary.html index b12f2e335a..d03049eccc 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/project/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/project/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage.project (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage.project (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/project/package-tree.html b/apidocs/com/linecorp/centraldogma/server/storage/project/package-tree.html index 56d4db8613..3f606cff7d 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/project/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/project/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage.project Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage.project Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html deleted file mode 100644 index 0ab7e030bd..0000000000 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - -DiffResultType (Central Dogma 0.68.0 API reference) - - - - - - - - - - - - - -
    - -
    -
    - -
    - -

    Enum Class DiffResultType

    -
    -
    java.lang.Object -
    java.lang.Enum<DiffResultType> -
    com.linecorp.centraldogma.server.storage.repository.DiffResultType
    -
    -
    -
    -
    -
    All Implemented Interfaces:
    -
    Serializable, Comparable<DiffResultType>, java.lang.constant.Constable
    -
    -
    -
    public enum DiffResultType -extends Enum<DiffResultType>
    -
    The options for diffing a repository.
    -
    -
    - -
    -
    -
      - -
    • -
      -

      Enum Constant Details

      - -
      -
    • - -
    • -
      -

      Method Details

      -
        -
      • -
        -

        values

        -
        public static DiffResultType[] values()
        -
        Returns an array containing the constants of this enum class, in -the order they are declared.
        -
        -
        Returns:
        -
        an array containing the constants of this enum class, in the order they are declared
        -
        -
        -
      • -
      • -
        -

        valueOf

        -
        public static DiffResultType valueOf(String name)
        -
        Returns the enum constant of this class with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this class. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum class has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
        -
      • -
      -
      -
    • -
    -
    - -
    -
    -
    - -
    -
    -
    - - diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOption.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOption.html index 2113166454..51cfbfe616 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOption.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOption.html @@ -2,7 +2,7 @@ -FindOption (Central Dogma 0.68.0 API reference) +FindOption (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOptions.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOptions.html index 5ed435c4d7..6ec86040e0 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOptions.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/FindOptions.html @@ -2,7 +2,7 @@ -FindOptions (Central Dogma 0.68.0 API reference) +FindOptions (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/MetaRepository.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/MetaRepository.html index c352b49b8e..8daec2d727 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/MetaRepository.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/MetaRepository.html @@ -2,7 +2,7 @@ -MetaRepository (Central Dogma 0.68.0 API reference) +MetaRepository (Central Dogma 0.67.3 API reference) @@ -161,7 +161,7 @@

    Method Summary

    +author, commit, commit, commit, commit, creationTimeMillis, diff, diff, exists, find, find, findLatestRevision, findLatestRevision, get, get, getOrNull, getOrNull, history, history, jGitRepository, mergeFiles, name, normalize, normalizeNow, normalizeNow, parent, previewDiff, previewDiff, watch, watch, watch, watch
    diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/Repository.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/Repository.html index 286627dbbc..88a780a5c2 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/Repository.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/Repository.html @@ -2,7 +2,7 @@ -Repository (Central Dogma 0.68.0 API reference) +Repository (Central Dogma 0.67.3 API reference) @@ -186,27 +186,10 @@

    Method Summary

    Query a file at two different revisions and return the diff of the two query results.
    - -
    diff(Revision from, - Revision to, - Query<?> query, - DiffResultType diffResultType)
    -
    -
    Query a file at two different revisions and return the diff of the two query results.
    -
    - -
    diff(Revision from, - Revision to, - String pathPattern)
    -
    -
    Returns the diff for all files that are matched by the specified pathPattern - between the specified two Revisions.
    -
    -
    diff(Revision from, +
    diff(Revision from, Revision to, - String pathPattern, - DiffResultType diffResultType)
    + String pathPattern)
    Returns the diff for all files that are matched by the specified pathPattern between the specified two Revisions.
    @@ -618,42 +601,13 @@

    diff

  • -
    -

    diff

    -
    default CompletableFuture<Change<?>> diff(Revision from, - Revision to, - Query<?> query, - DiffResultType diffResultType)
    -
    Query a file at two different revisions and return the diff of the two query results.
    -
    -
  • -
  • diff

    -
    default CompletableFuture<Map<String,Change<?>>> diff(Revision from, - Revision to, - String pathPattern)
    -
    Returns the diff for all files that are matched by the specified pathPattern - between the specified two Revisions.
    -
    -
    Throws:
    -
    StorageException - if from or to does not exist.
    -
    -
    -
  • -
  • -
    -

    diff

    CompletableFuture<Map<String,Change<?>>> diff(Revision from, Revision to, - String pathPattern, - DiffResultType diffResultType)
    + String pathPattern)
  • Returns the diff for all files that are matched by the specified pathPattern between the specified two Revisions.
    -
    -
    Throws:
    -
    StorageException - if from or to does not exist.
    -
  • diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/RepositoryManager.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/RepositoryManager.html index 0ef1046e63..9dd39d5f40 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/RepositoryManager.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/RepositoryManager.html @@ -2,7 +2,7 @@ -RepositoryManager (Central Dogma 0.68.0 API reference) +RepositoryManager (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/package-summary.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/package-summary.html index 568d6dde1a..899742a642 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage.repository (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage.repository (Central Dogma 0.67.3 API reference) @@ -94,33 +94,29 @@

    -
    +
    Class
    Description
    - -
    -
    The options for diffing a repository.
    -
    - -
    + +
    An option which is specified when retrieving one or more files.
    - -
    + +
    Useful FindOption maps.
    - -
    + +
    A Revision-controlled filesystem-like repository which is named "meta".
    - -
    + +
    Revision-controlled filesystem-like repository.
    - -
    + +
    Manages repositories which belong to a project.
    diff --git a/apidocs/com/linecorp/centraldogma/server/storage/repository/package-tree.html b/apidocs/com/linecorp/centraldogma/server/storage/repository/package-tree.html index 12e3bd38c5..6f99771dea 100644 --- a/apidocs/com/linecorp/centraldogma/server/storage/repository/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/server/storage/repository/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.server.storage.repository Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.server.storage.repository Class Hierarchy (Central Dogma 0.67.3 API reference) @@ -80,20 +80,6 @@

    Interface Hierarchy

  • -
    -

    Enum Class Hierarchy

    - -

    diff --git a/apidocs/com/linecorp/centraldogma/testing/junit/AbstractAllOrEachExtension.html b/apidocs/com/linecorp/centraldogma/testing/junit/AbstractAllOrEachExtension.html index b6efab4f97..07957e2795 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit/AbstractAllOrEachExtension.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit/AbstractAllOrEachExtension.html @@ -2,7 +2,7 @@ -AbstractAllOrEachExtension (Central Dogma 0.68.0 API reference) +AbstractAllOrEachExtension (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit/CentralDogmaExtension.html b/apidocs/com/linecorp/centraldogma/testing/junit/CentralDogmaExtension.html index f6a8c6c775..8047583ae9 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit/CentralDogmaExtension.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit/CentralDogmaExtension.html @@ -2,7 +2,7 @@ -CentralDogmaExtension (Central Dogma 0.68.0 API reference) +CentralDogmaExtension (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit/package-summary.html b/apidocs/com/linecorp/centraldogma/testing/junit/package-summary.html index f415be4ace..328d267dfc 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.testing.junit (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.testing.junit (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit/package-tree.html b/apidocs/com/linecorp/centraldogma/testing/junit/package-tree.html index eef0922c24..76c52ecbbf 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.testing.junit Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.testing.junit Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit4/CentralDogmaRule.html b/apidocs/com/linecorp/centraldogma/testing/junit4/CentralDogmaRule.html index 6d5e4377fc..ddb944c0c2 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit4/CentralDogmaRule.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit4/CentralDogmaRule.html @@ -2,7 +2,7 @@ -CentralDogmaRule (Central Dogma 0.68.0 API reference) +CentralDogmaRule (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit4/package-summary.html b/apidocs/com/linecorp/centraldogma/testing/junit4/package-summary.html index 902fd16c18..cc88d6245f 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit4/package-summary.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit4/package-summary.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.testing.junit4 (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.testing.junit4 (Central Dogma 0.67.3 API reference) diff --git a/apidocs/com/linecorp/centraldogma/testing/junit4/package-tree.html b/apidocs/com/linecorp/centraldogma/testing/junit4/package-tree.html index 44d6872a28..f2e066d3f4 100644 --- a/apidocs/com/linecorp/centraldogma/testing/junit4/package-tree.html +++ b/apidocs/com/linecorp/centraldogma/testing/junit4/package-tree.html @@ -2,7 +2,7 @@ -com.linecorp.centraldogma.testing.junit4 Class Hierarchy (Central Dogma 0.68.0 API reference) +com.linecorp.centraldogma.testing.junit4 Class Hierarchy (Central Dogma 0.67.3 API reference) diff --git a/apidocs/constant-values.html b/apidocs/constant-values.html index 3aa47c69fb..50b987d12e 100644 --- a/apidocs/constant-values.html +++ b/apidocs/constant-values.html @@ -2,7 +2,7 @@ -Constant Field Values (Central Dogma 0.68.0 API reference) +Constant Field Values (Central Dogma 0.67.3 API reference) @@ -87,16 +87,16 @@

    com.linecorp.*

    "/web/auth"
    public static final String
    -
    "/web/auth/login/"
    +
    "/web/auth/login"
    public static final String
    -
    "/web/auth/logout/"
    +
    "/web/auth/logout"
    public static final String
    -
    "/link/auth/login/"
    +
    "/link/auth/login"
    public static final String
    -
    "/link/auth/logout/"
    +
    "/link/auth/logout"
    diff --git a/apidocs/deprecated-list.html b/apidocs/deprecated-list.html index ad95cff23f..9f1043a2b2 100644 --- a/apidocs/deprecated-list.html +++ b/apidocs/deprecated-list.html @@ -2,7 +2,7 @@ -Deprecated List (Central Dogma 0.68.0 API reference) +Deprecated List (Central Dogma 0.67.3 API reference) diff --git a/apidocs/help-doc.html b/apidocs/help-doc.html index a437ea4a5d..81a03835d9 100644 --- a/apidocs/help-doc.html +++ b/apidocs/help-doc.html @@ -2,7 +2,7 @@ -API Help (Central Dogma 0.68.0 API reference) +API Help (Central Dogma 0.67.3 API reference) diff --git a/apidocs/index-all.html b/apidocs/index-all.html index d576931f4e..b149043683 100644 --- a/apidocs/index-all.html +++ b/apidocs/index-all.html @@ -2,7 +2,7 @@ -Index (Central Dogma 0.68.0 API reference) +Index (Central Dogma 0.67.3 API reference) @@ -1375,20 +1375,11 @@

    D

    Query a file at two different revisions and return the diff of the two query results.
    -
    diff(Revision, Revision, Query<?>, DiffResultType) - Method in interface com.linecorp.centraldogma.server.storage.repository.Repository
    -
    -
    Query a file at two different revisions and return the diff of the two query results.
    -
    diff(Revision, Revision, String) - Method in interface com.linecorp.centraldogma.server.storage.repository.Repository
    Returns the diff for all files that are matched by the specified pathPattern between the specified two Revisions.
    -
    diff(Revision, Revision, String, DiffResultType) - Method in interface com.linecorp.centraldogma.server.storage.repository.Repository
    -
    -
    Returns the diff for all files that are matched by the specified pathPattern - between the specified two Revisions.
    -
    diff(Iterable<? extends Change<?>>) - Method in class com.linecorp.centraldogma.client.CentralDogmaRepository
    Returns a new PreviewDiffRequest that is used to retrieve the preview diff of files in the @@ -1409,10 +1400,6 @@

    D

    Prepares to send a CentralDogma.getDiff(String, String, Revision, Revision, Query) request to the Central Dogma repository.
    -
    DiffResultType - Enum Class in com.linecorp.centraldogma.server.storage.repository
    -
    -
    The options for diffing a repository.
    -
    direction() - Method in interface com.linecorp.centraldogma.server.mirror.Mirror
    Returns the direction of the mirroring task.
    @@ -2443,15 +2430,15 @@

    I

    initialize() - Method in class com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer
    -
    Creates an internal project and repositories and a token storage to dogma/dogma/tokens.json.
    +
    Creates an internal project and repositories such as a token storage.
    -
    initialize(String) - Method in class com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer
    +
    initialize0() - Method in class com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer
    -
    Creates the specified internal project and its internal repositories.
    +
    Creates an internal project and repositories such as a token storage.
    -
    initialize0(String) - Method in class com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer
    +
    initializeInternalRepos(List<String>) - Method in class com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer
    -
    Creates an internal project and repositories such as a token storage.
    +
    Creates the specified internal repositories in the internal project.
    initialValueFuture() - Method in interface com.linecorp.centraldogma.client.Watcher
    @@ -3277,10 +3264,6 @@

    N

    An annotation that signifies the return values, parameters and fields are non-nullable by default leveraging the JSR-305 Nonnull annotation.
    -
    NORMAL - Enum constant in enum class com.linecorp.centraldogma.server.storage.repository.DiffResultType
    -
    -
    Normal diff.
    -
    normalize(Revision) - Method in class com.linecorp.centraldogma.client.CentralDogmaRepository
    Converts the relative revision number to the absolute revision number. e.g.
    @@ -3554,12 +3537,6 @@

    P

    Returns a Markup from the specified value.
    -
    PATCH_TO_UPSERT - Enum constant in enum class com.linecorp.centraldogma.server.storage.repository.DiffResultType
    -
    - -
    path() - Element in annotation interface com.linecorp.centraldogma.client.updater.CentralDogmaBean
    The path of the file in Central Dogma.
    @@ -5781,10 +5758,6 @@

    V

    Returns the enum constant of this class with the specified name.
    -
    valueOf(String) - Static method in enum class com.linecorp.centraldogma.server.storage.repository.DiffResultType
    -
    -
    Returns the enum constant of this class with the specified name.
    -
    values() - Static method in enum class com.linecorp.centraldogma.common.ChangeType
    Returns an array containing the constants of this enum class, in @@ -5840,11 +5813,6 @@

    V

    Returns an array containing the constants of this enum class, in the order they are declared.
    -
    values() - Static method in enum class com.linecorp.centraldogma.server.storage.repository.DiffResultType
    -
    -
    Returns an array containing the constants of this enum class, in -the order they are declared.
    -

    W

    @@ -6033,10 +6001,6 @@

    W

    Returns a new Tokens which does not contain any secrets.
    -
    withoutSecret() - Method in interface com.linecorp.centraldogma.server.mirror.MirrorCredential
    -
    -
    Returns a new MirrorCredential that does not contain any sensitive information.
    -
    writable() - Method in class com.linecorp.centraldogma.server.command.CommandExecutorStatusManager
    Returns whether the CommandExecutorStatusManager.executor() is writable.
    diff --git a/apidocs/index.html b/apidocs/index.html index 3de8e9255f..f144c29614 100644 --- a/apidocs/index.html +++ b/apidocs/index.html @@ -2,7 +2,7 @@ -Overview (Central Dogma 0.68.0 API reference) +Overview (Central Dogma 0.67.3 API reference) @@ -48,7 +48,7 @@
    -

    Central Dogma 0.68.0 API reference

    +

    Central Dogma 0.67.3 API reference

    Packages
    diff --git a/apidocs/member-search-index.js b/apidocs/member-search-index.js index 5782e1e359..192dd2552c 100644 --- a/apidocs/member-search-index.js +++ b/apidocs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"AbstractAllOrEachExtension()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"AbstractArmeriaCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"AbstractCentralDogma(ScheduledExecutorService)","u":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"AbstractCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"AbstractCommandExecutor(Consumer, Consumer)","u":"%3Cinit%3E(java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AbstractPluginConfig","l":"AbstractPluginConfig(Boolean)","u":"%3Cinit%3E(java.lang.Boolean)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"accessLogFormat()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"accessLogFormat(String)","u":"accessLogFormat(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"accessToken()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"accessToken(String)","u":"accessToken(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"activateToken(Author, String)","u":"activateToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"activePort()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"activePorts()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"additionalProperties()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addMember(Author, String, User, ProjectRole)","u":"addMember(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addPerTokenPermission(Author, String, String, String, Collection)","u":"addPerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addPerUserPermission(Author, String, String, User, Collection)","u":"addPerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addRepo(Author, String, String)","u":"addRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addRepo(Author, String, String, PerRolePermissions)","u":"addRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addToken(Author, String, String, ProjectRole)","u":"addToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addToken(Author, String, Token, ProjectRole)","u":"addToken(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"ADMIN"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"administrators()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"administrators(Iterable)","u":"administrators(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"administrators(String...)","u":"administrators(java.lang.String...)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"after()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"after(ExtensionContext)","u":"after(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"after(ExtensionContext)","u":"after(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"afterAll(ExtensionContext)","u":"afterAll(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"afterEach(ExtensionContext)","u":"afterEach(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"ALL_PATH"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ALL_PERMISSION"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"ALL_REPLICAS"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"all()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"allowedOrigins()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"AllReplicasPlugin()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"anonymous()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"appId()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"appId()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"appIds()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"APPLY_JSON_PATCH"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"APPLY_TEXT_PATCH"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaCentralDogmaBuilder","l":"ArmeriaCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"asIs(CommitResult)","u":"asIs(com.linecorp.centraldogma.server.command.CommitResult)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"atJsonPointer(Watcher, String)","u":"atJsonPointer(com.linecorp.centraldogma.client.Watcher,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"authConfig()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"authConfig()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"AuthConfig(AuthProviderFactory, Set, boolean, String, long, String, JsonNode)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.auth.AuthProviderFactory,java.util.Set,boolean,java.lang.String,long,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"AuthConfig(String, Set, Boolean, String, Long, String, JsonNode)","u":"%3Cinit%3E(java.lang.String,java.util.Set,java.lang.Boolean,java.lang.String,java.lang.Long,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"author()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"author()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"author()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"Author(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"Author(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"authorizer()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"authProviderFactory(AuthProviderFactory)","u":"authProviderFactory(com.linecorp.centraldogma.server.auth.AuthProviderFactory)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"AuthProviderParameters(Authorizer, CentralDogmaConfig, Supplier, Function>, Function>)","u":"%3Cinit%3E(com.linecorp.armeria.server.auth.Authorizer,com.linecorp.centraldogma.server.CentralDogmaConfig,java.util.function.Supplier,java.util.function.Function,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"authProviderProperties(Object)","u":"authProviderProperties(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue(long, TimeUnit)","u":"awaitInitialValue(long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue(long, TimeUnit, T)","u":"awaitInitialValue(long,java.util.concurrent.TimeUnit,T)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"backoffOnFailure(long, long, double)","u":"backoffOnFailure(long,long,double)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"backward(int)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"baseRevision()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"before()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"before(ExtensionContext)","u":"before(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"before(ExtensionContext)","u":"before(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"beforeAll(ExtensionContext)","u":"beforeAll(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"beforeEach(ExtensionContext)","u":"beforeEach(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"bidirectional()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"blockingHttpClient()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"blockingTaskExecutor()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"blockingTaskExecutor(ScheduledExecutorService)","u":"blockingTaskExecutor(java.util.concurrent.ScheduledExecutorService)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaCentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroupBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","c":"LegacyCentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"builder(Watcher, EndpointListDecoder)","u":"builder(com.linecorp.centraldogma.client.Watcher,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_BASE_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_LOGIN_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_LOGOUT_PATH"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"cacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cacheSpec(String)","u":"cacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"caseSensitiveLoginNames()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"caseSensitiveLoginNames(boolean)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"CentralDogmaBeanConfig(String, String, String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder(CentralDogmaBean)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.updater.CentralDogmaBean)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder(CentralDogmaBeanConfig)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"CentralDogmaBeanFactory(CentralDogma, ObjectMapper)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.CentralDogma,com.fasterxml.jackson.databind.ObjectMapper)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"CentralDogmaBuilder(File)","u":"%3Cinit%3E(java.io.File)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientAutoConfiguration","l":"CentralDogmaClientAutoConfiguration()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"CentralDogmaExtension()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"CentralDogmaExtension(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"CentralDogmaRule()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"CentralDogmaRule(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"CentralDogmaSettings()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"changes()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"changes()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"client()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"client()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"clientAddressSources()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"clientAddressSources(Iterable)","u":"clientAddressSources(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"clientAddressSources(String...)","u":"clientAddressSources(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientConfigurator(ArmeriaClientConfigurator)","u":"clientConfigurator(com.linecorp.centraldogma.client.armeria.ArmeriaClientConfigurator)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientFactory()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientFactory(ClientFactory)","u":"clientFactory(com.linecorp.armeria.client.ClientFactory)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"clientPort()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"close()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"close()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"close(Supplier)","u":"close(java.util.function.Supplier)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"commandExecutor()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"CommandExecutorStatusManager(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"Commit(Revision, Author, long, String, String, Markup)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,long,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"Commit(Revision, Author, String, String, Markup)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, Change...)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, Iterable>)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, String, Markup, Change...)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, String, Markup, Iterable>, boolean)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"commit(String, Change...)","u":"commit(java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"commit(String, Iterable>)","u":"commit(java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"compareTo(Revision)","u":"compareTo(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"config()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"config()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"config()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"configType()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configure(CentralDogmaBuilder)","u":"configure(com.linecorp.centraldogma.server.CentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configure(CentralDogmaBuilder)","u":"configure(com.linecorp.centraldogma.server.CentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaClientConfigurator","l":"configure(ClientBuilder)","u":"configure(com.linecorp.armeria.client.ClientBuilder)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientFactoryConfigurator","l":"configure(ClientFactoryBuilder)","u":"configure(com.linecorp.armeria.client.ClientFactoryBuilder)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"DnsAddressEndpointGroupConfigurator","l":"configure(DnsAddressEndpointGroupBuilder)","u":"configure(com.linecorp.armeria.client.endpoint.dns.DnsAddressEndpointGroupBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureClient(ArmeriaCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.ArmeriaCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureClient(ArmeriaCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.ArmeriaCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureClient(LegacyCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.legacy.LegacyCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureClient(LegacyCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.legacy.LegacyCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureHttpClient(WebClientBuilder)","u":"configureHttpClient(com.linecorp.armeria.client.WebClientBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureHttpClient(WebClientBuilder)","u":"configureHttpClient(com.linecorp.armeria.client.WebClientBuilder)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsJson()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsJson(Class)","u":"contentAsJson(java.lang.Class)"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"contentType()"},{"p":"com.linecorp.centraldogma.server","c":"ConfigValueConverter","l":"convert(String, String)","u":"convert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"convertValue(String, String)","u":"convertValue(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cors(CorsConfig)","u":"cors(com.linecorp.centraldogma.server.CorsConfig)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cors(String...)","u":"cors(java.lang.String...)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"corsConfig()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"CorsConfig(Object, Integer)","u":"%3Cinit%3E(java.lang.Object,java.lang.Integer)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_SESSION"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"create(Session)","u":"create(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"create(String, Author)","u":"create(java.lang.String,com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"create(String, long, Author)","u":"create(java.lang.String,long,com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createProject(Author, String)","u":"createProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createProject(Long, Author, String)","u":"createProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"createProject(String)","u":"createProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"createPushCommand(MirrorCredential, Author, boolean)","u":"createPushCommand(com.linecorp.centraldogma.server.mirror.MirrorCredential,com.linecorp.centraldogma.common.Author,boolean)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"createPushCommand(MirrorDto, Author, boolean)","u":"createPushCommand(com.linecorp.centraldogma.internal.api.v1.MirrorDto,com.linecorp.centraldogma.common.Author,boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createRepository(Author, String, String)","u":"createRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createRepository(Long, Author, String, String)","u":"createRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"createRepository(String, String)","u":"createRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createSession(Session)","u":"createSession(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, boolean)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, String)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, String, boolean)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"creation()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"creationTime()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"creationTimeMillis()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"creationTimeMillis()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"credential()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"credential()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"credential(String)","u":"credential(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"credentials()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"dataDir()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"dataDir()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"deactivateToken(Author, String)","u":"deactivateToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"deactivation()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"decode(T)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"DEFAULT_MAX_COMMITS"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_CACHE_SPEC"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_TIMEOUT_MILLIS"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_VALIDATION_SCHEDULE"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"defaultValue()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"delayOnSuccess(Duration)","u":"delayOnSuccess(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"delayOnSuccessMillis(long)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"delegate()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"delegate()"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"delete(String)","u":"delete(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"deletion()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfigDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"destroyToken(Author, String)","u":"destroyToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"detail()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"detail()"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"detail(String, Markup)","u":"detail(java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Change...)","u":"diff(com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Iterable>)","u":"diff(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(PathPattern)","u":"diff(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Query)","u":"diff(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, Query)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, Query, DiffResultType)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,com.linecorp.centraldogma.server.storage.repository.DiffResultType)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, String)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, String, DiffResultType)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.server.storage.repository.DiffResultType)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(String)","u":"diff(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"direction()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"direction()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"DIRECTORY"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"dnsAddressEndpointGroupConfigurator(DnsAddressEndpointGroupConfigurator)","u":"dnsAddressEndpointGroupConfigurator(com.linecorp.centraldogma.client.armeria.DnsAddressEndpointGroupConfigurator)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"doCloseAsync(CompletableFuture)","u":"doCloseAsync(java.util.concurrent.CompletableFuture)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doExecute(Command)","u":"doExecute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doExecute(Command)","u":"doExecute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"dogma()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"dogma()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientAutoConfiguration","l":"dogmaClient(Environment, CentralDogmaSettings, Optional>, Optional, Optional)","u":"dogmaClient(org.springframework.core.env.Environment,com.linecorp.centraldogma.client.spring.CentralDogmaSettings,java.util.Optional,java.util.Optional,java.util.Optional)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doStart(Runnable, Runnable)","u":"doStart(java.lang.Runnable,java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doStart(Runnable, Runnable)","u":"doStart(java.lang.Runnable,java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doStop(Runnable)","u":"doStop(java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doStop(Runnable)","u":"doStop(java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"electionPort()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"email()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"email()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AbstractPluginConfig","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfig","l":"enabled()"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"encoded()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"endpointGroup()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"ensureOpen()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(EntryType, Revision, String)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.EntryType,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(Revision, String)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"executor()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"executor()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"exists(Revision, String)","u":"exists(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"exists(String)","u":"exists(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"exists(String)","u":"exists(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"expirationTime()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"expressions()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"expressions()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"factory()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"factoryClassName()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"FALLBACK"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"FETCH_CONTENT"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(PathPattern)","u":"file(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(Query)","u":"file(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(String)","u":"file(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"fileWatcher(String, String, Query, Function)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query, Function)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"fileWatcher(String, String, Query, Function, Executor)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query, Function, Executor)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ALL_WITH_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ALL_WITHOUT_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ONE_WITH_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ONE_WITHOUT_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"find(Revision, String)","u":"find(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"find(Revision, String, Map, ?>)","u":"find(com.linecorp.centraldogma.common.Revision,java.lang.String,java.util.Map)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"findBySecret(String)","u":"findBySecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"findBySecretOrDefault(String, Token)","u":"findBySecretOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"findLatestRevision(Revision, String)","u":"findLatestRevision(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"findLatestRevision(Revision, String, boolean)","u":"findLatestRevision(com.linecorp.centraldogma.common.Revision,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findPermissions(String, String, String)","u":"findPermissions(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findPermissions(String, String, User)","u":"findPermissions(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findRole(String, User)","u":"findRole(java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findTokenByAppId(String)","u":"findTokenByAppId(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findTokenBySecret(String)","u":"findTokenBySecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"findUserDn(LdapContextFactory, String)","u":"findUserDn(org.apache.shiro.realm.ldap.LdapContextFactory,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"FORCE_PUSH"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"forcePush(Command)","u":"forcePush(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"forConfig(File)","u":"forConfig(java.io.File)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"forRepo(String, String)","u":"forRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"forRepo(String, String)","u":"forRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"forward(int)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"ForwardingCommandExecutor(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"from()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"fromDirectory(Path, String)","u":"fromDirectory(java.nio.file.Path,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"fromFile(Path, String)","u":"fromFile(java.nio.file.Path,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"generateSessionId()"},{"p":"com.linecorp.centraldogma.client","c":"FileRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"MergeRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"PreviewDiffRequest","l":"get()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"get(Map, ?>)","u":"get(java.util.Map)"},{"p":"com.linecorp.centraldogma.client","c":"FileRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"MergeRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"PreviewDiffRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"get(Revision, Query)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"DiffFilesRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"DiffRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"HistoryRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"get(Revision, String)","u":"get(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class)","u":"get(T,java.lang.Class)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, CentralDogmaBeanConfig)","u":"get(T,java.lang.Class,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, CentralDogmaBeanConfig, long, TimeUnit)","u":"get(T,java.lang.Class,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer)","u":"get(T,java.lang.Class,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, CentralDogmaBeanConfig)","u":"get(T,java.lang.Class,java.util.function.Consumer,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, CentralDogmaBeanConfig, long, TimeUnit)","u":"get(T,java.lang.Class,java.util.function.Consumer,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, long, TimeUnit)","u":"get(T,java.lang.Class,java.util.function.Consumer,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, long, TimeUnit)","u":"get(T,java.lang.Class,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getAccessToken()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, PathPattern)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, Query)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getDiff(String, String, Revision, Revision, String)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, String)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiffs(String, String, Revision, Revision, String)","u":"getDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFile(String, String, Revision, Query)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getFile(String, String, Revision, String)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFile(String, String, Revision, String)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFiles(String, String, Revision, PathPattern)","u":"getFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFiles(String, String, Revision, String)","u":"getFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getHealthCheckIntervalMillis()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getHistory(String, String, Revision, Revision)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, PathPattern)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, PathPattern, int)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern,int)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, String)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getHosts()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getMaxNumRetriesOnReplicationLag()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getMember(String, User)","u":"getMember(java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"getMetadataService(ServiceRequestContext)","u":"getMetadataService(com.linecorp.armeria.server.ServiceRequestContext)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"getOrDefault(String, Token)","u":"getOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientFactoryConfigurator","l":"getOrder()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"getOrNull(Revision, Query)","u":"getOrNull(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"getOrNull(Revision, String)","u":"getOrNull(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getPreviewDiffs(String, String, Revision, Change...)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getPreviewDiffs(String, String, Revision, Change...)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getPreviewDiffs(String, String, Revision, Iterable>)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getProfile()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getProject(String)","u":"getProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getRepo(String, String)","u":"getRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getRetryIntervalOnReplicationLagMillis()"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"getSearchFilter()"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"getSearchTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getTokens()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getUseTls()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"gitignore()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"gitignore()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"gracefulShutdownTimeout()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"gracefulShutdownTimeout(GracefulShutdownTimeout)","u":"gracefulShutdownTimeout(com.linecorp.centraldogma.server.GracefulShutdownTimeout)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"GracefulShutdownTimeout(long, long)","u":"%3Cinit%3E(long,long)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"groupId()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"guessFromPath(String)","u":"guessFromPath(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"GUEST"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"guest()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"hasContent()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"HEAD"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"headRevision()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"healthCheckInterval(Duration)","u":"healthCheckInterval(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"healthCheckIntervalMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"history()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"history(PathPattern)","u":"history(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"history(Revision, Revision, String)","u":"history(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"history(Revision, Revision, String, int)","u":"history(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String,int)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"host()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"host(String)","u":"host(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"host(String, int)","u":"host(java.lang.String,int)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"hostnamePatterns()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"hosts()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"httpClient()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"httpClient()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Identifiable","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"id()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY_JSON"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY_TEXT"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"identity(String)","u":"identity(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"idleTimeout(Duration)","u":"idleTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"idleTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"idleTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ifHasContent(Consumer)","u":"ifHasContent(java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"INIT"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"init(PluginInitContext)","u":"init(com.linecorp.centraldogma.server.plugin.PluginInitContext)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"initializationTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initialize()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initialize(String)","u":"initialize(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initialize0(String)","u":"initialize0(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"initialValueFuture()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"INSTANCE"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"INTERNAL_PROJECT_DOGMA"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"internalProjectInitializer()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"InternalProjectInitializer(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"internalRepos()"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isActive()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"isAnonymous()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"isAscending()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"isCsrfTokenRequiredForThrift()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isDeleted()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"isEnabled(CentralDogmaConfig)","u":"isEnabled(com.linecorp.centraldogma.server.CentralDogmaConfig)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"isOptional()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"isRelative()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"isRelative()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"isReservedRepoName(String)","u":"isReservedRepoName(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isStopping()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"isUseTls()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"isValidSecret(String)","u":"isValidSecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"isWebAppEnabled()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"jGitRepository()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"jitterRate(double)"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"JSON"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"JSON"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"JSON_PATH"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"jsonPath()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"jsonPath()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"jsonPath(String)","u":"jsonPath(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyCertChainFile()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyCertChainInputStream()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyFile()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyInputStream()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyPassword()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latest()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"Latest(Revision, U)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,U)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latestValue()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latestValue(T)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"LEADER_ONLY"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","c":"LegacyCentralDogmaBuilder","l":"LegacyCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"legacyClient()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"legacyClient()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_ADMIN"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_USER"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"list()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"list()"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"list(Revision)","u":"list(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listFiles(String, String, Revision, PathPattern)","u":"listFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listFiles(String, String, Revision, String)","u":"listFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listProjects()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"listRemoved()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRemovedProjects()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRemovedRepositories(String)","u":"listRemovedRepositories(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRepositories(String)","u":"listRepositories(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"load(File)","u":"load(java.io.File)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"load(String)","u":"load(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"LOCAL_TO_REMOTE"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"localPath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"localPath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"localRepo()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"localRepo()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGIN_API_ROUTES"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGIN_PATH"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"login()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"login()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"loginApiService()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProvider","l":"loginApiService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"loginNameNormalizer()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"loginSessionPropagator()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGOUT_API_ROUTES"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGOUT_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"logoutApiService()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProvider","l":"logoutApiService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"logoutSessionPropagator()"},{"p":"com.linecorp.centraldogma.server","c":"Main","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"major()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"map(Function)","u":"map(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"mapperExecutor(Executor)","u":"mapperExecutor(java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"MARKDOWN"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"markForPurge(String)","u":"markForPurge(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"markup()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"markup()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"matches(URI)","u":"matches(java.net.URI)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"MAX_ENTRIES"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"MAX_MAX_COMMITS"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"maxAgeSeconds()"},{"p":"com.linecorp.centraldogma.client","c":"HistoryRequest","l":"maxCommits(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxFrameLength()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxFrameLength(int)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"maxLogCount()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"maxNumBytesPerMirror()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxNumConnections()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxNumConnections(int)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"maxNumFilesPerMirror()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"maxNumRetriesOnReplicationLag()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"maxNumRetriesOnReplicationLag(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxRemovedRepositoryAge(Duration)","u":"maxRemovedRepositoryAge(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxRemovedRepositoryAgeMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxRemovedRepositoryAgeMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"maybeNormalizeRevision(String, String, Revision)","u":"maybeNormalizeRevision(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"MEMBER"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"member()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(Author, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Author,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"member(String)","u":"member(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(String, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(User, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"memberOrDefault(String, Member)","u":"memberOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Member)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"members()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"merge(CentralDogmaBeanConfig)","u":"merge(com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(Iterable)","u":"merge(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(MergeQuery)","u":"merge(com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(MergeSource...)","u":"merge(com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"mergeFiles(Revision, MergeQuery)","u":"mergeFiles(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"mergeFiles(String, String, Revision, Iterable)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, Iterable)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, MergeQuery)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"mergeFiles(String, String, Revision, MergeSource...)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, MergeSource...)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"mergeSources()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"METADATA_JSON"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"MetadataService(ProjectManager, CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"metaRepo()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"meterRegistry()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"meterRegistry()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"meterRegistry(MeterRegistry)","u":"meterRegistry(io.micrometer.core.instrument.MeterRegistry)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationConfig","l":"method()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"method()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"minLogAgeMillis()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"minor()"},{"p":"com.linecorp.centraldogma.server","c":"MirroringService","l":"mirror()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"mirror(File, CommandExecutor, int, long)","u":"mirror(java.io.File,com.linecorp.centraldogma.server.command.CommandExecutor,int,long)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirror(String)","u":"mirror(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"MirrorContext(String, boolean, Cron, MirrorDirection, MirrorCredential, Repository, String, URI, String)","u":"%3Cinit%3E(java.lang.String,boolean,com.cronutils.model.Cron,com.linecorp.centraldogma.server.mirror.MirrorDirection,com.linecorp.centraldogma.server.mirror.MirrorCredential,com.linecorp.centraldogma.server.storage.repository.Repository,java.lang.String,java.net.URI,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"MirroringServicePluginConfig(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"MirroringServicePluginConfig(Boolean, Integer, Integer, Long)","u":"%3Cinit%3E(java.lang.Boolean,java.lang.Integer,java.lang.Integer,java.lang.Long)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirrors()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirrors(boolean)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"moreServices()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProvider","l":"moreServices()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"name()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"name()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"nameLowercased()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"newChild(Function)","u":"newChild(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"newChild(Function, Executor)","u":"newChild(java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"newClientBuilder(String, EndpointGroup, Consumer, String)","u":"newClientBuilder(java.lang.String,com.linecorp.armeria.client.endpoint.EndpointGroup,java.util.function.Consumer,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"newDecorator(MetadataService)","u":"newDecorator(com.linecorp.centraldogma.server.metadata.MetadataService)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorProvider","l":"newMirror(MirrorContext)","u":"newMirror(com.linecorp.centraldogma.server.mirror.MirrorContext)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"nextExecutionTime(ZonedDateTime)","u":"nextExecutionTime(java.time.ZonedDateTime)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"NO_PERMISSION"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"NONE"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationConfig","l":"NONE"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"DiffResultType","l":"NORMAL"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"normalize(Revision)","u":"normalize(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalize(Revision)","u":"normalize(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalizeNow(Revision)","u":"normalizeNow(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalizeNow(Revision, Revision)","u":"normalizeNow(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorUtil","l":"normalizePath(String)","u":"normalizePath(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"normalizeRevision(String, String, Revision)","u":"normalizeRevision(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"NORMALIZING_PUSH"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"numMirroringThreads()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"numRepositoryWorkers(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"numWorkers()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"numWorkers()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"numWorkers(int)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"of(Author)","u":"of(com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"of(boolean, boolean)","u":"of(boolean,boolean)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"of(CentralDogma, String, String, Query, EndpointListDecoder)","u":"of(com.linecorp.centraldogma.client.CentralDogma,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"of(Iterable)","u":"of(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"of(JsonNode)","u":"of(com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"of(QueryType, Iterable, Iterable)","u":"of(com.linecorp.centraldogma.common.QueryType,java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"of(QueryType, String, String...)","u":"of(com.linecorp.centraldogma.common.QueryType,java.lang.String,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"of(Revision, EntryType, T, Iterable)","u":"of(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.EntryType,T,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"of(Revision, EntryType, T, String...)","u":"of(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.EntryType,T,java.lang.String...)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"of(Revision, Iterable>)","u":"of(com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"of(Revision, String, EntryType, T)","u":"of(com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.EntryType,T)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"of(String)","u":"of(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"of(String...)","u":"of(java.lang.String...)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofDefault()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofDirectory(Revision, String)","u":"ofDirectory(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"ofEmail(String)","u":"ofEmail(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofInternal()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJson(Iterable)","u":"ofJson(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJson(MergeSource...)","u":"ofJson(com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofJson(Revision, String, JsonNode)","u":"ofJson(com.linecorp.centraldogma.common.Revision,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofJson(Revision, String, String)","u":"ofJson(com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJson(String)","u":"ofJson(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, JsonNode)","u":"ofJsonPatch(java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, JsonNode, JsonNode)","u":"ofJsonPatch(java.lang.String,com.fasterxml.jackson.databind.JsonNode,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, String)","u":"ofJsonPatch(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, String, String)","u":"ofJsonPatch(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJsonPath(Iterable, Iterable)","u":"ofJsonPath(java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJsonPath(Iterable, String...)","u":"ofJsonPath(java.lang.Iterable,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJsonPath(String, Iterable)","u":"ofJsonPath(java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJsonPath(String, String...)","u":"ofJsonPath(java.lang.String,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonUpsert(String, JsonNode)","u":"ofJsonUpsert(java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonUpsert(String, String)","u":"ofJsonUpsert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"ofOptional(String)","u":"ofOptional(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofPrivate()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofPublic()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofRemoval(String)","u":"ofRemoval(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofRename(String, String)","u":"ofRename(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"ofRequired(String)","u":"ofRequired(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofText(Revision, String, String)","u":"ofText(com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofText(String)","u":"ofText(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextPatch(String, String)","u":"ofTextPatch(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextPatch(String, String, String)","u":"ofTextPatch(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextUpsert(String, String)","u":"ofTextUpsert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"ofWatcher(Watcher, EndpointListDecoder)","u":"ofWatcher(com.linecorp.centraldogma.client.Watcher,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"onMainLane()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"OWNER"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"owner()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"parent()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"RepositoryManager","l":"parent()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"parse(String)","u":"parse(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"parse(String)","u":"parse(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"DiffResultType","l":"PATCH_TO_UPSERT"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"path()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"path()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"path(String)","u":"path(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"paths()"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"patternString()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"permitsPerSecond()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perRolePermissions()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"PerRolePermissions(Iterable, Iterable, Iterable, Iterable)","u":"%3Cinit%3E(java.lang.Iterable,java.lang.Iterable,java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perTokenPermissions()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perUserPermissions()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"PLAINTEXT"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfigDeserializer","l":"PluginConfigDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"pluginConfigMap()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"pluginConfigs()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"pluginConfigs(PluginConfig...)","u":"pluginConfigs(com.linecorp.centraldogma.server.plugin.PluginConfig...)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"PluginContext(CentralDogmaConfig, ProjectManager, CommandExecutor, MeterRegistry, ScheduledExecutorService, InternalProjectInitializer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.CentralDogmaConfig,com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor,io.micrometer.core.instrument.MeterRegistry,java.util.concurrent.ScheduledExecutorService,com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginInitContext","l":"PluginInitContext(CentralDogmaConfig, ProjectManager, CommandExecutor, MeterRegistry, ScheduledExecutorService, ServerBuilder, InternalProjectInitializer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.CentralDogmaConfig,com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor,io.micrometer.core.instrument.MeterRegistry,java.util.concurrent.ScheduledExecutorService,com.linecorp.armeria.server.ServerBuilder,com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"plugins(PluginTarget)","u":"plugins(com.linecorp.centraldogma.server.plugin.PluginTarget)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(InetSocketAddress, SessionProtocol)","u":"port(java.net.InetSocketAddress,com.linecorp.armeria.common.SessionProtocol)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(int, SessionProtocol)","u":"port(int,com.linecorp.armeria.common.SessionProtocol)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(ServerPort)","u":"port(com.linecorp.armeria.server.ServerPort)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"ports()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"previewDiff(Revision, Change...)","u":"previewDiff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"previewDiff(Revision, Iterable>)","u":"previewDiff(com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(ClassLoader, Iterable)","u":"profile(java.lang.ClassLoader,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(ClassLoader, String...)","u":"profile(java.lang.ClassLoader,java.lang.String...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(Iterable)","u":"profile(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(String...)","u":"profile(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profileResources(Iterable)","u":"profileResources(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profileResources(String...)","u":"profileResources(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"project()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"project()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"project(String)","u":"project(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"projectManager()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"projectManager()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"projectManager()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"projectManager()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"ProjectMetadata(String, Map, Map, Map, UserAndTimestamp, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,java.util.Map,java.util.Map,java.util.Map,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"properties()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"properties(Class)","u":"properties(java.lang.Class)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PURGE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PURGE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"purgeMarked()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeProject(Author, String)","u":"purgeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeProject(Long, Author, String)","u":"purgeProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"purgeProject(String)","u":"purgeProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"purgeRepo(Author, String, String)","u":"purgeRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeRepository(Author, String, String)","u":"purgeRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeRepository(Long, Author, String, String)","u":"purgeRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"purgeRepository(String, String)","u":"purgeRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"purgeToken(Author, String)","u":"purgeToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"purgeWorker()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PUSH"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"push()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Author, String, String, Revision, String, String, Markup, Change...)","u":"push(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Author, String, String, Revision, String, String, Markup, Iterable>)","u":"push(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Long, Author, String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Long, Author, String, String, Revision, String, String, Markup, Iterable>)","u":"push(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"push(Revision)","u":"push(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, String, Markup, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"PushResult(Revision, long)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,long)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"queryForAuthenticationInfo(AuthenticationToken, LdapContextFactory)","u":"queryForAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.realm.ldap.LdapContextFactory)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"quietPeriodMillis()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"quorumPort()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"QuotaConfig(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"rawSession()"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonDeserializer","l":"RawSessionJsonDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonSerializer","l":"RawSessionJsonSerializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"READ"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"READ_ONLY"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"READ_ONLY"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"READ_WRITE"},{"p":"com.linecorp.centraldogma.common","c":"ReadOnlyException","l":"ReadOnlyException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"REMOTE_TO_LOCAL"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remoteBranch()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remotePath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remoteRepoUri()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"remoteUri()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"removal()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"removal()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"REMOVE"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_NAMED_QUERY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_PLUGIN"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_SESSION"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"remove(String)","u":"remove(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeMember(Author, String, User)","u":"removeMember(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removePerTokenPermission(Author, String, String, String)","u":"removePerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removePerUserPermission(Author, String, String, User)","u":"removePerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeProject(Author, String)","u":"removeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeProject(Author, String)","u":"removeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeProject(Long, Author, String)","u":"removeProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"removeProject(String)","u":"removeProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeRepo(Author, String, String)","u":"removeRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeRepository(Author, String, String)","u":"removeRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeRepository(Long, Author, String, String)","u":"removeRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"removeRepository(String, String)","u":"removeRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeSession(String)","u":"removeSession(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeToken(Author, String, String)","u":"removeToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeToken(Author, String, Token)","u":"removeToken(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"RENAME"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"replicating()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"replicating()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"REPLICATION_ONLY"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"replication(ReplicationConfig)","u":"replication(com.linecorp.centraldogma.server.ReplicationConfig)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"replicationConfig()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"REPO_DOGMA"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"REPO_META"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"repo(String)","u":"repo(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"repos()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"repos()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"repository()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"repository()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"repository(String)","u":"repository(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"repositoryCacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"repositoryCacheSpec(String)","u":"repositoryCacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"RepositoryInfo(String, Revision)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"RepositoryMetadata(String, PerRolePermissions, Map>, Map>, UserAndTimestamp, UserAndTimestamp, QuotaConfig)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions,java.util.Map,java.util.Map,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"RepositoryMetadata(String, UserAndTimestamp, PerRolePermissions)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"repositoryWatcher(String, String, String, Function)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String, Function)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"repositoryWatcher(String, String, String, Function, Executor)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String, Function, Executor)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"requestQuota()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"requestTimeout(Duration)","u":"requestTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"requestTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"requestTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"restoreProject(Author, String)","u":"restoreProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"restoreRepo(Author, String, String)","u":"restoreRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"resultType()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLag(Duration)","u":"retryIntervalOnReplicationLag(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLagMillis()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLagMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"revision()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(int)","u":"%3Cinit%3E(int)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonDeserializer","l":"RevisionJsonDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonSerializer","l":"RevisionJsonSerializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(Revision)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"RevisionRange(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"RevisionRange(Revision, Revision)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"role()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"role()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"roles()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"runForEachTest()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProviderFactory","l":"SamlAuthProviderFactory()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"SAVE_NAMED_QUERY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"SAVE_PLUGIN"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"scaffold(CentralDogma)","u":"scaffold(com.linecorp.centraldogma.client.CentralDogma)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"scaffold(CentralDogma)","u":"scaffold(com.linecorp.centraldogma.client.CentralDogma)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"schedule()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"schedule()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_DOGMA"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_FILE"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_HTTP"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_HTTPS"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_SSH"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"SearchFirstActiveDirectoryRealm()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"secret()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"secret()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"secrets()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"selectedProfile()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroupBuilder","l":"selectionStrategy(EndpointSelectionStrategy)","u":"selectionStrategy(com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"self()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"sequentialExecutor()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonSerializer","l":"serialize(Revision, JsonGenerator, SerializerProvider)","u":"serialize(com.linecorp.centraldogma.common.Revision,com.fasterxml.jackson.core.JsonGenerator,com.fasterxml.jackson.databind.SerializerProvider)"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonSerializer","l":"serialize(Serializable, JsonGenerator, SerializerProvider)","u":"serialize(java.io.Serializable,com.fasterxml.jackson.core.JsonGenerator,com.fasterxml.jackson.databind.SerializerProvider)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"serve(ServiceRequestContext, HttpRequest)","u":"serve(com.linecorp.armeria.server.ServiceRequestContext,com.linecorp.armeria.common.HttpRequest)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"serverAddress()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"serverAddress()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginInitContext","l":"serverBuilder()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"serverConfig()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"serverId()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"servers()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"serverStatus()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"serverStatus()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"ServerStatusManager(File)","u":"%3Cinit%3E(java.io.File)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"session()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"Session(String, String, Duration)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.time.Duration)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"Session(String, String, Instant, Instant, Serializable)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.time.Instant,java.time.Instant,java.io.Serializable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionCacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionCacheSpec(String)","u":"sessionCacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"sessionId()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"sessionIdGenerator()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionTimeout(Duration)","u":"sessionTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionValidationSchedule()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionValidationSchedule(String)","u":"sessionValidationSchedule(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setAccessToken(String)","u":"setAccessToken(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setHealthCheckIntervalMillis(long)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setHosts(List)","u":"setHosts(java.util.List)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setInitializationTimeoutMillis(Long)","u":"setInitializationTimeoutMillis(java.lang.Long)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setMaxNumRetriesOnReplicationLag(Integer)","u":"setMaxNumRetriesOnReplicationLag(java.lang.Integer)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setProfile(String)","u":"setProfile(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"setReplicating(boolean)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setRetryIntervalOnReplicationLagMillis(Long)","u":"setRetryIntervalOnReplicationLagMillis(java.lang.Long)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"setSearchFilter(String)","u":"setSearchFilter(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"setSearchTimeoutMillis(int)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setUseTls(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"ShiroAuthProviderFactory()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"ShiroAuthProviderFactory(Function)","u":"%3Cinit%3E(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"StandaloneCommandExecutor(ProjectManager, Executor, ServerStatusManager, SessionManager, Consumer, Consumer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,java.util.concurrent.Executor,com.linecorp.centraldogma.server.management.ServerStatusManager,com.linecorp.centraldogma.server.auth.SessionManager,java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"StandaloneCommandExecutor(ProjectManager, Executor, ServerStatusManager, SessionManager, QuotaConfig, Consumer, Consumer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,java.util.concurrent.Executor,com.linecorp.centraldogma.server.management.ServerStatusManager,com.linecorp.centraldogma.server.auth.SessionManager,com.linecorp.centraldogma.server.QuotaConfig,java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"start()"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"start()"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"start()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"start()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"start()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"start(PluginContext)","u":"start(com.linecorp.centraldogma.server.plugin.PluginContext)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"start(Revision)","u":"start(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"start(Revision)","u":"start(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"startAsync()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"startAsync()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"stop()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"stop()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"stop(PluginContext)","u":"stop(com.linecorp.centraldogma.server.plugin.PluginContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"stopAsync()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"stopAsync()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"summary()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"summary()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"supportedEntryTypes()"},{"p":"com.linecorp.centraldogma.server","c":"ConfigValueConverter","l":"supportedPrefixes()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"SYSTEM"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"target()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"target()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"TEXT"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"TEXT"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"text()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"timeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"timeoutMillis()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"timestampMillis()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"timeWindowSeconds()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"tls()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"tls(TlsConfig)","u":"tls(com.linecorp.centraldogma.server.TlsConfig)"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"TlsConfig(File, File, String, String, String)","u":"%3Cinit%3E(java.io.File,java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"to()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toAscending()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toDescending()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"TOKEN_JSON"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"token()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"Token(String, String, boolean, UserAndTimestamp, UserAndTimestamp, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,java.lang.String,boolean,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"TokenRegistration(String, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"tokens()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"Tokens()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"Tokens(Map, Map)","u":"%3Cinit%3E(java.util.Map,java.util.Map)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, String, double)","u":"%3Cinit%3E(java.lang.String,java.lang.String,double)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"toString()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"toString()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toString()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"toString()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"toString()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"trustedProxyAddresses()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"trustedProxyAddresses(Iterable)","u":"trustedProxyAddresses(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"trustedProxyAddresses(String...)","u":"trustedProxyAddresses(java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"UNKNOWN"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"UNKNOWN"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UNREMOVE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UNREMOVE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"unremove(String)","u":"unremove(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveProject(Author, String)","u":"unremoveProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveProject(Long, Author, String)","u":"unremoveProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"unremoveProject(String)","u":"unremoveProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveRepository(Author, String, String)","u":"unremoveRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveRepository(Long, Author, String, String)","u":"unremoveRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"unremoveRepository(String, String)","u":"unremoveRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UPDATE_SERVER_STATUS"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"update(Session)","u":"update(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateMemberRole(Author, String, User, ProjectRole)","u":"updateMemberRole(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerRolePermissions(Author, String, String, PerRolePermissions)","u":"updatePerRolePermissions(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerTokenPermission(Author, String, String, String, Collection)","u":"updatePerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerUserPermission(Author, String, String, User, Collection)","u":"updatePerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"updateServerStatus(ServerStatus)","u":"updateServerStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"UpdateServerStatusCommand(Long, Author, ServerStatus)","u":"%3Cinit%3E(java.lang.Long,com.linecorp.centraldogma.common.Author,com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"updateStatus(ServerStatus)","u":"updateStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"updateStatus(ServerStatus)","u":"updateStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"updateStatus(UpdateServerStatusCommand)","u":"updateStatus(com.linecorp.centraldogma.server.command.UpdateServerStatusCommand)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateTokenRole(Author, String, Token, ProjectRole)","u":"updateTokenRole(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateWriteQuota(Author, String, String, QuotaConfig)","u":"updateWriteQuota(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"UPSERT_JSON"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"UPSERT_TEXT"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"uri(String)","u":"uri(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"user()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String, List)","u":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String, String, String, List)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.util.List)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"UserAndTimestamp(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"UserAndTimestamp(String, Instant)","u":"%3Cinit%3E(java.lang.String,java.time.Instant)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"username()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"UserWithToken(String, Token)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"useTls()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"useTls()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"useTls()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"useTls(boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"validateSecret(String)","u":"validateSecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"value()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"DiffResultType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"values()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"values()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"values()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"values()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"values()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"values()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"values()"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"values()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"DiffResultType","l":"values()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(BiConsumer)","u":"watch(java.util.function.BiConsumer)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(BiConsumer, Executor)","u":"watch(java.util.function.BiConsumer,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(Consumer)","u":"watch(java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(Consumer, Executor)","u":"watch(java.util.function.Consumer,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(PathPattern)","u":"watch(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(Query)","u":"watch(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, Query)","u":"watch(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, Query, boolean)","u":"watch(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,boolean)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, String)","u":"watch(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, String, boolean)","u":"watch(com.linecorp.centraldogma.common.Revision,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(String)","u":"watch(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watcher(PathPattern)","u":"watcher(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watcher(Query)","u":"watcher(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query, long)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,long)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query, long, boolean)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,long,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, PathPattern, long, boolean)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern,long,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, String)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, String, long)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,long)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watchScheduler()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"webAppEnabled(boolean)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"webAppTitle()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"webAppTitle(String)","u":"webAppTitle(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"webLoginService()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProvider","l":"webLoginService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"webLogoutService()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"weight()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"when()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"when()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"whenAsText()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"whenAsText()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"whenEndpointReady()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"whenInitialized()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"withoutSecret()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"withoutSecret()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"withoutSecret()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"WRITABLE"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"writable()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"writable()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"WRITE"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"writeQuota()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"writeQuotaPerRepository()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"writeQuotaPerRepository(int, int)","u":"writeQuotaPerRepository(int,int)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"ZOOKEEPER"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"ZooKeeperReplicationConfig(int, Map)","u":"%3Cinit%3E(int,java.util.Map)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"ZooKeeperServerConfig(String, int, int, Integer, Integer, Integer)","u":"%3Cinit%3E(java.lang.String,int,int,java.lang.Integer,java.lang.Integer,java.lang.Integer)"}];updateSearchResults(); \ No newline at end of file +memberSearchIndex = [{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"AbstractAllOrEachExtension()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"AbstractArmeriaCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"AbstractCentralDogma(ScheduledExecutorService)","u":"%3Cinit%3E(java.util.concurrent.ScheduledExecutorService)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"AbstractCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"AbstractCommandExecutor(Consumer, Consumer)","u":"%3Cinit%3E(java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AbstractPluginConfig","l":"AbstractPluginConfig(Boolean)","u":"%3Cinit%3E(java.lang.Boolean)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"accessLogFormat()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"accessLogFormat(String)","u":"accessLogFormat(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"accessToken()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"accessToken(String)","u":"accessToken(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"activateToken(Author, String)","u":"activateToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"activePort()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"activePorts()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"additionalProperties()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addMember(Author, String, User, ProjectRole)","u":"addMember(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addPerTokenPermission(Author, String, String, String, Collection)","u":"addPerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addPerUserPermission(Author, String, String, User, Collection)","u":"addPerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addRepo(Author, String, String)","u":"addRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addRepo(Author, String, String, PerRolePermissions)","u":"addRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addToken(Author, String, String, ProjectRole)","u":"addToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"addToken(Author, String, Token, ProjectRole)","u":"addToken(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"ADMIN"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"administrators()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"administrators(Iterable)","u":"administrators(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"administrators(String...)","u":"administrators(java.lang.String...)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"after()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"after(ExtensionContext)","u":"after(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"after(ExtensionContext)","u":"after(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"afterAll(ExtensionContext)","u":"afterAll(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"afterEach(ExtensionContext)","u":"afterEach(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"ALL_PATH"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ALL_PERMISSION"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"ALL_REPLICAS"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"all()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"allowedOrigins()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"AllReplicasPlugin()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"anonymous()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"appId()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"appId()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"appIds()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"APPLY_JSON_PATCH"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"APPLY_TEXT_PATCH"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaCentralDogmaBuilder","l":"ArmeriaCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"asIs(CommitResult)","u":"asIs(com.linecorp.centraldogma.server.command.CommitResult)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"atJsonPointer(Watcher, String)","u":"atJsonPointer(com.linecorp.centraldogma.client.Watcher,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"authConfig()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"authConfig()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"AuthConfig(AuthProviderFactory, Set, boolean, String, long, String, JsonNode)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.auth.AuthProviderFactory,java.util.Set,boolean,java.lang.String,long,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"AuthConfig(String, Set, Boolean, String, Long, String, JsonNode)","u":"%3Cinit%3E(java.lang.String,java.util.Set,java.lang.Boolean,java.lang.String,java.lang.Long,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthException","l":"AuthException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"author()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"author()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"author()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"author()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"Author(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"Author(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"AuthorizationException","l":"AuthorizationException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"authorizer()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"authProviderFactory(AuthProviderFactory)","u":"authProviderFactory(com.linecorp.centraldogma.server.auth.AuthProviderFactory)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"AuthProviderParameters(Authorizer, CentralDogmaConfig, Supplier, Function>, Function>)","u":"%3Cinit%3E(com.linecorp.armeria.server.auth.Authorizer,com.linecorp.centraldogma.server.CentralDogmaConfig,java.util.function.Supplier,java.util.function.Function,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"authProviderProperties(Object)","u":"authProviderProperties(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue(long, TimeUnit)","u":"awaitInitialValue(long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"awaitInitialValue(long, TimeUnit, T)","u":"awaitInitialValue(long,java.util.concurrent.TimeUnit,T)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"backoffOnFailure(long, long, double)","u":"backoffOnFailure(long,long,double)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"backward(int)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"baseRevision()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"before()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"before(ExtensionContext)","u":"before(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"before(ExtensionContext)","u":"before(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"beforeAll(ExtensionContext)","u":"beforeAll(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"beforeEach(ExtensionContext)","u":"beforeEach(org.junit.jupiter.api.extension.ExtensionContext)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"bidirectional()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"blockingHttpClient()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"blockingTaskExecutor()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"blockingTaskExecutor(ScheduledExecutorService)","u":"blockingTaskExecutor(java.util.concurrent.ScheduledExecutorService)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaCentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroupBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","c":"LegacyCentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"build()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"builder(Watcher, EndpointListDecoder)","u":"builder(com.linecorp.centraldogma.client.Watcher,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_BASE_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_LOGIN_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"BUILTIN_WEB_LOGOUT_PATH"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"cacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cacheSpec(String)","u":"cacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"caseSensitiveLoginNames()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"caseSensitiveLoginNames(boolean)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"CentralDogmaBeanConfig(String, String, String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder(CentralDogmaBean)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.updater.CentralDogmaBean)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"CentralDogmaBeanConfigBuilder(CentralDogmaBeanConfig)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"CentralDogmaBeanFactory(CentralDogma, ObjectMapper)","u":"%3Cinit%3E(com.linecorp.centraldogma.client.CentralDogma,com.fasterxml.jackson.databind.ObjectMapper)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"CentralDogmaBuilder(File)","u":"%3Cinit%3E(java.io.File)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientAutoConfiguration","l":"CentralDogmaClientAutoConfiguration()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"CentralDogmaException","l":"CentralDogmaException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"CentralDogmaExtension()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"CentralDogmaExtension(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"CentralDogmaRule()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"CentralDogmaRule(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"CentralDogmaSettings()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeConflictException","l":"ChangeConflictException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeFormatException","l":"ChangeFormatException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"changes()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"changes()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"client()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"client()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"clientAddressSources()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"clientAddressSources(Iterable)","u":"clientAddressSources(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"clientAddressSources(String...)","u":"clientAddressSources(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientConfigurator(ArmeriaClientConfigurator)","u":"clientConfigurator(com.linecorp.centraldogma.client.armeria.ArmeriaClientConfigurator)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientFactory()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"clientFactory(ClientFactory)","u":"clientFactory(com.linecorp.armeria.client.ClientFactory)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"clientPort()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"close()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"close()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"close(Supplier)","u":"close(java.util.function.Supplier)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"commandExecutor()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"CommandExecutorStatusManager(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"Commit(Revision, Author, long, String, String, Markup)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,long,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"Commit(Revision, Author, String, String, Markup)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, Change...)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, Iterable>)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, String, Markup, Change...)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"commit(Revision, long, Author, String, String, Markup, Iterable>, boolean)","u":"commit(com.linecorp.centraldogma.common.Revision,long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"commit(String, Change...)","u":"commit(java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"commit(String, Iterable>)","u":"commit(java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"compareTo(Revision)","u":"compareTo(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"config()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"config()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"config()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"configType()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configure(CentralDogmaBuilder)","u":"configure(com.linecorp.centraldogma.server.CentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configure(CentralDogmaBuilder)","u":"configure(com.linecorp.centraldogma.server.CentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"ArmeriaClientConfigurator","l":"configure(ClientBuilder)","u":"configure(com.linecorp.armeria.client.ClientBuilder)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientFactoryConfigurator","l":"configure(ClientFactoryBuilder)","u":"configure(com.linecorp.armeria.client.ClientFactoryBuilder)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"DnsAddressEndpointGroupConfigurator","l":"configure(DnsAddressEndpointGroupBuilder)","u":"configure(com.linecorp.armeria.client.endpoint.dns.DnsAddressEndpointGroupBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureClient(ArmeriaCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.ArmeriaCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureClient(ArmeriaCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.ArmeriaCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureClient(LegacyCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.legacy.LegacyCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureClient(LegacyCentralDogmaBuilder)","u":"configureClient(com.linecorp.centraldogma.client.armeria.legacy.LegacyCentralDogmaBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"configureHttpClient(WebClientBuilder)","u":"configureHttpClient(com.linecorp.armeria.client.WebClientBuilder)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"configureHttpClient(WebClientBuilder)","u":"configureHttpClient(com.linecorp.armeria.client.WebClientBuilder)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"content()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsJson()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsJson(Class)","u":"contentAsJson(java.lang.Class)"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"contentAsPrettyText()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"contentAsText()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"contentType()"},{"p":"com.linecorp.centraldogma.server","c":"ConfigValueConverter","l":"convert(String, String)","u":"convert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"convertValue(String, String)","u":"convertValue(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cors(CorsConfig)","u":"cors(com.linecorp.centraldogma.server.CorsConfig)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"cors(String...)","u":"cors(java.lang.String...)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"corsConfig()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"CorsConfig(Object, Integer)","u":"%3Cinit%3E(java.lang.Object,java.lang.Integer)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"CREATE_SESSION"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"create(AuthProviderParameters)","u":"create(com.linecorp.centraldogma.server.auth.AuthProviderParameters)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"create(Session)","u":"create(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"create(String, Author)","u":"create(java.lang.String,com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"create(String, long, Author)","u":"create(java.lang.String,long,com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createProject(Author, String)","u":"createProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createProject(Long, Author, String)","u":"createProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"createProject(String)","u":"createProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"createPushCommand(MirrorCredential, Author, boolean)","u":"createPushCommand(com.linecorp.centraldogma.server.mirror.MirrorCredential,com.linecorp.centraldogma.common.Author,boolean)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"createPushCommand(MirrorDto, Author, boolean)","u":"createPushCommand(com.linecorp.centraldogma.internal.api.v1.MirrorDto,com.linecorp.centraldogma.common.Author,boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createRepository(Author, String, String)","u":"createRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createRepository(Long, Author, String, String)","u":"createRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"createRepository(String, String)","u":"createRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"createSession(Session)","u":"createSession(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, boolean)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, String)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"createToken(Author, String, String, boolean)","u":"createToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"creation()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"creation()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"creationTime()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"creationTimeMillis()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"creationTimeMillis()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"credential()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"credential()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"credential(String)","u":"credential(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"credentials()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"dataDir()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"dataDir()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"deactivateToken(Author, String)","u":"deactivateToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"deactivation()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"decode(T)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"DEFAULT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"DEFAULT_MAX_COMMITS"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_CACHE_SPEC"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_TIMEOUT_MILLIS"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"DEFAULT_SESSION_VALIDATION_SCHEDULE"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"defaultValue()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"delayOnSuccess(Duration)","u":"delayOnSuccess(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"delayOnSuccessMillis(long)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"delegate()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"delegate()"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"delete(String)","u":"delete(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"deletion()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfigDeserializer","l":"deserialize(JsonParser, DeserializationContext)","u":"deserialize(com.fasterxml.jackson.core.JsonParser,com.fasterxml.jackson.databind.DeserializationContext)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"destroyToken(Author, String)","u":"destroyToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"detail()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"detail()"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"detail(String, Markup)","u":"detail(java.lang.String,com.linecorp.centraldogma.common.Markup)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Change...)","u":"diff(com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Iterable>)","u":"diff(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(PathPattern)","u":"diff(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(Query)","u":"diff(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, Query)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"diff(Revision, Revision, String)","u":"diff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"diff(String)","u":"diff(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"direction()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"direction()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"DIRECTORY"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"dnsAddressEndpointGroupConfigurator(DnsAddressEndpointGroupConfigurator)","u":"dnsAddressEndpointGroupConfigurator(com.linecorp.centraldogma.client.armeria.DnsAddressEndpointGroupConfigurator)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"doCloseAsync(CompletableFuture)","u":"doCloseAsync(java.util.concurrent.CompletableFuture)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doExecute(Command)","u":"doExecute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doExecute(Command)","u":"doExecute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"dogma()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"dogma()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientAutoConfiguration","l":"dogmaClient(Environment, CentralDogmaSettings, Optional>, Optional, Optional)","u":"dogmaClient(org.springframework.core.env.Environment,com.linecorp.centraldogma.client.spring.CentralDogmaSettings,java.util.Optional,java.util.Optional,java.util.Optional)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doStart(Runnable, Runnable)","u":"doStart(java.lang.Runnable,java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doStart(Runnable, Runnable)","u":"doStart(java.lang.Runnable,java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"doStop(Runnable)","u":"doStop(java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"doStop(Runnable)","u":"doStop(java.lang.Runnable)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"electionPort()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"email()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"email()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AbstractPluginConfig","l":"enabled()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfig","l":"enabled()"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"encoded()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"endpointGroup()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"ensureOpen()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(EntryType, Revision, String)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.EntryType,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNoContentException","l":"EntryNoContentException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(Revision, String)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"EntryNotFoundException","l":"EntryNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"errorOnEntryNotFound(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"execute(Command)","u":"execute(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"executionPath()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"executor()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"executor()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"exists(Revision, String)","u":"exists(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"exists(String)","u":"exists(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"exists(String)","u":"exists(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"expirationTime()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"expressions()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"expressions()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"factory()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"factoryClassName()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"FALLBACK"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"FETCH_CONTENT"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(PathPattern)","u":"file(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(Query)","u":"file(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"file(String)","u":"file(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"fileWatcher(String, String, Query, Function)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query, Function)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"fileWatcher(String, String, Query, Function, Executor)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"fileWatcher(String, String, Query, Function, Executor)","u":"fileWatcher(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ALL_WITH_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ALL_WITHOUT_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ONE_WITH_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOptions","l":"FIND_ONE_WITHOUT_CONTENT"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"find(Revision, String)","u":"find(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"find(Revision, String, Map, ?>)","u":"find(com.linecorp.centraldogma.common.Revision,java.lang.String,java.util.Map)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"findBySecret(String)","u":"findBySecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"findBySecretOrDefault(String, Token)","u":"findBySecretOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"findLatestRevision(Revision, String)","u":"findLatestRevision(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"findLatestRevision(Revision, String, boolean)","u":"findLatestRevision(com.linecorp.centraldogma.common.Revision,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findPermissions(String, String, String)","u":"findPermissions(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findPermissions(String, String, User)","u":"findPermissions(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findRole(String, User)","u":"findRole(java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findTokenByAppId(String)","u":"findTokenByAppId(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"findTokenBySecret(String)","u":"findTokenBySecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"findUserDn(LdapContextFactory, String)","u":"findUserDn(org.apache.shiro.realm.ldap.LdapContextFactory,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"FORCE_PUSH"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"forcePush(Command)","u":"forcePush(com.linecorp.centraldogma.server.command.Command)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"forConfig(File)","u":"forConfig(java.io.File)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"forRepo(String, String)","u":"forRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"forRepo(String, String)","u":"forRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"forward(int)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"ForwardingCommandExecutor(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"from()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"fromDirectory(Path, String)","u":"fromDirectory(java.nio.file.Path,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"fromFile(Path, String)","u":"fromFile(java.nio.file.Path,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"generateSessionId()"},{"p":"com.linecorp.centraldogma.client","c":"FileRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"MergeRequest","l":"get()"},{"p":"com.linecorp.centraldogma.client","c":"PreviewDiffRequest","l":"get()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"get(Map, ?>)","u":"get(java.util.Map)"},{"p":"com.linecorp.centraldogma.client","c":"FileRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"MergeRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"PreviewDiffRequest","l":"get(Revision)","u":"get(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"get(Revision, Query)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"DiffFilesRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"DiffRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"HistoryRequest","l":"get(Revision, Revision)","u":"get(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"get(Revision, String)","u":"get(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"get(String)","u":"get(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class)","u":"get(T,java.lang.Class)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, CentralDogmaBeanConfig)","u":"get(T,java.lang.Class,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, CentralDogmaBeanConfig, long, TimeUnit)","u":"get(T,java.lang.Class,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer)","u":"get(T,java.lang.Class,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, CentralDogmaBeanConfig)","u":"get(T,java.lang.Class,java.util.function.Consumer,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, CentralDogmaBeanConfig, long, TimeUnit)","u":"get(T,java.lang.Class,java.util.function.Consumer,com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, Consumer, long, TimeUnit)","u":"get(T,java.lang.Class,java.util.function.Consumer,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanFactory","l":"get(T, Class, long, TimeUnit)","u":"get(T,java.lang.Class,long,java.util.concurrent.TimeUnit)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getAccessToken()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, PathPattern)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, Query)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getDiff(String, String, Revision, Revision, String)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiff(String, String, Revision, Revision, String)","u":"getDiff(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getDiffs(String, String, Revision, Revision, String)","u":"getDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFile(String, String, Revision, Query)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getFile(String, String, Revision, String)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFile(String, String, Revision, String)","u":"getFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFiles(String, String, Revision, PathPattern)","u":"getFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getFiles(String, String, Revision, String)","u":"getFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getHealthCheckIntervalMillis()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getHistory(String, String, Revision, Revision)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, PathPattern)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, PathPattern, int)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern,int)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getHistory(String, String, Revision, Revision, String)","u":"getHistory(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getHosts()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getMaxNumRetriesOnReplicationLag()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getMember(String, User)","u":"getMember(java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"getMetadataService(ServiceRequestContext)","u":"getMetadataService(com.linecorp.armeria.server.ServiceRequestContext)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"getOrDefault(String, Token)","u":"getOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaClientFactoryConfigurator","l":"getOrder()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"getOrNull(Revision, Query)","u":"getOrNull(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"getOrNull(Revision, String)","u":"getOrNull(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"getPreviewDiffs(String, String, Revision, Change...)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getPreviewDiffs(String, String, Revision, Change...)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"getPreviewDiffs(String, String, Revision, Iterable>)","u":"getPreviewDiffs(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getProfile()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getProject(String)","u":"getProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getRepo(String, String)","u":"getRepo(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getRetryIntervalOnReplicationLagMillis()"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"getSearchFilter()"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"getSearchTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"getTokens()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"getUseTls()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"gitignore()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"gitignore()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"gracefulShutdownTimeout()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"gracefulShutdownTimeout(GracefulShutdownTimeout)","u":"gracefulShutdownTimeout(com.linecorp.centraldogma.server.GracefulShutdownTimeout)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"GracefulShutdownTimeout(long, long)","u":"%3Cinit%3E(long,long)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"groupId()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"guessFromPath(String)","u":"guessFromPath(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"GUEST"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"guest()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"hasContent()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"hashCode()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"hashCode()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"HEAD"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"headRevision()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"healthCheckInterval(Duration)","u":"healthCheckInterval(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"healthCheckIntervalMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"history()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"history(PathPattern)","u":"history(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"history(Revision, Revision, String)","u":"history(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"history(Revision, Revision, String, int)","u":"history(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision,java.lang.String,int)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"host()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"host(String)","u":"host(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"host(String, int)","u":"host(java.lang.String,int)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"hostnamePatterns()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"hosts()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"httpClient()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"httpClient()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Identifiable","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"id()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"id()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"id()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY_JSON"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"IDENTITY_TEXT"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"identity(String)","u":"identity(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"idleTimeout(Duration)","u":"idleTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"idleTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"idleTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ifHasContent(Consumer)","u":"ifHasContent(java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"INIT"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"init(PluginInitContext)","u":"init(com.linecorp.centraldogma.server.plugin.PluginInitContext)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"initializationTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initialize()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initialize0()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"initializeInternalRepos(List)","u":"initializeInternalRepos(java.util.List)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"initialValueFuture()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"INSTANCE"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"INTERNAL_PROJECT_DOGMA"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"internalProjectInitializer()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"InternalProjectInitializer(CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"internalRepos()"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"InvalidPushException","l":"InvalidPushException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isActive()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"isAdmin()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"isAnonymous()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"isAscending()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"isCsrfTokenRequiredForThrift()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"isDeleted()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"isEnabled(CentralDogmaConfig)","u":"isEnabled(com.linecorp.centraldogma.server.CentralDogmaConfig)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"isOptional()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"isRelative()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"isRelative()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"isReservedRepoName(String)","u":"isReservedRepoName(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"isStarted()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isStopping()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"isUseTls()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"isValidSecret(String)","u":"isValidSecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"isWebAppEnabled()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"isWritable()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"jGitRepository()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"jitterRate(double)"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"JSON"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"JSON"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"JSON_PATH"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"jsonPath()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"jsonPath()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"jsonPath(String)","u":"jsonPath(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyCertChainFile()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyCertChainInputStream()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyFile()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyInputStream()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"keyPassword()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latest()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"Latest(Revision, U)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,U)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latestValue()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"latestValue(T)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"LEADER_ONLY"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","c":"LegacyCentralDogmaBuilder","l":"LegacyCentralDogmaBuilder()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"legacyClient()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"legacyClient()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_ADMIN"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_ANONYMOUS"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"LEVEL_USER"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"list()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"list()"},{"p":"com.linecorp.centraldogma.client","c":"FilesRequest","l":"list(Revision)","u":"list(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listFiles(String, String, Revision, PathPattern)","u":"listFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listFiles(String, String, Revision, String)","u":"listFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listProjects()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"listRemoved()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRemovedProjects()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRemovedRepositories(String)","u":"listRemovedRepositories(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"listRepositories(String)","u":"listRepositories(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"load(File)","u":"load(java.io.File)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"load(String)","u":"load(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"LOCAL_TO_REMOTE"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"localPath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"localPath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"localRepo()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"localRepo()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGIN_API_ROUTES"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGIN_PATH"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"login()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"login()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"loginApiService()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProvider","l":"loginApiService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"loginNameNormalizer()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"loginSessionPropagator()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGOUT_API_ROUTES"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"LOGOUT_PATH"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"logoutApiService()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProvider","l":"logoutApiService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"logoutSessionPropagator()"},{"p":"com.linecorp.centraldogma.server","c":"Main","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"major()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"map(Function)","u":"map(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"mapperExecutor(Executor)","u":"mapperExecutor(java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"MARKDOWN"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"markForPurge(String)","u":"markForPurge(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"markup()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"markup()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorCredential","l":"matches(URI)","u":"matches(java.net.URI)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"MAX_ENTRIES"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"MAX_MAX_COMMITS"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"maxAgeSeconds()"},{"p":"com.linecorp.centraldogma.client","c":"HistoryRequest","l":"maxCommits(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxFrameLength()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxFrameLength(int)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"maxLogCount()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"maxNumBytesPerMirror()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxNumConnections()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxNumConnections(int)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"maxNumFilesPerMirror()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"maxNumRetriesOnReplicationLag()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"maxNumRetriesOnReplicationLag(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxRemovedRepositoryAge(Duration)","u":"maxRemovedRepositoryAge(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"maxRemovedRepositoryAgeMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"maxRemovedRepositoryAgeMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"maybeNormalizeRevision(String, String, Revision)","u":"maybeNormalizeRevision(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"MEMBER"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"member()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(Author, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Author,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"member(String)","u":"member(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(String, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"Member(User, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"memberOrDefault(String, Member)","u":"memberOrDefault(java.lang.String,com.linecorp.centraldogma.server.metadata.Member)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"members()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"merge(CentralDogmaBeanConfig)","u":"merge(com.linecorp.centraldogma.client.updater.CentralDogmaBeanConfig)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(Iterable)","u":"merge(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(MergeQuery)","u":"merge(com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"merge(MergeSource...)","u":"merge(com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"mergeFiles(Revision, MergeQuery)","u":"mergeFiles(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"mergeFiles(String, String, Revision, Iterable)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, Iterable)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, MergeQuery)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeQuery)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"mergeFiles(String, String, Revision, MergeSource...)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"mergeFiles(String, String, Revision, MergeSource...)","u":"mergeFiles(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"mergeSources()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"METADATA_JSON"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"MetadataService(ProjectManager, CommandExecutor)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor)"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"metaRepo()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"meterRegistry()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"meterRegistry()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"meterRegistry(MeterRegistry)","u":"meterRegistry(io.micrometer.core.instrument.MeterRegistry)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationConfig","l":"method()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"method()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"minLogAgeMillis()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"minor()"},{"p":"com.linecorp.centraldogma.server","c":"MirroringService","l":"mirror()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"mirror(File, CommandExecutor, int, long)","u":"mirror(java.io.File,com.linecorp.centraldogma.server.command.CommandExecutor,int,long)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirror(String)","u":"mirror(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"MirrorContext(String, boolean, Cron, MirrorDirection, MirrorCredential, Repository, String, URI, String)","u":"%3Cinit%3E(java.lang.String,boolean,com.cronutils.model.Cron,com.linecorp.centraldogma.server.mirror.MirrorDirection,com.linecorp.centraldogma.server.mirror.MirrorCredential,com.linecorp.centraldogma.server.storage.repository.Repository,java.lang.String,java.net.URI,java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server","c":"MirrorException","l":"MirrorException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"mirroringService()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"MirroringServicePluginConfig(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"MirroringServicePluginConfig(Boolean, Integer, Integer, Long)","u":"%3Cinit%3E(java.lang.Boolean,java.lang.Integer,java.lang.Integer,java.lang.Long)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirrors()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"MetaRepository","l":"mirrors(boolean)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"moreServices()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProvider","l":"moreServices()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"name()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"name()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"name()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"name()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"nameLowercased()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"newChild(Function)","u":"newChild(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"newChild(Function, Executor)","u":"newChild(java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"AbstractArmeriaCentralDogmaBuilder","l":"newClientBuilder(String, EndpointGroup, Consumer, String)","u":"newClientBuilder(java.lang.String,com.linecorp.armeria.client.endpoint.EndpointGroup,java.util.function.Consumer,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"newDecorator(MetadataService)","u":"newDecorator(com.linecorp.centraldogma.server.metadata.MetadataService)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorProvider","l":"newMirror(MirrorContext)","u":"newMirror(com.linecorp.centraldogma.server.mirror.MirrorContext)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"nextExecutionTime(ZonedDateTime)","u":"nextExecutionTime(java.time.ZonedDateTime)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"NO_PERMISSION"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"NONE"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationConfig","l":"NONE"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"normalize(Revision)","u":"normalize(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalize(Revision)","u":"normalize(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalizeNow(Revision)","u":"normalizeNow(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"normalizeNow(Revision, Revision)","u":"normalizeNow(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorUtil","l":"normalizePath(String)","u":"normalizePath(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"normalizeRevision(String, String, Revision)","u":"normalizeRevision(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"NORMALIZING_PUSH"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"numMirroringThreads()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"numRepositoryWorkers(int)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"numWorkers()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"numWorkers()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"numWorkers(int)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"of(Author)","u":"of(com.linecorp.centraldogma.common.Author)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"of(boolean, boolean)","u":"of(boolean,boolean)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"of(CentralDogma, String, String, Query, EndpointListDecoder)","u":"of(com.linecorp.centraldogma.client.CentralDogma,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Query,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"of(Iterable)","u":"of(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"of(JsonNode)","u":"of(com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"of(QueryType, Iterable, Iterable)","u":"of(com.linecorp.centraldogma.common.QueryType,java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"of(QueryType, String, String...)","u":"of(com.linecorp.centraldogma.common.QueryType,java.lang.String,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"of(Revision, EntryType, T, Iterable)","u":"of(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.EntryType,T,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"of(Revision, EntryType, T, String...)","u":"of(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.EntryType,T,java.lang.String...)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"of(Revision, Iterable>)","u":"of(com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"of(Revision, String, EntryType, T)","u":"of(com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.EntryType,T)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"of(String)","u":"of(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"of(String...)","u":"of(java.lang.String...)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofDefault()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofDirectory(Revision, String)","u":"ofDirectory(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"ofEmail(String)","u":"ofEmail(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofInternal()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJson(Iterable)","u":"ofJson(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJson(MergeSource...)","u":"ofJson(com.linecorp.centraldogma.common.MergeSource...)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofJson(Revision, String, JsonNode)","u":"ofJson(com.linecorp.centraldogma.common.Revision,java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofJson(Revision, String, String)","u":"ofJson(com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJson(String)","u":"ofJson(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, JsonNode)","u":"ofJsonPatch(java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, JsonNode, JsonNode)","u":"ofJsonPatch(java.lang.String,com.fasterxml.jackson.databind.JsonNode,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, String)","u":"ofJsonPatch(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonPatch(String, String, String)","u":"ofJsonPatch(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJsonPath(Iterable, Iterable)","u":"ofJsonPath(java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"ofJsonPath(Iterable, String...)","u":"ofJsonPath(java.lang.Iterable,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJsonPath(String, Iterable)","u":"ofJsonPath(java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofJsonPath(String, String...)","u":"ofJsonPath(java.lang.String,java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonUpsert(String, JsonNode)","u":"ofJsonUpsert(java.lang.String,com.fasterxml.jackson.databind.JsonNode)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofJsonUpsert(String, String)","u":"ofJsonUpsert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"ofOptional(String)","u":"ofOptional(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofPrivate()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"ofPublic()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofRemoval(String)","u":"ofRemoval(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofRename(String, String)","u":"ofRename(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"ofRequired(String)","u":"ofRequired(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"ofText(Revision, String, String)","u":"ofText(com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"ofText(String)","u":"ofText(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextPatch(String, String)","u":"ofTextPatch(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextPatch(String, String, String)","u":"ofTextPatch(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"ofTextUpsert(String, String)","u":"ofTextUpsert(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"ofWatcher(Watcher, EndpointListDecoder)","u":"ofWatcher(com.linecorp.centraldogma.client.Watcher,com.linecorp.centraldogma.client.armeria.EndpointListDecoder)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"onMainLane()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"OWNER"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"owner()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"parent()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"RepositoryManager","l":"parent()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"parse(String)","u":"parse(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"parse(String)","u":"parse(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"path()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"path()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"path()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"path(String)","u":"path(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"paths()"},{"p":"com.linecorp.centraldogma.common","c":"PathPattern","l":"patternString()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"permitsPerSecond()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perRolePermissions()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"PerRolePermissions(Iterable, Iterable, Iterable, Iterable)","u":"%3Cinit%3E(java.lang.Iterable,java.lang.Iterable,java.lang.Iterable,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perTokenPermissions()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"perUserPermissions()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"PLAINTEXT"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginConfigDeserializer","l":"PluginConfigDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"pluginConfigMap()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"pluginConfigs()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"pluginConfigs(PluginConfig...)","u":"pluginConfigs(com.linecorp.centraldogma.server.plugin.PluginConfig...)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"PluginContext(CentralDogmaConfig, ProjectManager, CommandExecutor, MeterRegistry, ScheduledExecutorService, InternalProjectInitializer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.CentralDogmaConfig,com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor,io.micrometer.core.instrument.MeterRegistry,java.util.concurrent.ScheduledExecutorService,com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginInitContext","l":"PluginInitContext(CentralDogmaConfig, ProjectManager, CommandExecutor, MeterRegistry, ScheduledExecutorService, ServerBuilder, InternalProjectInitializer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.CentralDogmaConfig,com.linecorp.centraldogma.server.storage.project.ProjectManager,com.linecorp.centraldogma.server.command.CommandExecutor,io.micrometer.core.instrument.MeterRegistry,java.util.concurrent.ScheduledExecutorService,com.linecorp.armeria.server.ServerBuilder,com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"plugins(PluginTarget)","u":"plugins(com.linecorp.centraldogma.server.plugin.PluginTarget)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(InetSocketAddress, SessionProtocol)","u":"port(java.net.InetSocketAddress,com.linecorp.armeria.common.SessionProtocol)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(int, SessionProtocol)","u":"port(int,com.linecorp.armeria.common.SessionProtocol)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"port(ServerPort)","u":"port(com.linecorp.armeria.server.ServerPort)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"ports()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"previewDiff(Revision, Change...)","u":"previewDiff(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"previewDiff(Revision, Iterable>)","u":"previewDiff(com.linecorp.centraldogma.common.Revision,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(ClassLoader, Iterable)","u":"profile(java.lang.ClassLoader,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(ClassLoader, String...)","u":"profile(java.lang.ClassLoader,java.lang.String...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(Iterable)","u":"profile(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profile(String...)","u":"profile(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profileResources(Iterable)","u":"profileResources(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"profileResources(String...)","u":"profileResources(java.lang.String...)"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"project()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"project()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"project(String)","u":"project(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectExistsException","l":"ProjectExistsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"projectManager()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"projectManager()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"projectManager()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"projectManager()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"ProjectMetadata(String, Map, Map, Map, UserAndTimestamp, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,java.util.Map,java.util.Map,java.util.Map,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"projectName()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ProjectNotFoundException","l":"ProjectNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"properties()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"properties(Class)","u":"properties(java.lang.Class)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PURGE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PURGE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"purgeMarked()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeProject(Author, String)","u":"purgeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeProject(Long, Author, String)","u":"purgeProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"purgeProject(String)","u":"purgeProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"purgeRepo(Author, String, String)","u":"purgeRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeRepository(Author, String, String)","u":"purgeRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"purgeRepository(Long, Author, String, String)","u":"purgeRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"purgeRepository(String, String)","u":"purgeRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"purgeToken(Author, String)","u":"purgeToken(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginContext","l":"purgeWorker()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"PUSH"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"push()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Author, String, String, Revision, String, String, Markup, Change...)","u":"push(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Author, String, String, Revision, String, String, Markup, Iterable>)","u":"push(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Long, Author, String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"push(Long, Author, String, String, Revision, String, String, Markup, Iterable>)","u":"push(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CommitRequest","l":"push(Revision)","u":"push(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, Author, String, String, Markup, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"push(String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, String, Markup, Change...)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,com.linecorp.centraldogma.common.Change...)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"push(String, String, Revision, String, String, Markup, Iterable>)","u":"push(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Markup,java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"PushResult(Revision, long)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,long)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"QueryExecutionException","l":"QueryExecutionException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"queryForAuthenticationInfo(AuthenticationToken, LdapContextFactory)","u":"queryForAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken,org.apache.shiro.realm.ldap.LdapContextFactory)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"QuerySyntaxException","l":"QuerySyntaxException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"quietPeriodMillis()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"quorumPort()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"QuotaConfig(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"rawSession()"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonDeserializer","l":"RawSessionJsonDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonSerializer","l":"RawSessionJsonSerializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"READ"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"READ_ONLY"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"READ_ONLY"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"READ_WRITE"},{"p":"com.linecorp.centraldogma.common","c":"ReadOnlyException","l":"ReadOnlyException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RedundantChangeException","l":"RedundantChangeException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"REMOTE_TO_LOCAL"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remoteBranch()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remotePath()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"remoteRepoUri()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"remoteUri()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"removal()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"removal()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"REMOVE"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_NAMED_QUERY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_PLUGIN"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"REMOVE_SESSION"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"remove(String)","u":"remove(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeMember(Author, String, User)","u":"removeMember(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removePerTokenPermission(Author, String, String, String)","u":"removePerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removePerUserPermission(Author, String, String, User)","u":"removePerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeProject(Author, String)","u":"removeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeProject(Author, String)","u":"removeProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeProject(Long, Author, String)","u":"removeProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"removeProject(String)","u":"removeProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeRepo(Author, String, String)","u":"removeRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeRepository(Author, String, String)","u":"removeRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeRepository(Long, Author, String, String)","u":"removeRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"removeRepository(String, String)","u":"removeRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"removeSession(String)","u":"removeSession(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeToken(Author, String, String)","u":"removeToken(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"removeToken(Author, String, Token)","u":"removeToken(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"RENAME"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"replicaId()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"replicating()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"replicating()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"REPLICATION_ONLY"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"replication(ReplicationConfig)","u":"replication(com.linecorp.centraldogma.server.ReplicationConfig)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"replicationConfig()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"REPO_DOGMA"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"REPO_META"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"repo(String)","u":"repo(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"repos()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"Project","l":"repos()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBean","l":"repository()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"repository()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfigBuilder","l":"repository(String)","u":"repository(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"repositoryCacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"repositoryCacheSpec(String)","u":"repositoryCacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryExistsException","l":"RepositoryExistsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"RepositoryInfo(String, Revision)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"RepositoryMetadata(String, PerRolePermissions, Map>, Map>, UserAndTimestamp, UserAndTimestamp, QuotaConfig)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions,java.util.Map,java.util.Map,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"RepositoryMetadata(String, UserAndTimestamp, PerRolePermissions)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"repositoryName()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RepositoryNotFoundException","l":"RepositoryNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"repositoryWatcher(String, String, String, Function)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String, Function)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogma","l":"repositoryWatcher(String, String, String, Function, Executor)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"repositoryWatcher(String, String, String, Function, Executor)","u":"repositoryWatcher(java.lang.String,java.lang.String,java.lang.String,java.util.function.Function,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"requestQuota()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"requestTimeout(Duration)","u":"requestTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"requestTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"requestTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"restoreProject(Author, String)","u":"restoreProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"restoreRepo(Author, String, String)","u":"restoreRepo(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"resultType()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLag(Duration)","u":"retryIntervalOnReplicationLag(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLagMillis()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"retryIntervalOnReplicationLagMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"revision()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"revision()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(int)","u":"%3Cinit%3E(int)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"Revision(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonDeserializer","l":"RevisionJsonDeserializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonSerializer","l":"RevisionJsonSerializer()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(Revision)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionNotFoundException","l":"RevisionNotFoundException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"RevisionRange(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"RevisionRange(Revision, Revision)","u":"%3Cinit%3E(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"role()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"role()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"roles()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"AbstractAllOrEachExtension","l":"runForEachTest()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProviderFactory","l":"SamlAuthProviderFactory()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"SAVE_NAMED_QUERY"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"SAVE_PLUGIN"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"scaffold(CentralDogma)","u":"scaffold(com.linecorp.centraldogma.client.CentralDogma)"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"scaffold(CentralDogma)","u":"scaffold(com.linecorp.centraldogma.client.CentralDogma)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"Mirror","l":"schedule()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"schedule()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_DOGMA"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_FILE"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_HTTP"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_HTTPS"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorSchemes","l":"SCHEME_GIT_SSH"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"SearchFirstActiveDirectoryRealm()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"secret()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"secret()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"secrets()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"selectedProfile()"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroupBuilder","l":"selectionStrategy(EndpointSelectionStrategy)","u":"selectionStrategy(com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"self()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"sequentialExecutor()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionJsonSerializer","l":"serialize(Revision, JsonGenerator, SerializerProvider)","u":"serialize(com.linecorp.centraldogma.common.Revision,com.fasterxml.jackson.core.JsonGenerator,com.fasterxml.jackson.databind.SerializerProvider)"},{"p":"com.linecorp.centraldogma.server.auth","c":"RawSessionJsonSerializer","l":"serialize(Serializable, JsonGenerator, SerializerProvider)","u":"serialize(java.io.Serializable,com.fasterxml.jackson.core.JsonGenerator,com.fasterxml.jackson.databind.SerializerProvider)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataServiceInjector","l":"serve(ServiceRequestContext, HttpRequest)","u":"serve(com.linecorp.armeria.server.ServiceRequestContext,com.linecorp.armeria.common.HttpRequest)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"serverAddress()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"serverAddress()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginInitContext","l":"serverBuilder()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"serverConfig()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"serverId()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"servers()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"serverStatus()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"serverStatus()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"ServerStatusManager(File)","u":"%3Cinit%3E(java.io.File)"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"session()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"Session(String, String, Duration)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.time.Duration)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"Session(String, String, Instant, Instant, Serializable)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.time.Instant,java.time.Instant,java.io.Serializable)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionCacheSpec()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionCacheSpec(String)","u":"sessionCacheSpec(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"sessionId()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProviderParameters","l":"sessionIdGenerator()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionTimeout(Duration)","u":"sessionTimeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionTimeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionTimeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"sessionValidationSchedule()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"sessionValidationSchedule(String)","u":"sessionValidationSchedule(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setAccessToken(String)","u":"setAccessToken(java.lang.String)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setHealthCheckIntervalMillis(long)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setHosts(List)","u":"setHosts(java.util.List)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setInitializationTimeoutMillis(Long)","u":"setInitializationTimeoutMillis(java.lang.Long)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setMaxNumRetriesOnReplicationLag(Integer)","u":"setMaxNumRetriesOnReplicationLag(java.lang.Integer)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setProfile(String)","u":"setProfile(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"setReplicating(boolean)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setRetryIntervalOnReplicationLagMillis(Long)","u":"setRetryIntervalOnReplicationLagMillis(java.lang.Long)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"setSearchFilter(String)","u":"setSearchFilter(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","c":"SearchFirstActiveDirectoryRealm","l":"setSearchTimeoutMillis(int)"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"setUseTls(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"setWritable(boolean)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"setWriteQuota(String, String, QuotaConfig)","u":"setWriteQuota(java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"ShiroAuthProviderFactory()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.auth.shiro","c":"ShiroAuthProviderFactory","l":"ShiroAuthProviderFactory(Function)","u":"%3Cinit%3E(java.util.function.Function)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"ShuttingDownException","l":"ShuttingDownException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"StandaloneCommandExecutor(ProjectManager, Executor, ServerStatusManager, SessionManager, Consumer, Consumer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,java.util.concurrent.Executor,com.linecorp.centraldogma.server.management.ServerStatusManager,com.linecorp.centraldogma.server.auth.SessionManager,java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.server.command","c":"StandaloneCommandExecutor","l":"StandaloneCommandExecutor(ProjectManager, Executor, ServerStatusManager, SessionManager, QuotaConfig, Consumer, Consumer)","u":"%3Cinit%3E(com.linecorp.centraldogma.server.storage.project.ProjectManager,java.util.concurrent.Executor,com.linecorp.centraldogma.server.management.ServerStatusManager,com.linecorp.centraldogma.server.auth.SessionManager,com.linecorp.centraldogma.server.QuotaConfig,java.util.function.Consumer,java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"start()"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"start()"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"start()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"start()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"start()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"start()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"start(PluginContext)","u":"start(com.linecorp.centraldogma.server.plugin.PluginContext)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"start(Revision)","u":"start(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"start(Revision)","u":"start(com.linecorp.centraldogma.common.Revision)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"startAsync()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"startAsync()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"statusManager()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogma","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"stop()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"stop()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"stop()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"stop(PluginContext)","u":"stop(com.linecorp.centraldogma.server.plugin.PluginContext)"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"stopAsync()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"stopAsync()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageException","l":"StorageException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"summary()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"summary()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"supportedEntryTypes()"},{"p":"com.linecorp.centraldogma.server","c":"ConfigValueConverter","l":"supportedPrefixes()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"SYSTEM"},{"p":"com.linecorp.centraldogma.server.plugin","c":"AllReplicasPlugin","l":"target()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"Plugin","l":"target()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"TEXT"},{"p":"com.linecorp.centraldogma.client.armeria","c":"EndpointListDecoder","l":"TEXT"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"text()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"timeout(Duration)","u":"timeout(java.time.Duration)"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"timeoutMillis()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"timeoutMillis()"},{"p":"com.linecorp.centraldogma.client","c":"WatcherRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"WatchFilesRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.client","c":"WatchRequest","l":"timeoutMillis(long)"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"timestamp()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"timestampMillis()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"timeWindowSeconds()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"tls()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"tls(TlsConfig)","u":"tls(com.linecorp.centraldogma.server.TlsConfig)"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"TlsConfig(File, File, String, String, String)","u":"%3Cinit%3E(java.io.File,java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"to()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toAscending()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toDescending()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"TOKEN_JSON"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"token()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"Token(String, String, boolean, UserAndTimestamp, UserAndTimestamp, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,java.lang.String,boolean,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"TokenRegistration(String, ProjectRole, UserAndTimestamp)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.ProjectRole,com.linecorp.centraldogma.server.metadata.UserAndTimestamp)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"tokens()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"Tokens()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"Tokens(Map, Map)","u":"%3Cinit%3E(java.util.Map,java.util.Map)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException()","u":"%3Cinit%3E()"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, String, double)","u":"%3Cinit%3E(java.lang.String,java.lang.String,double)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(String, Throwable, boolean, boolean)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,boolean)"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"TooManyRequestsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.linecorp.centraldogma.client.armeria","c":"CentralDogmaEndpointGroup","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"toString()"},{"p":"com.linecorp.centraldogma.client","c":"RepositoryInfo","l":"toString()"},{"p":"com.linecorp.centraldogma.client.spring","c":"CentralDogmaSettings","l":"toString()"},{"p":"com.linecorp.centraldogma.client.updater","c":"CentralDogmaBeanConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"MergeSource","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"Revision","l":"toString()"},{"p":"com.linecorp.centraldogma.common","c":"RevisionRange","l":"toString()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractCommandExecutor","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommitResult","l":"toString()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForwardingCommandExecutor","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CorsConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"GracefulShutdownTimeout","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Member","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"PerRolePermissions","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectMetadata","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"TokenRegistration","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"toString()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"toString()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorContext","l":"toString()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirroringServicePluginConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"QuotaConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"FindOption","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"TlsConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"toString()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"trustedProxyAddresses()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"trustedProxyAddresses(Iterable)","u":"trustedProxyAddresses(java.lang.Iterable)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"trustedProxyAddresses(String...)","u":"trustedProxyAddresses(java.lang.String...)"},{"p":"com.linecorp.centraldogma.common","c":"Change","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"ContentHolder","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Entry","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"MergedEntry","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"MergeQuery","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Query","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"TooManyRequestsException","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"AbstractPushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"CreateSessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"ForcePushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"NormalizingPushCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PurgeRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"PushAsIsCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RemoveSessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"RootCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"SessionCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveProjectCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UnremoveRepositoryCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"type()"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"type()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"UNKNOWN"},{"p":"com.linecorp.centraldogma.common","c":"Author","l":"UNKNOWN"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UNREMOVE_PROJECT"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UNREMOVE_REPOSITORY"},{"p":"com.linecorp.centraldogma.server.storage","c":"StorageManager","l":"unremove(String)","u":"unremove(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveProject(Author, String)","u":"unremoveProject(com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveProject(Long, Author, String)","u":"unremoveProject(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"unremoveProject(String)","u":"unremoveProject(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveRepository(Author, String, String)","u":"unremoveRepository(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"unremoveRepository(Long, Author, String, String)","u":"unremoveRepository(java.lang.Long,com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"unremoveRepository(String, String)","u":"unremoveRepository(java.lang.String,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"UPDATE_SERVER_STATUS"},{"p":"com.linecorp.centraldogma.server.auth","c":"SessionManager","l":"update(Session)","u":"update(com.linecorp.centraldogma.server.auth.Session)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateMemberRole(Author, String, User, ProjectRole)","u":"updateMemberRole(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.User,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerRolePermissions(Author, String, String, PerRolePermissions)","u":"updatePerRolePermissions(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.PerRolePermissions)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerTokenPermission(Author, String, String, String, Collection)","u":"updatePerTokenPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updatePerUserPermission(Author, String, String, User, Collection)","u":"updatePerUserPermission(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.metadata.User,java.util.Collection)"},{"p":"com.linecorp.centraldogma.server.command","c":"Command","l":"updateServerStatus(ServerStatus)","u":"updateServerStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"UpdateServerStatusCommand","l":"UpdateServerStatusCommand(Long, Author, ServerStatus)","u":"%3Cinit%3E(java.lang.Long,com.linecorp.centraldogma.common.Author,com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"updateStatus(ServerStatus)","u":"updateStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatusManager","l":"updateStatus(ServerStatus)","u":"updateStatus(com.linecorp.centraldogma.server.management.ServerStatus)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"updateStatus(UpdateServerStatusCommand)","u":"updateStatus(com.linecorp.centraldogma.server.command.UpdateServerStatusCommand)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateTokenRole(Author, String, Token, ProjectRole)","u":"updateTokenRole(com.linecorp.centraldogma.common.Author,java.lang.String,com.linecorp.centraldogma.server.metadata.Token,com.linecorp.centraldogma.server.metadata.ProjectRole)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"MetadataService","l":"updateWriteQuota(Author, String, String, QuotaConfig)","u":"updateWriteQuota(com.linecorp.centraldogma.common.Author,java.lang.String,java.lang.String,com.linecorp.centraldogma.server.QuotaConfig)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"UPSERT_JSON"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"UPSERT_TEXT"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"uri(String)","u":"uri(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"user()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String, List)","u":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"User","l":"User(String, String, String, List)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.util.List)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"UserAndTimestamp(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserAndTimestamp","l":"UserAndTimestamp(String, Instant)","u":"%3Cinit%3E(java.lang.String,java.time.Instant)"},{"p":"com.linecorp.centraldogma.server.auth","c":"Session","l":"username()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"UserWithToken","l":"UserWithToken(String, Token)","u":"%3Cinit%3E(java.lang.String,com.linecorp.centraldogma.server.metadata.Token)"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"useTls()"},{"p":"com.linecorp.centraldogma.testing.junit","c":"CentralDogmaExtension","l":"useTls()"},{"p":"com.linecorp.centraldogma.testing.junit4","c":"CentralDogmaRule","l":"useTls()"},{"p":"com.linecorp.centraldogma.client","c":"AbstractCentralDogmaBuilder","l":"useTls(boolean)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"validateSecret(String)","u":"validateSecret(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"Latest","l":"value()"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.linecorp.centraldogma.common","c":"ChangeType","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"EntryType","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"Markup","l":"values()"},{"p":"com.linecorp.centraldogma.common","c":"QueryType","l":"values()"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandType","l":"values()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"values()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"values()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"ProjectRole","l":"values()"},{"p":"com.linecorp.centraldogma.server.mirror","c":"MirrorDirection","l":"values()"},{"p":"com.linecorp.centraldogma.server.plugin","c":"PluginTarget","l":"values()"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"values()"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(BiConsumer)","u":"watch(java.util.function.BiConsumer)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(BiConsumer, Executor)","u":"watch(java.util.function.BiConsumer,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(Consumer)","u":"watch(java.util.function.Consumer)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watch(Consumer, Executor)","u":"watch(java.util.function.Consumer,java.util.concurrent.Executor)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(PathPattern)","u":"watch(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(Query)","u":"watch(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, Query)","u":"watch(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, Query, boolean)","u":"watch(com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,boolean)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, String)","u":"watch(com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.server.storage.repository","c":"Repository","l":"watch(Revision, String, boolean)","u":"watch(com.linecorp.centraldogma.common.Revision,java.lang.String,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watch(String)","u":"watch(java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watcher(PathPattern)","u":"watcher(com.linecorp.centraldogma.common.PathPattern)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogmaRepository","l":"watcher(Query)","u":"watcher(com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query, long)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,long)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchFile(String, String, Revision, Query, long, boolean)","u":"watchFile(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.Query,long,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, PathPattern, long, boolean)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,com.linecorp.centraldogma.common.PathPattern,long,boolean)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, String)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String)"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"watchRepository(String, String, Revision, String, long)","u":"watchRepository(java.lang.String,java.lang.String,com.linecorp.centraldogma.common.Revision,java.lang.String,long)"},{"p":"com.linecorp.centraldogma.client","c":"Watcher","l":"watchScheduler()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"webAppEnabled(boolean)"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"webAppTitle()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"webAppTitle(String)","u":"webAppTitle(java.lang.String)"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"webLoginService()"},{"p":"com.linecorp.centraldogma.server.auth.saml","c":"SamlAuthProvider","l":"webLoginService()"},{"p":"com.linecorp.centraldogma.server.auth","c":"AuthProvider","l":"webLogoutService()"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"weight()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"when()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"when()"},{"p":"com.linecorp.centraldogma.common","c":"Commit","l":"whenAsText()"},{"p":"com.linecorp.centraldogma.common","c":"PushResult","l":"whenAsText()"},{"p":"com.linecorp.centraldogma.client","c":"CentralDogma","l":"whenEndpointReady()"},{"p":"com.linecorp.centraldogma.server.storage.project","c":"InternalProjectInitializer","l":"whenInitialized()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Token","l":"withoutSecret()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Tokens","l":"withoutSecret()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"WRITABLE"},{"p":"com.linecorp.centraldogma.server.command","c":"CommandExecutorStatusManager","l":"writable()"},{"p":"com.linecorp.centraldogma.server.management","c":"ServerStatus","l":"writable()"},{"p":"com.linecorp.centraldogma.server.metadata","c":"Permission","l":"WRITE"},{"p":"com.linecorp.centraldogma.server.metadata","c":"RepositoryMetadata","l":"writeQuota()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaConfig","l":"writeQuotaPerRepository()"},{"p":"com.linecorp.centraldogma.server","c":"CentralDogmaBuilder","l":"writeQuotaPerRepository(int, int)","u":"writeQuotaPerRepository(int,int)"},{"p":"com.linecorp.centraldogma.server","c":"ReplicationMethod","l":"ZOOKEEPER"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperReplicationConfig","l":"ZooKeeperReplicationConfig(int, Map)","u":"%3Cinit%3E(int,java.util.Map)"},{"p":"com.linecorp.centraldogma.server","c":"ZooKeeperServerConfig","l":"ZooKeeperServerConfig(String, int, int, Integer, Integer, Integer)","u":"%3Cinit%3E(java.lang.String,int,int,java.lang.Integer,java.lang.Integer,java.lang.Integer)"}];updateSearchResults(); \ No newline at end of file diff --git a/apidocs/overview-summary.html b/apidocs/overview-summary.html index 02a913d9e9..b6337f4360 100644 --- a/apidocs/overview-summary.html +++ b/apidocs/overview-summary.html @@ -2,7 +2,7 @@ -Central Dogma 0.68.0 API reference +Central Dogma 0.67.3 API reference diff --git a/apidocs/overview-tree.html b/apidocs/overview-tree.html index 0c272f6e96..cb57b1cc53 100644 --- a/apidocs/overview-tree.html +++ b/apidocs/overview-tree.html @@ -2,7 +2,7 @@ -Class Hierarchy (Central Dogma 0.68.0 API reference) +Class Hierarchy (Central Dogma 0.67.3 API reference) @@ -402,7 +402,6 @@

    Enum Class Hierarchy

    • com.linecorp.centraldogma.common.ChangeType
    • com.linecorp.centraldogma.server.command.CommandType
    • -
    • com.linecorp.centraldogma.server.storage.repository.DiffResultType
    • com.linecorp.centraldogma.common.EntryType
    • com.linecorp.centraldogma.common.Markup
    • com.linecorp.centraldogma.server.mirror.MirrorDirection
    • diff --git a/apidocs/search.html b/apidocs/search.html index 92438a20f4..26e543bda0 100644 --- a/apidocs/search.html +++ b/apidocs/search.html @@ -2,7 +2,7 @@ -Search (Central Dogma 0.68.0 API reference) +Search (Central Dogma 0.67.3 API reference) diff --git a/apidocs/serialized-form.html b/apidocs/serialized-form.html index bb72017c80..10d7672fe2 100644 --- a/apidocs/serialized-form.html +++ b/apidocs/serialized-form.html @@ -2,7 +2,7 @@ -Serialized Form (Central Dogma 0.68.0 API reference) +Serialized Form (Central Dogma 0.67.3 API reference) diff --git a/apidocs/type-search-index.js b/apidocs/type-search-index.js index de09f73d99..d21d27b3a5 100644 --- a/apidocs/type-search-index.js +++ b/apidocs/type-search-index.js @@ -1 +1 @@ -typeSearchIndex = [{"p":"com.linecorp.centraldogma.testing.junit","l":"AbstractAllOrEachExtension"},{"p":"com.linecorp.centraldogma.client.armeria","l":"AbstractArmeriaCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client","l":"AbstractCentralDogma"},{"p":"com.linecorp.centraldogma.client","l":"AbstractCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.server.command","l":"AbstractCommandExecutor"},{"p":"com.linecorp.centraldogma.server.plugin","l":"AbstractPluginConfig"},{"p":"com.linecorp.centraldogma.server.command","l":"AbstractPushCommand"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.linecorp.centraldogma.server.plugin","l":"AllReplicasPlugin"},{"p":"com.linecorp.centraldogma.client.armeria","l":"ArmeriaCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client.armeria","l":"ArmeriaClientConfigurator"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthConfig"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthException"},{"p":"com.linecorp.centraldogma.common","l":"Author"},{"p":"com.linecorp.centraldogma.common","l":"AuthorizationException"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProvider"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProviderFactory"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProviderParameters"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogma"},{"p":"com.linecorp.centraldogma.client","l":"CentralDogma"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBean"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanConfig"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanConfigBuilder"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanFactory"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaClientAutoConfiguration"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaClientFactoryConfigurator"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogmaConfig"},{"p":"com.linecorp.centraldogma.client.armeria","l":"CentralDogmaEndpointGroup"},{"p":"com.linecorp.centraldogma.client.armeria","l":"CentralDogmaEndpointGroupBuilder"},{"p":"com.linecorp.centraldogma.common","l":"CentralDogmaException"},{"p":"com.linecorp.centraldogma.testing.junit","l":"CentralDogmaExtension"},{"p":"com.linecorp.centraldogma.client","l":"CentralDogmaRepository"},{"p":"com.linecorp.centraldogma.testing.junit4","l":"CentralDogmaRule"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaSettings"},{"p":"com.linecorp.centraldogma.common","l":"Change"},{"p":"com.linecorp.centraldogma.common","l":"ChangeConflictException"},{"p":"com.linecorp.centraldogma.common","l":"ChangeFormatException"},{"p":"com.linecorp.centraldogma.common","l":"ChangeType"},{"p":"com.linecorp.centraldogma.server.command","l":"Command"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandExecutor"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandExecutorStatusManager"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandType"},{"p":"com.linecorp.centraldogma.common","l":"Commit"},{"p":"com.linecorp.centraldogma.client","l":"CommitRequest"},{"p":"com.linecorp.centraldogma.server.command","l":"CommitResult"},{"p":"com.linecorp.centraldogma.server","l":"ConfigValueConverter"},{"p":"com.linecorp.centraldogma.common","l":"ContentHolder"},{"p":"com.linecorp.centraldogma.server","l":"CorsConfig"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateSessionCommand"},{"p":"com.linecorp.centraldogma.client","l":"DiffFilesRequest"},{"p":"com.linecorp.centraldogma.client","l":"DiffRequest"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"DiffResultType"},{"p":"com.linecorp.centraldogma.client.armeria","l":"DnsAddressEndpointGroupConfigurator"},{"p":"com.linecorp.centraldogma.client.armeria","l":"EndpointListDecoder"},{"p":"com.linecorp.centraldogma.common","l":"Entry"},{"p":"com.linecorp.centraldogma.common","l":"EntryNoContentException"},{"p":"com.linecorp.centraldogma.common","l":"EntryNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"EntryType"},{"p":"com.linecorp.centraldogma.client","l":"FileRequest"},{"p":"com.linecorp.centraldogma.client","l":"FilesRequest"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"FindOption"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"FindOptions"},{"p":"com.linecorp.centraldogma.server.command","l":"ForcePushCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"ForwardingCommandExecutor"},{"p":"com.linecorp.centraldogma.server","l":"GracefulShutdownTimeout"},{"p":"com.linecorp.centraldogma.client","l":"HistoryRequest"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Identifiable"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"InternalProjectInitializer"},{"p":"com.linecorp.centraldogma.common","l":"InvalidPushException"},{"p":"com.linecorp.centraldogma.client","l":"Latest"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","l":"LegacyCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.server","l":"Main"},{"p":"com.linecorp.centraldogma.common","l":"Markup"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Member"},{"p":"com.linecorp.centraldogma.common","l":"MergedEntry"},{"p":"com.linecorp.centraldogma.common","l":"MergeQuery"},{"p":"com.linecorp.centraldogma.client","l":"MergeRequest"},{"p":"com.linecorp.centraldogma.common","l":"MergeSource"},{"p":"com.linecorp.centraldogma.server.metadata","l":"MetadataService"},{"p":"com.linecorp.centraldogma.server.metadata","l":"MetadataServiceInjector"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"MetaRepository"},{"p":"com.linecorp.centraldogma.server.mirror","l":"Mirror"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorContext"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorCredential"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorDirection"},{"p":"com.linecorp.centraldogma.server","l":"MirrorException"},{"p":"com.linecorp.centraldogma.server","l":"MirroringService"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirroringServicePluginConfig"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorProvider"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorSchemes"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorUtil"},{"p":"com.linecorp.centraldogma.common.util","l":"NonNullByDefault"},{"p":"com.linecorp.centraldogma.server.command","l":"NormalizingPushCommand"},{"p":"com.linecorp.centraldogma.common","l":"PathPattern"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Permission"},{"p":"com.linecorp.centraldogma.server.metadata","l":"PerRolePermissions"},{"p":"com.linecorp.centraldogma.server.plugin","l":"Plugin"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginConfig"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginConfigDeserializer"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginContext"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginInitContext"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginTarget"},{"p":"com.linecorp.centraldogma.client","l":"PreviewDiffRequest"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"Project"},{"p":"com.linecorp.centraldogma.common","l":"ProjectExistsException"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"ProjectManager"},{"p":"com.linecorp.centraldogma.server.metadata","l":"ProjectMetadata"},{"p":"com.linecorp.centraldogma.common","l":"ProjectNotFoundException"},{"p":"com.linecorp.centraldogma.server.metadata","l":"ProjectRole"},{"p":"com.linecorp.centraldogma.server.command","l":"PurgeProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"PurgeRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"PushAsIsCommand"},{"p":"com.linecorp.centraldogma.common","l":"PushResult"},{"p":"com.linecorp.centraldogma.common","l":"Query"},{"p":"com.linecorp.centraldogma.common","l":"QueryExecutionException"},{"p":"com.linecorp.centraldogma.common","l":"QuerySyntaxException"},{"p":"com.linecorp.centraldogma.common","l":"QueryType"},{"p":"com.linecorp.centraldogma.server","l":"QuotaConfig"},{"p":"com.linecorp.centraldogma.server.auth","l":"RawSessionJsonDeserializer"},{"p":"com.linecorp.centraldogma.server.auth","l":"RawSessionJsonSerializer"},{"p":"com.linecorp.centraldogma.common","l":"ReadOnlyException"},{"p":"com.linecorp.centraldogma.common","l":"RedundantChangeException"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveSessionCommand"},{"p":"com.linecorp.centraldogma.server","l":"ReplicationConfig"},{"p":"com.linecorp.centraldogma.server","l":"ReplicationMethod"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"Repository"},{"p":"com.linecorp.centraldogma.server.command","l":"RepositoryCommand"},{"p":"com.linecorp.centraldogma.common","l":"RepositoryExistsException"},{"p":"com.linecorp.centraldogma.client","l":"RepositoryInfo"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"RepositoryManager"},{"p":"com.linecorp.centraldogma.server.metadata","l":"RepositoryMetadata"},{"p":"com.linecorp.centraldogma.common","l":"RepositoryNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"Revision"},{"p":"com.linecorp.centraldogma.common","l":"RevisionJsonDeserializer"},{"p":"com.linecorp.centraldogma.common","l":"RevisionJsonSerializer"},{"p":"com.linecorp.centraldogma.common","l":"RevisionNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"RevisionRange"},{"p":"com.linecorp.centraldogma.server.command","l":"RootCommand"},{"p":"com.linecorp.centraldogma.server.auth.saml","l":"SamlAuthProvider"},{"p":"com.linecorp.centraldogma.server.auth.saml","l":"SamlAuthProviderFactory"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","l":"SearchFirstActiveDirectoryRealm"},{"p":"com.linecorp.centraldogma.server.management","l":"ServerStatus"},{"p":"com.linecorp.centraldogma.server.management","l":"ServerStatusManager"},{"p":"com.linecorp.centraldogma.server.auth","l":"Session"},{"p":"com.linecorp.centraldogma.server.command","l":"SessionCommand"},{"p":"com.linecorp.centraldogma.server.auth","l":"SessionManager"},{"p":"com.linecorp.centraldogma.server.auth.shiro","l":"ShiroAuthProvider"},{"p":"com.linecorp.centraldogma.server.auth.shiro","l":"ShiroAuthProviderFactory"},{"p":"com.linecorp.centraldogma.common","l":"ShuttingDownException"},{"p":"com.linecorp.centraldogma.server.command","l":"StandaloneCommandExecutor"},{"p":"com.linecorp.centraldogma.server.storage","l":"StorageException"},{"p":"com.linecorp.centraldogma.server.storage","l":"StorageManager"},{"p":"com.linecorp.centraldogma.server","l":"TlsConfig"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Token"},{"p":"com.linecorp.centraldogma.server.metadata","l":"TokenRegistration"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Tokens"},{"p":"com.linecorp.centraldogma.common","l":"TooManyRequestsException"},{"p":"com.linecorp.centraldogma.server.command","l":"UnremoveProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"UnremoveRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"UpdateServerStatusCommand"},{"p":"com.linecorp.centraldogma.server.metadata","l":"User"},{"p":"com.linecorp.centraldogma.server.metadata","l":"UserAndTimestamp"},{"p":"com.linecorp.centraldogma.server.metadata","l":"UserWithToken"},{"p":"com.linecorp.centraldogma.client","l":"Watcher"},{"p":"com.linecorp.centraldogma.client","l":"WatcherRequest"},{"p":"com.linecorp.centraldogma.client","l":"WatchFilesRequest"},{"p":"com.linecorp.centraldogma.client","l":"WatchRequest"},{"p":"com.linecorp.centraldogma.server","l":"ZooKeeperReplicationConfig"},{"p":"com.linecorp.centraldogma.server","l":"ZooKeeperServerConfig"}];updateSearchResults(); \ No newline at end of file +typeSearchIndex = [{"p":"com.linecorp.centraldogma.testing.junit","l":"AbstractAllOrEachExtension"},{"p":"com.linecorp.centraldogma.client.armeria","l":"AbstractArmeriaCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client","l":"AbstractCentralDogma"},{"p":"com.linecorp.centraldogma.client","l":"AbstractCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.server.command","l":"AbstractCommandExecutor"},{"p":"com.linecorp.centraldogma.server.plugin","l":"AbstractPluginConfig"},{"p":"com.linecorp.centraldogma.server.command","l":"AbstractPushCommand"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.linecorp.centraldogma.server.plugin","l":"AllReplicasPlugin"},{"p":"com.linecorp.centraldogma.client.armeria","l":"ArmeriaCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client.armeria","l":"ArmeriaClientConfigurator"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthConfig"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthException"},{"p":"com.linecorp.centraldogma.common","l":"Author"},{"p":"com.linecorp.centraldogma.common","l":"AuthorizationException"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProvider"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProviderFactory"},{"p":"com.linecorp.centraldogma.server.auth","l":"AuthProviderParameters"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogma"},{"p":"com.linecorp.centraldogma.client","l":"CentralDogma"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBean"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanConfig"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanConfigBuilder"},{"p":"com.linecorp.centraldogma.client.updater","l":"CentralDogmaBeanFactory"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaClientAutoConfiguration"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaClientFactoryConfigurator"},{"p":"com.linecorp.centraldogma.server","l":"CentralDogmaConfig"},{"p":"com.linecorp.centraldogma.client.armeria","l":"CentralDogmaEndpointGroup"},{"p":"com.linecorp.centraldogma.client.armeria","l":"CentralDogmaEndpointGroupBuilder"},{"p":"com.linecorp.centraldogma.common","l":"CentralDogmaException"},{"p":"com.linecorp.centraldogma.testing.junit","l":"CentralDogmaExtension"},{"p":"com.linecorp.centraldogma.client","l":"CentralDogmaRepository"},{"p":"com.linecorp.centraldogma.testing.junit4","l":"CentralDogmaRule"},{"p":"com.linecorp.centraldogma.client.spring","l":"CentralDogmaSettings"},{"p":"com.linecorp.centraldogma.common","l":"Change"},{"p":"com.linecorp.centraldogma.common","l":"ChangeConflictException"},{"p":"com.linecorp.centraldogma.common","l":"ChangeFormatException"},{"p":"com.linecorp.centraldogma.common","l":"ChangeType"},{"p":"com.linecorp.centraldogma.server.command","l":"Command"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandExecutor"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandExecutorStatusManager"},{"p":"com.linecorp.centraldogma.server.command","l":"CommandType"},{"p":"com.linecorp.centraldogma.common","l":"Commit"},{"p":"com.linecorp.centraldogma.client","l":"CommitRequest"},{"p":"com.linecorp.centraldogma.server.command","l":"CommitResult"},{"p":"com.linecorp.centraldogma.server","l":"ConfigValueConverter"},{"p":"com.linecorp.centraldogma.common","l":"ContentHolder"},{"p":"com.linecorp.centraldogma.server","l":"CorsConfig"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"CreateSessionCommand"},{"p":"com.linecorp.centraldogma.client","l":"DiffFilesRequest"},{"p":"com.linecorp.centraldogma.client","l":"DiffRequest"},{"p":"com.linecorp.centraldogma.client.armeria","l":"DnsAddressEndpointGroupConfigurator"},{"p":"com.linecorp.centraldogma.client.armeria","l":"EndpointListDecoder"},{"p":"com.linecorp.centraldogma.common","l":"Entry"},{"p":"com.linecorp.centraldogma.common","l":"EntryNoContentException"},{"p":"com.linecorp.centraldogma.common","l":"EntryNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"EntryType"},{"p":"com.linecorp.centraldogma.client","l":"FileRequest"},{"p":"com.linecorp.centraldogma.client","l":"FilesRequest"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"FindOption"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"FindOptions"},{"p":"com.linecorp.centraldogma.server.command","l":"ForcePushCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"ForwardingCommandExecutor"},{"p":"com.linecorp.centraldogma.server","l":"GracefulShutdownTimeout"},{"p":"com.linecorp.centraldogma.client","l":"HistoryRequest"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Identifiable"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"InternalProjectInitializer"},{"p":"com.linecorp.centraldogma.common","l":"InvalidPushException"},{"p":"com.linecorp.centraldogma.client","l":"Latest"},{"p":"com.linecorp.centraldogma.client.armeria.legacy","l":"LegacyCentralDogmaBuilder"},{"p":"com.linecorp.centraldogma.server","l":"Main"},{"p":"com.linecorp.centraldogma.common","l":"Markup"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Member"},{"p":"com.linecorp.centraldogma.common","l":"MergedEntry"},{"p":"com.linecorp.centraldogma.common","l":"MergeQuery"},{"p":"com.linecorp.centraldogma.client","l":"MergeRequest"},{"p":"com.linecorp.centraldogma.common","l":"MergeSource"},{"p":"com.linecorp.centraldogma.server.metadata","l":"MetadataService"},{"p":"com.linecorp.centraldogma.server.metadata","l":"MetadataServiceInjector"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"MetaRepository"},{"p":"com.linecorp.centraldogma.server.mirror","l":"Mirror"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorContext"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorCredential"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorDirection"},{"p":"com.linecorp.centraldogma.server","l":"MirrorException"},{"p":"com.linecorp.centraldogma.server","l":"MirroringService"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirroringServicePluginConfig"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorProvider"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorSchemes"},{"p":"com.linecorp.centraldogma.server.mirror","l":"MirrorUtil"},{"p":"com.linecorp.centraldogma.common.util","l":"NonNullByDefault"},{"p":"com.linecorp.centraldogma.server.command","l":"NormalizingPushCommand"},{"p":"com.linecorp.centraldogma.common","l":"PathPattern"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Permission"},{"p":"com.linecorp.centraldogma.server.metadata","l":"PerRolePermissions"},{"p":"com.linecorp.centraldogma.server.plugin","l":"Plugin"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginConfig"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginConfigDeserializer"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginContext"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginInitContext"},{"p":"com.linecorp.centraldogma.server.plugin","l":"PluginTarget"},{"p":"com.linecorp.centraldogma.client","l":"PreviewDiffRequest"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"Project"},{"p":"com.linecorp.centraldogma.common","l":"ProjectExistsException"},{"p":"com.linecorp.centraldogma.server.storage.project","l":"ProjectManager"},{"p":"com.linecorp.centraldogma.server.metadata","l":"ProjectMetadata"},{"p":"com.linecorp.centraldogma.common","l":"ProjectNotFoundException"},{"p":"com.linecorp.centraldogma.server.metadata","l":"ProjectRole"},{"p":"com.linecorp.centraldogma.server.command","l":"PurgeProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"PurgeRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"PushAsIsCommand"},{"p":"com.linecorp.centraldogma.common","l":"PushResult"},{"p":"com.linecorp.centraldogma.common","l":"Query"},{"p":"com.linecorp.centraldogma.common","l":"QueryExecutionException"},{"p":"com.linecorp.centraldogma.common","l":"QuerySyntaxException"},{"p":"com.linecorp.centraldogma.common","l":"QueryType"},{"p":"com.linecorp.centraldogma.server","l":"QuotaConfig"},{"p":"com.linecorp.centraldogma.server.auth","l":"RawSessionJsonDeserializer"},{"p":"com.linecorp.centraldogma.server.auth","l":"RawSessionJsonSerializer"},{"p":"com.linecorp.centraldogma.common","l":"ReadOnlyException"},{"p":"com.linecorp.centraldogma.common","l":"RedundantChangeException"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"RemoveSessionCommand"},{"p":"com.linecorp.centraldogma.server","l":"ReplicationConfig"},{"p":"com.linecorp.centraldogma.server","l":"ReplicationMethod"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"Repository"},{"p":"com.linecorp.centraldogma.server.command","l":"RepositoryCommand"},{"p":"com.linecorp.centraldogma.common","l":"RepositoryExistsException"},{"p":"com.linecorp.centraldogma.client","l":"RepositoryInfo"},{"p":"com.linecorp.centraldogma.server.storage.repository","l":"RepositoryManager"},{"p":"com.linecorp.centraldogma.server.metadata","l":"RepositoryMetadata"},{"p":"com.linecorp.centraldogma.common","l":"RepositoryNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"Revision"},{"p":"com.linecorp.centraldogma.common","l":"RevisionJsonDeserializer"},{"p":"com.linecorp.centraldogma.common","l":"RevisionJsonSerializer"},{"p":"com.linecorp.centraldogma.common","l":"RevisionNotFoundException"},{"p":"com.linecorp.centraldogma.common","l":"RevisionRange"},{"p":"com.linecorp.centraldogma.server.command","l":"RootCommand"},{"p":"com.linecorp.centraldogma.server.auth.saml","l":"SamlAuthProvider"},{"p":"com.linecorp.centraldogma.server.auth.saml","l":"SamlAuthProviderFactory"},{"p":"com.linecorp.centraldogma.server.auth.shiro.realm","l":"SearchFirstActiveDirectoryRealm"},{"p":"com.linecorp.centraldogma.server.management","l":"ServerStatus"},{"p":"com.linecorp.centraldogma.server.management","l":"ServerStatusManager"},{"p":"com.linecorp.centraldogma.server.auth","l":"Session"},{"p":"com.linecorp.centraldogma.server.command","l":"SessionCommand"},{"p":"com.linecorp.centraldogma.server.auth","l":"SessionManager"},{"p":"com.linecorp.centraldogma.server.auth.shiro","l":"ShiroAuthProvider"},{"p":"com.linecorp.centraldogma.server.auth.shiro","l":"ShiroAuthProviderFactory"},{"p":"com.linecorp.centraldogma.common","l":"ShuttingDownException"},{"p":"com.linecorp.centraldogma.server.command","l":"StandaloneCommandExecutor"},{"p":"com.linecorp.centraldogma.server.storage","l":"StorageException"},{"p":"com.linecorp.centraldogma.server.storage","l":"StorageManager"},{"p":"com.linecorp.centraldogma.server","l":"TlsConfig"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Token"},{"p":"com.linecorp.centraldogma.server.metadata","l":"TokenRegistration"},{"p":"com.linecorp.centraldogma.server.metadata","l":"Tokens"},{"p":"com.linecorp.centraldogma.common","l":"TooManyRequestsException"},{"p":"com.linecorp.centraldogma.server.command","l":"UnremoveProjectCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"UnremoveRepositoryCommand"},{"p":"com.linecorp.centraldogma.server.command","l":"UpdateServerStatusCommand"},{"p":"com.linecorp.centraldogma.server.metadata","l":"User"},{"p":"com.linecorp.centraldogma.server.metadata","l":"UserAndTimestamp"},{"p":"com.linecorp.centraldogma.server.metadata","l":"UserWithToken"},{"p":"com.linecorp.centraldogma.client","l":"Watcher"},{"p":"com.linecorp.centraldogma.client","l":"WatcherRequest"},{"p":"com.linecorp.centraldogma.client","l":"WatchFilesRequest"},{"p":"com.linecorp.centraldogma.client","l":"WatchRequest"},{"p":"com.linecorp.centraldogma.server","l":"ZooKeeperReplicationConfig"},{"p":"com.linecorp.centraldogma.server","l":"ZooKeeperServerConfig"}];updateSearchResults(); \ No newline at end of file diff --git a/auth.html b/auth.html index 94c721cfbd..8752c91ea0 100644 --- a/auth.html +++ b/auth.html @@ -7,7 +7,7 @@ - Authentication and Access Control — Central Dogma 0.68.0 documentation + Authentication and Access Control — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
      - 0.68 + 0.67
      diff --git a/client-cli.html b/client-cli.html index 7f1219ab1b..3cf1dfcbb2 100644 --- a/client-cli.html +++ b/client-cli.html @@ -7,7 +7,7 @@ - Command-line client — Central Dogma 0.68.0 documentation + Command-line client — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
      - 0.68 + 0.67
      diff --git a/client-java.html b/client-java.html index f7b4105eb3..2abfb9a001 100644 --- a/client-java.html +++ b/client-java.html @@ -7,7 +7,7 @@ - Java client library — Central Dogma 0.68.0 documentation + Java client library — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
      - 0.68 + 0.67
      @@ -212,14 +212,14 @@

      Adding centraldogma-client as a dependency¶

      Gradle:

      dependencies {
      -    compile 'com.linecorp.centraldogma:centraldogma-client-armeria:0.68.0'
      +    compile 'com.linecorp.centraldogma:centraldogma-client-armeria:0.67.3'
       }

      Maven:

      <dependencies>
         <dependency>
           <groupId>com.linecorp.centraldogma</groupId>
           <artifactId>centraldogma-client-armeria</artifactId>
      -    <version>0.68.0</version>
      +    <version>0.67.3</version>
         </dependency>
       </dependencies>
    @@ -677,14 +677,14 @@

    Spring Boot integration

    Gradle:

    dependencies {
    -    compile 'com.linecorp.centraldogma:centraldogma-client-spring-boot3-starter:0.68.0'
    +    compile 'com.linecorp.centraldogma:centraldogma-client-spring-boot3-starter:0.67.3'
     }

    Maven:

    <dependencies>
       <dependency>
         <groupId>com.linecorp.centraldogma</groupId>
         <artifactId>centraldogma-client-spring-boot3-starter</artifactId>
    -    <version>0.68.0</version>
    +    <version>0.67.3</version>
       </dependency>
     </dependencies>

    Then, add a new section called centraldogma to your Spring Boot application configuration, which is often diff --git a/concepts.html b/concepts.html index d03b41150c..4cd66db8d6 100644 --- a/concepts.html +++ b/concepts.html @@ -7,7 +7,7 @@ - Concepts — Central Dogma 0.68.0 documentation + Concepts — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@

    - 0.68 + 0.67
    diff --git a/genindex.html b/genindex.html index 4ee243356e..e9e8eb3d2f 100644 --- a/genindex.html +++ b/genindex.html @@ -7,7 +7,7 @@ - Index — Central Dogma 0.68.0 documentation + Index — Central Dogma 0.67.3 documentation @@ -70,7 +70,7 @@
    - 0.68 + 0.67
    diff --git a/index.html b/index.html index 1f69b0c2cb..8bc7ca187a 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ - Welcome to Central Dogma — Central Dogma 0.68.0 documentation + Welcome to Central Dogma — Central Dogma 0.67.3 documentation @@ -71,7 +71,7 @@
    - 0.68 + 0.67
    @@ -198,9 +198,9 @@

    Want a quick tour?

    Give it a try!¶

    -

    Download now and give it a try (Java required):

    -
    $ tar zxvf centraldogma-0.68.0.tgz
    -$ cd centraldogma-0.68.0/
    +

    Download now and give it a try (Java required):

    +
    $ tar zxvf centraldogma-0.67.3.tgz
    +$ cd centraldogma-0.67.3/
     $ bin/startup
     <Open http://127.0.0.1:36462/ in your browser for administrative console.>

    Using Docker? Launch our image at Github Packages registry:

    diff --git a/known-issues.html b/known-issues.html index 9099fdc624..5baac47840 100644 --- a/known-issues.html +++ b/known-issues.html @@ -7,7 +7,7 @@ - Known issues — Central Dogma 0.68.0 documentation + Known issues — Central Dogma 0.67.3 documentation @@ -71,7 +71,7 @@
    - 0.68 + 0.67
    diff --git a/mirroring.html b/mirroring.html index dc4bec9ae2..8dee045a71 100644 --- a/mirroring.html +++ b/mirroring.html @@ -7,7 +7,7 @@ - Better configuration change workflow with Git-to-CD mirroring — Central Dogma 0.68.0 documentation + Better configuration change workflow with Git-to-CD mirroring — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
    - 0.68 + 0.67
    diff --git a/objects.inv b/objects.inv index a964cef517f724be77f6a4af8423af83f560ebaf..507fdac5f421c73a2bf259b7ce42c691b436be53 100644 GIT binary patch delta 12 Tcmcb^dWUs_3#0i)*Xc|EACLrI delta 12 Tcmcb^dWUs_3!}wG*Xc|EAC&}O diff --git a/search.html b/search.html index 1f4b110319..ad7061c504 100644 --- a/search.html +++ b/search.html @@ -7,7 +7,7 @@ - Search — Central Dogma 0.68.0 documentation + Search — Central Dogma 0.67.3 documentation @@ -73,7 +73,7 @@
    - 0.68 + 0.67
    diff --git a/setup-configuration.html b/setup-configuration.html index 9cbcb54e36..6aebeb84c6 100644 --- a/setup-configuration.html +++ b/setup-configuration.html @@ -7,7 +7,7 @@ - Configuration — Central Dogma 0.68.0 documentation + Configuration — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
    - 0.68 + 0.67
    diff --git a/setup-installation.html b/setup-installation.html index 2773b930f1..d0f10ce903 100644 --- a/setup-installation.html +++ b/setup-installation.html @@ -7,7 +7,7 @@ - Installation — Central Dogma 0.68.0 documentation + Installation — Central Dogma 0.67.3 documentation @@ -72,7 +72,7 @@
    - 0.68 + 0.67
    @@ -203,14 +203,14 @@

    Prerequisites

    Download¶

    -

    Download the tarball and extract it into your preferred location:

    -
    $ tar zxvf centraldogma-0.68.0.tgz
    +

    Download the tarball and extract it into your preferred location:

    +
    $ tar zxvf centraldogma-0.67.3.tgz

    Startup and shutdown¶

    The distribution is shipped with a simple configuration with replication disabled, so you can play with it immediately:

    -
    $ cd centraldogma-0.68.0/
    +
    $ cd centraldogma-0.67.3/
     $ bin/startup
     ...
     Started up centraldogma successfully: <pid>
    diff --git a/setup.html b/setup.html
    index 981bd71640..87835ef468 100644
    --- a/setup.html
    +++ b/setup.html
    @@ -7,7 +7,7 @@
       
       
       
    -  Setting up — Central Dogma 0.68.0 documentation
    +  Setting up — Central Dogma 0.67.3 documentation
       
     
       
    @@ -72,7 +72,7 @@
                 
                 
                   
    - 0.68 + 0.67
    diff --git a/xref/allclasses-frame.html b/xref/allclasses-frame.html index c5960700a3..f51a031485 100644 --- a/xref/allclasses-frame.html +++ b/xref/allclasses-frame.html @@ -235,9 +235,6 @@

    All Classes

  • CentralDogmaTimeoutScheduler -
  • -
  • - CentralDogmaXdsResources
  • Change @@ -424,9 +421,6 @@

    All Classes

  • DiffRequest -
  • -
  • - DiffResultType
  • DirectoryBasedStorageManager @@ -715,6 +709,9 @@

    All Classes

  • MethodDelegate +
  • +
  • + MigrationProgressLogger
  • Mirror @@ -1228,6 +1225,9 @@

    All Classes

  • ThriftCall +
  • +
  • + ThrowingBiConsumer
  • TlsConfig diff --git a/xref/com/linecorp/centraldogma/client/armeria/legacy/package-frame.html b/xref/com/linecorp/centraldogma/client/armeria/legacy/package-frame.html index 60e9cb994e..a1f9862c61 100644 --- a/xref/com/linecorp/centraldogma/client/armeria/legacy/package-frame.html +++ b/xref/com/linecorp/centraldogma/client/armeria/legacy/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.armeria.legacy + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.armeria.legacy diff --git a/xref/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html b/xref/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html index 842eacabf0..819c30f75c 100644 --- a/xref/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html +++ b/xref/com/linecorp/centraldogma/client/armeria/legacy/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.armeria.legacy + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.armeria.legacy diff --git a/xref/com/linecorp/centraldogma/client/armeria/package-frame.html b/xref/com/linecorp/centraldogma/client/armeria/package-frame.html index de86f17d6b..f9d864ed96 100644 --- a/xref/com/linecorp/centraldogma/client/armeria/package-frame.html +++ b/xref/com/linecorp/centraldogma/client/armeria/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.armeria + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.armeria diff --git a/xref/com/linecorp/centraldogma/client/armeria/package-summary.html b/xref/com/linecorp/centraldogma/client/armeria/package-summary.html index 38974efdd2..ae4661681c 100644 --- a/xref/com/linecorp/centraldogma/client/armeria/package-summary.html +++ b/xref/com/linecorp/centraldogma/client/armeria/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.armeria + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.armeria diff --git a/xref/com/linecorp/centraldogma/client/package-frame.html b/xref/com/linecorp/centraldogma/client/package-frame.html index 710fb3ed80..ead3672658 100644 --- a/xref/com/linecorp/centraldogma/client/package-frame.html +++ b/xref/com/linecorp/centraldogma/client/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client diff --git a/xref/com/linecorp/centraldogma/client/package-summary.html b/xref/com/linecorp/centraldogma/client/package-summary.html index 9f00491439..c47ca0c7bb 100644 --- a/xref/com/linecorp/centraldogma/client/package-summary.html +++ b/xref/com/linecorp/centraldogma/client/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client diff --git a/xref/com/linecorp/centraldogma/client/spring/package-frame.html b/xref/com/linecorp/centraldogma/client/spring/package-frame.html index b7cfb94c1b..1cb561c16b 100644 --- a/xref/com/linecorp/centraldogma/client/spring/package-frame.html +++ b/xref/com/linecorp/centraldogma/client/spring/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.spring + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.spring diff --git a/xref/com/linecorp/centraldogma/client/spring/package-summary.html b/xref/com/linecorp/centraldogma/client/spring/package-summary.html index 6b5a0028c5..26a720e290 100644 --- a/xref/com/linecorp/centraldogma/client/spring/package-summary.html +++ b/xref/com/linecorp/centraldogma/client/spring/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.spring + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.spring diff --git a/xref/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html b/xref/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html index 67beaddba2..62c44db38f 100644 --- a/xref/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html +++ b/xref/com/linecorp/centraldogma/client/updater/CentralDogmaBeanFactory.html @@ -336,7 +336,7 @@ 328 throw ex; 329 } 330 } -331 final long elapsedMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - t0); +331 final long elapsedMillis = System.nanoTime() - t0; 332 logger.debug("Initial value of {} obtained in {} ms: rev={}", 333 settings, elapsedMillis, latest.revision()); 334 } diff --git a/xref/com/linecorp/centraldogma/client/updater/package-frame.html b/xref/com/linecorp/centraldogma/client/updater/package-frame.html index 1e956ab374..0d288381e1 100644 --- a/xref/com/linecorp/centraldogma/client/updater/package-frame.html +++ b/xref/com/linecorp/centraldogma/client/updater/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.updater + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.updater diff --git a/xref/com/linecorp/centraldogma/client/updater/package-summary.html b/xref/com/linecorp/centraldogma/client/updater/package-summary.html index ea47394438..0160d80d1b 100644 --- a/xref/com/linecorp/centraldogma/client/updater/package-summary.html +++ b/xref/com/linecorp/centraldogma/client/updater/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.client.updater + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.client.updater diff --git a/xref/com/linecorp/centraldogma/common/package-frame.html b/xref/com/linecorp/centraldogma/common/package-frame.html index 563b5575da..9d8350d8c9 100644 --- a/xref/com/linecorp/centraldogma/common/package-frame.html +++ b/xref/com/linecorp/centraldogma/common/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.common + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.common diff --git a/xref/com/linecorp/centraldogma/common/package-summary.html b/xref/com/linecorp/centraldogma/common/package-summary.html index 724dda2cf3..707b609c09 100644 --- a/xref/com/linecorp/centraldogma/common/package-summary.html +++ b/xref/com/linecorp/centraldogma/common/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.common + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.common diff --git a/xref/com/linecorp/centraldogma/common/util/package-frame.html b/xref/com/linecorp/centraldogma/common/util/package-frame.html index 56dc091b50..6cc872c375 100644 --- a/xref/com/linecorp/centraldogma/common/util/package-frame.html +++ b/xref/com/linecorp/centraldogma/common/util/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.common.util + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.common.util diff --git a/xref/com/linecorp/centraldogma/common/util/package-summary.html b/xref/com/linecorp/centraldogma/common/util/package-summary.html index 8070fe81be..3e1b515e58 100644 --- a/xref/com/linecorp/centraldogma/common/util/package-summary.html +++ b/xref/com/linecorp/centraldogma/common/util/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.common.util + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.common.util diff --git a/xref/com/linecorp/centraldogma/internal/api/v1/package-frame.html b/xref/com/linecorp/centraldogma/internal/api/v1/package-frame.html index 3ab2e8fc7b..56d6f8b3b2 100644 --- a/xref/com/linecorp/centraldogma/internal/api/v1/package-frame.html +++ b/xref/com/linecorp/centraldogma/internal/api/v1/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.api.v1 + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.api.v1 diff --git a/xref/com/linecorp/centraldogma/internal/api/v1/package-summary.html b/xref/com/linecorp/centraldogma/internal/api/v1/package-summary.html index 9b25dc3b26..cff5d99962 100644 --- a/xref/com/linecorp/centraldogma/internal/api/v1/package-summary.html +++ b/xref/com/linecorp/centraldogma/internal/api/v1/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.api.v1 + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.api.v1 diff --git a/xref/com/linecorp/centraldogma/internal/client/package-frame.html b/xref/com/linecorp/centraldogma/internal/client/package-frame.html index dca46e110e..15392b6bdf 100644 --- a/xref/com/linecorp/centraldogma/internal/client/package-frame.html +++ b/xref/com/linecorp/centraldogma/internal/client/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.client + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.client diff --git a/xref/com/linecorp/centraldogma/internal/client/package-summary.html b/xref/com/linecorp/centraldogma/internal/client/package-summary.html index fbb22ecdf6..c548d99af1 100644 --- a/xref/com/linecorp/centraldogma/internal/client/package-summary.html +++ b/xref/com/linecorp/centraldogma/internal/client/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.client + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.client diff --git a/xref/com/linecorp/centraldogma/internal/jsonpatch/package-frame.html b/xref/com/linecorp/centraldogma/internal/jsonpatch/package-frame.html index efa4a73ddd..b07f85fdda 100644 --- a/xref/com/linecorp/centraldogma/internal/jsonpatch/package-frame.html +++ b/xref/com/linecorp/centraldogma/internal/jsonpatch/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.jsonpatch + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.jsonpatch diff --git a/xref/com/linecorp/centraldogma/internal/jsonpatch/package-summary.html b/xref/com/linecorp/centraldogma/internal/jsonpatch/package-summary.html index a0d602d6be..fa4186d1ed 100644 --- a/xref/com/linecorp/centraldogma/internal/jsonpatch/package-summary.html +++ b/xref/com/linecorp/centraldogma/internal/jsonpatch/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.jsonpatch + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.jsonpatch diff --git a/xref/com/linecorp/centraldogma/internal/package-frame.html b/xref/com/linecorp/centraldogma/internal/package-frame.html index 2715b3368b..aadb0086ba 100644 --- a/xref/com/linecorp/centraldogma/internal/package-frame.html +++ b/xref/com/linecorp/centraldogma/internal/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal diff --git a/xref/com/linecorp/centraldogma/internal/package-summary.html b/xref/com/linecorp/centraldogma/internal/package-summary.html index cfaac9408b..85d0894e1b 100644 --- a/xref/com/linecorp/centraldogma/internal/package-summary.html +++ b/xref/com/linecorp/centraldogma/internal/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal diff --git a/xref/com/linecorp/centraldogma/internal/thrift/package-frame.html b/xref/com/linecorp/centraldogma/internal/thrift/package-frame.html index 8e8d893636..b471fd2ce2 100644 --- a/xref/com/linecorp/centraldogma/internal/thrift/package-frame.html +++ b/xref/com/linecorp/centraldogma/internal/thrift/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.thrift + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.thrift diff --git a/xref/com/linecorp/centraldogma/internal/thrift/package-summary.html b/xref/com/linecorp/centraldogma/internal/thrift/package-summary.html index 85a5bf4b0a..8ce69573c2 100644 --- a/xref/com/linecorp/centraldogma/internal/thrift/package-summary.html +++ b/xref/com/linecorp/centraldogma/internal/thrift/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.internal.thrift + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.internal.thrift diff --git a/xref/com/linecorp/centraldogma/server/CentralDogma.html b/xref/com/linecorp/centraldogma/server/CentralDogma.html index 796cc2ed91..c2057fded8 100644 --- a/xref/com/linecorp/centraldogma/server/CentralDogma.html +++ b/xref/com/linecorp/centraldogma/server/CentralDogma.html @@ -31,50 +31,50 @@ 23 import static com.linecorp.centraldogma.internal.api.v1.HttpApiV1Constants.API_V1_PATH_PREFIX; 24 import static com.linecorp.centraldogma.internal.api.v1.HttpApiV1Constants.HEALTH_CHECK_PATH; 25 import static com.linecorp.centraldogma.internal.api.v1.HttpApiV1Constants.METRICS_PATH; -26 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGIN_API_ROUTES; -27 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGIN_PATH; -28 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGOUT_API_ROUTES; -29 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGOUT_PATH; -30 import static java.util.Objects.requireNonNull; -31 -32 import java.io.File; -33 import java.io.IOException; -34 import java.io.InputStream; -35 import java.net.InetSocketAddress; -36 import java.util.Collections; -37 import java.util.List; -38 import java.util.Map; -39 import java.util.Optional; -40 import java.util.concurrent.CompletableFuture; -41 import java.util.concurrent.CompletionStage; -42 import java.util.concurrent.Executor; -43 import java.util.concurrent.ExecutorService; -44 import java.util.concurrent.Executors; -45 import java.util.concurrent.ForkJoinPool; -46 import java.util.concurrent.LinkedBlockingQueue; -47 import java.util.concurrent.ScheduledExecutorService; -48 import java.util.concurrent.ThreadPoolExecutor; -49 import java.util.concurrent.TimeUnit; -50 import java.util.concurrent.TimeoutException; -51 import java.util.concurrent.atomic.AtomicInteger; -52 import java.util.function.BiFunction; -53 import java.util.function.Consumer; -54 import java.util.function.Function; -55 -56 import javax.annotation.Nullable; -57 -58 import org.slf4j.Logger; -59 import org.slf4j.LoggerFactory; -60 -61 import com.fasterxml.jackson.core.JsonProcessingException; -62 import com.fasterxml.jackson.databind.ObjectMapper; -63 import com.fasterxml.jackson.databind.module.SimpleModule; -64 import com.github.benmanes.caffeine.cache.Caffeine; -65 import com.github.benmanes.caffeine.cache.stats.CacheStats; -66 import com.google.common.collect.ImmutableList; -67 import com.google.common.collect.ImmutableMap; -68 -69 import com.linecorp.armeria.common.DependencyInjector; +26 import static com.linecorp.centraldogma.server.auth.AuthProvider.BUILTIN_WEB_BASE_PATH; +27 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGIN_API_ROUTES; +28 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGIN_PATH; +29 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGOUT_API_ROUTES; +30 import static com.linecorp.centraldogma.server.auth.AuthProvider.LOGOUT_PATH; +31 import static java.util.Objects.requireNonNull; +32 +33 import java.io.File; +34 import java.io.IOException; +35 import java.io.InputStream; +36 import java.net.InetSocketAddress; +37 import java.util.Collections; +38 import java.util.List; +39 import java.util.Map; +40 import java.util.Optional; +41 import java.util.concurrent.CompletableFuture; +42 import java.util.concurrent.CompletionStage; +43 import java.util.concurrent.Executor; +44 import java.util.concurrent.ExecutorService; +45 import java.util.concurrent.Executors; +46 import java.util.concurrent.ForkJoinPool; +47 import java.util.concurrent.LinkedBlockingQueue; +48 import java.util.concurrent.ScheduledExecutorService; +49 import java.util.concurrent.ThreadPoolExecutor; +50 import java.util.concurrent.TimeUnit; +51 import java.util.concurrent.TimeoutException; +52 import java.util.concurrent.atomic.AtomicInteger; +53 import java.util.function.BiFunction; +54 import java.util.function.Consumer; +55 import java.util.function.Function; +56 +57 import javax.annotation.Nullable; +58 +59 import org.slf4j.Logger; +60 import org.slf4j.LoggerFactory; +61 +62 import com.fasterxml.jackson.core.JsonProcessingException; +63 import com.fasterxml.jackson.databind.ObjectMapper; +64 import com.fasterxml.jackson.databind.module.SimpleModule; +65 import com.github.benmanes.caffeine.cache.Caffeine; +66 import com.github.benmanes.caffeine.cache.stats.CacheStats; +67 import com.google.common.collect.ImmutableList; +68 import com.google.common.collect.ImmutableMap; +69 70 import com.linecorp.armeria.common.Flags; 71 import com.linecorp.armeria.common.HttpData; 72 import com.linecorp.armeria.common.HttpHeaderNames; @@ -91,1080 +91,1061 @@ 83 import com.linecorp.armeria.common.util.Exceptions; 84 import com.linecorp.armeria.common.util.StartStopSupport; 85 import com.linecorp.armeria.common.util.SystemInfo; -86 import com.linecorp.armeria.internal.common.ReflectiveDependencyInjector; -87 import com.linecorp.armeria.server.AbstractHttpService; -88 import com.linecorp.armeria.server.ContextPathServicesBuilder; -89 import com.linecorp.armeria.server.DecoratingServiceBindingBuilder; -90 import com.linecorp.armeria.server.HttpService; -91 import com.linecorp.armeria.server.Route; -92 import com.linecorp.armeria.server.Server; -93 import com.linecorp.armeria.server.ServerBuilder; -94 import com.linecorp.armeria.server.ServerPort; -95 import com.linecorp.armeria.server.ServiceNaming; -96 import com.linecorp.armeria.server.ServiceRequestContext; -97 import com.linecorp.armeria.server.annotation.JacksonRequestConverterFunction; -98 import com.linecorp.armeria.server.auth.AuthService; -99 import com.linecorp.armeria.server.auth.Authorizer; -100 import com.linecorp.armeria.server.cors.CorsService; -101 import com.linecorp.armeria.server.docs.DocService; -102 import com.linecorp.armeria.server.encoding.DecodingService; -103 import com.linecorp.armeria.server.encoding.EncodingService; -104 import com.linecorp.armeria.server.file.FileService; -105 import com.linecorp.armeria.server.file.HttpFile; -106 import com.linecorp.armeria.server.healthcheck.HealthCheckService; -107 import com.linecorp.armeria.server.healthcheck.SettableHealthChecker; -108 import com.linecorp.armeria.server.logging.AccessLogWriter; -109 import com.linecorp.armeria.server.metric.MetricCollectingService; -110 import com.linecorp.armeria.server.prometheus.PrometheusExpositionService; -111 import com.linecorp.armeria.server.thrift.THttpService; -112 import com.linecorp.armeria.server.thrift.ThriftCallService; -113 import com.linecorp.centraldogma.common.ShuttingDownException; -114 import com.linecorp.centraldogma.internal.CsrfToken; -115 import com.linecorp.centraldogma.internal.Jackson; -116 import com.linecorp.centraldogma.internal.thrift.CentralDogmaService; -117 import com.linecorp.centraldogma.server.auth.AuthConfig; -118 import com.linecorp.centraldogma.server.auth.AuthProvider; -119 import com.linecorp.centraldogma.server.auth.AuthProviderParameters; -120 import com.linecorp.centraldogma.server.auth.SessionManager; -121 import com.linecorp.centraldogma.server.command.Command; -122 import com.linecorp.centraldogma.server.command.CommandExecutor; -123 import com.linecorp.centraldogma.server.command.StandaloneCommandExecutor; -124 import com.linecorp.centraldogma.server.internal.admin.auth.CachedSessionManager; -125 import com.linecorp.centraldogma.server.internal.admin.auth.CsrfTokenAuthorizer; -126 import com.linecorp.centraldogma.server.internal.admin.auth.ExpiredSessionDeletingSessionManager; -127 import com.linecorp.centraldogma.server.internal.admin.auth.FileBasedSessionManager; -128 import com.linecorp.centraldogma.server.internal.admin.auth.SessionTokenAuthorizer; -129 import com.linecorp.centraldogma.server.internal.admin.service.DefaultLogoutService; -130 import com.linecorp.centraldogma.server.internal.admin.service.RepositoryService; -131 import com.linecorp.centraldogma.server.internal.admin.service.UserService; -132 import com.linecorp.centraldogma.server.internal.api.AdministrativeService; -133 import com.linecorp.centraldogma.server.internal.api.ContentServiceV1; -134 import com.linecorp.centraldogma.server.internal.api.CredentialServiceV1; -135 import com.linecorp.centraldogma.server.internal.api.GitHttpService; -136 import com.linecorp.centraldogma.server.internal.api.HttpApiExceptionHandler; -137 import com.linecorp.centraldogma.server.internal.api.MetadataApiService; -138 import com.linecorp.centraldogma.server.internal.api.MirroringServiceV1; -139 import com.linecorp.centraldogma.server.internal.api.ProjectServiceV1; -140 import com.linecorp.centraldogma.server.internal.api.RepositoryServiceV1; -141 import com.linecorp.centraldogma.server.internal.api.TokenService; -142 import com.linecorp.centraldogma.server.internal.api.WatchService; -143 import com.linecorp.centraldogma.server.internal.api.auth.ApplicationTokenAuthorizer; -144 import com.linecorp.centraldogma.server.internal.api.converter.HttpApiRequestConverter; -145 import com.linecorp.centraldogma.server.internal.mirror.DefaultMirroringServicePlugin; -146 import com.linecorp.centraldogma.server.internal.replication.ZooKeeperCommandExecutor; -147 import com.linecorp.centraldogma.server.internal.storage.project.DefaultProjectManager; -148 import com.linecorp.centraldogma.server.internal.storage.project.ProjectApiManager; -149 import com.linecorp.centraldogma.server.internal.storage.repository.MirrorConfig; -150 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaExceptionTranslator; -151 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaServiceImpl; -152 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaTimeoutScheduler; -153 import com.linecorp.centraldogma.server.internal.thrift.TokenlessClientLogger; -154 import com.linecorp.centraldogma.server.management.ServerStatus; -155 import com.linecorp.centraldogma.server.management.ServerStatusManager; -156 import com.linecorp.centraldogma.server.metadata.MetadataService; -157 import com.linecorp.centraldogma.server.metadata.MetadataServiceInjector; -158 import com.linecorp.centraldogma.server.mirror.MirrorProvider; -159 import com.linecorp.centraldogma.server.plugin.AllReplicasPlugin; -160 import com.linecorp.centraldogma.server.plugin.Plugin; -161 import com.linecorp.centraldogma.server.plugin.PluginInitContext; -162 import com.linecorp.centraldogma.server.plugin.PluginTarget; -163 import com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer; -164 import com.linecorp.centraldogma.server.storage.project.ProjectManager; -165 -166 import io.micrometer.core.instrument.MeterRegistry; -167 import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; -168 import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; -169 import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics; -170 import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; -171 import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; -172 import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; -173 import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; -174 import io.micrometer.core.instrument.binder.system.ProcessorMetrics; -175 import io.micrometer.core.instrument.binder.system.UptimeMetrics; -176 import io.micrometer.core.instrument.composite.CompositeMeterRegistry; -177 import io.micrometer.prometheusmetrics.PrometheusMeterRegistry; -178 import io.netty.util.concurrent.DefaultThreadFactory; -179 import io.netty.util.concurrent.GlobalEventExecutor; -180 -181 /** -182 * Central Dogma server. -183 * -184 * @see CentralDogmaBuilder -185 */ -186 public class CentralDogma implements AutoCloseable { -187 -188 private static final Logger logger = LoggerFactory.getLogger(CentralDogma.class); -189 -190 private static final boolean GIT_MIRROR_ENABLED; -191 -192 static { -193 Jackson.registerModules(new SimpleModule().addSerializer(CacheStats.class, new CacheStatsSerializer())); -194 -195 boolean gitMirrorEnabled = false; -196 for (MirrorProvider mirrorProvider : MirrorConfig.MIRROR_PROVIDERS) { -197 if ("com.linecorp.centraldogma.server.internal.mirror.GitMirrorProvider" -198 .equals(mirrorProvider.getClass().getName())) { -199 gitMirrorEnabled = true; -200 break; -201 } -202 } -203 logger.info("Git mirroring: {}", -204 gitMirrorEnabled ? "enabled" -205 : "disabled ('centraldogma-server-mirror-git' module is not available)"); -206 GIT_MIRROR_ENABLED = gitMirrorEnabled; -207 } -208 -209 /** -210 * Creates a new instance from the given configuration file. -211 * -212 * @throws IOException if failed to load the configuration from the specified file -213 */ -214 public static CentralDogma forConfig(File configFile) throws IOException { -215 requireNonNull(configFile, "configFile"); -216 return new CentralDogma(CentralDogmaConfig.load(configFile), Flags.meterRegistry()); -217 } -218 -219 private final SettableHealthChecker serverHealth = new SettableHealthChecker(false); -220 private final CentralDogmaStartStop startStop; -221 -222 private final AtomicInteger numPendingStopRequests = new AtomicInteger(); -223 -224 @Nullable -225 private final PluginGroup pluginsForAllReplicas; -226 @Nullable -227 private final PluginGroup pluginsForLeaderOnly; -228 -229 private final CentralDogmaConfig cfg; -230 @Nullable -231 private volatile ProjectManager pm; -232 @Nullable -233 private volatile Server server; -234 @Nullable -235 private ExecutorService repositoryWorker; -236 @Nullable -237 private ScheduledExecutorService purgeWorker; -238 @Nullable -239 private CommandExecutor executor; -240 private final MeterRegistry meterRegistry; -241 @Nullable -242 MeterRegistry meterRegistryToBeClosed; -243 @Nullable -244 private SessionManager sessionManager; -245 @Nullable -246 private ServerStatusManager statusManager; -247 @Nullable -248 private InternalProjectInitializer projectInitializer; -249 -250 CentralDogma(CentralDogmaConfig cfg, MeterRegistry meterRegistry) { -251 this.cfg = requireNonNull(cfg, "cfg"); -252 pluginsForAllReplicas = PluginGroup.loadPlugins( -253 CentralDogma.class.getClassLoader(), PluginTarget.ALL_REPLICAS, cfg); -254 pluginsForLeaderOnly = PluginGroup.loadPlugins( -255 CentralDogma.class.getClassLoader(), PluginTarget.LEADER_ONLY, cfg); -256 startStop = new CentralDogmaStartStop(pluginsForAllReplicas); -257 this.meterRegistry = meterRegistry; -258 } -259 -260 /** -261 * Returns the configuration of the server. -262 * -263 * @return the {@link CentralDogmaConfig} instance which is used for configuring this {@link CentralDogma}. -264 */ -265 public CentralDogmaConfig config() { -266 return cfg; -267 } -268 -269 /** -270 * Returns the primary port of the server. -271 * -272 * @return the primary {@link ServerPort} if the server is started. {@link Optional#empty()} otherwise. -273 */ -274 @Nullable -275 public ServerPort activePort() { -276 final Server server = this.server; -277 return server != null ? server.activePort() : null; -278 } -279 -280 /** -281 * Returns the ports of the server. -282 * -283 * @return the {@link Map} which contains the pairs of local {@link InetSocketAddress} and -284 * {@link ServerPort} is the server is started. {@link Optional#empty()} otherwise. -285 */ -286 public Map<InetSocketAddress, ServerPort> activePorts() { -287 final Server server = this.server; -288 if (server != null) { -289 return server.activePorts(); -290 } else { -291 return Collections.emptyMap(); -292 } -293 } -294 -295 /** -296 * Returns the {@link ProjectManager} of the server if the server is started. -297 * {@code null} is returned, otherwise. -298 */ -299 @Nullable -300 public ProjectManager projectManager() { -301 return pm; -302 } -303 -304 /** -305 * Returns the {@link MirroringService} of the server. -306 * -307 * @return the {@link MirroringService} if the server is started and mirroring is enabled. -308 * {@link Optional#empty()} otherwise. -309 */ -310 public Optional<MirroringService> mirroringService() { -311 if (pluginsForLeaderOnly == null) { -312 return Optional.empty(); -313 } -314 return pluginsForLeaderOnly.findFirstPlugin(DefaultMirroringServicePlugin.class) -315 .map(DefaultMirroringServicePlugin::mirroringService); -316 } -317 -318 /** -319 * Returns the {@link Plugin}s which have been loaded. -320 * -321 * @param target the {@link PluginTarget} of the {@link Plugin}s to be returned -322 */ -323 public List<Plugin> plugins(PluginTarget target) { -324 switch (requireNonNull(target, "target")) { -325 case LEADER_ONLY: -326 return pluginsForLeaderOnly != null ? ImmutableList.copyOf(pluginsForLeaderOnly.plugins()) -327 : ImmutableList.of(); -328 case ALL_REPLICAS: -329 return pluginsForAllReplicas != null ? ImmutableList.copyOf(pluginsForAllReplicas.plugins()) -330 : ImmutableList.of(); -331 default: -332 // Should not reach here. -333 throw new Error("Unknown plugin target: " + target); -334 } -335 } -336 -337 /** -338 * Returns the {@link MeterRegistry} that contains the stats related with the server. -339 */ -340 public Optional<MeterRegistry> meterRegistry() { -341 return Optional.ofNullable(meterRegistry); -342 } -343 -344 /** -345 * Starts the server. -346 */ -347 public CompletableFuture<Void> start() { -348 return startStop.start(true); -349 } -350 -351 /** -352 * Stops the server. This method does nothing if the server is stopped already. -353 */ -354 public CompletableFuture<Void> stop() { -355 serverHealth.setHealthy(false); -356 -357 final Optional<GracefulShutdownTimeout> gracefulTimeoutOpt = cfg.gracefulShutdownTimeout(); -358 if (gracefulTimeoutOpt.isPresent()) { -359 try { -360 // Sleep 1 second so that clients have some time to redirect traffic according -361 // to the health status -362 Thread.sleep(1000); -363 } catch (InterruptedException e) { -364 logger.debug("Interrupted while waiting for quiet period", e); -365 Thread.currentThread().interrupt(); -366 } -367 } -368 -369 numPendingStopRequests.incrementAndGet(); -370 return startStop.stop().thenRun(numPendingStopRequests::decrementAndGet); -371 } -372 -373 @Override -374 public void close() { -375 startStop.close(); -376 } -377 -378 private void doStart() throws Exception { -379 boolean success = false; -380 ExecutorService repositoryWorker = null; -381 ScheduledExecutorService purgeWorker = null; -382 ProjectManager pm = null; -383 CommandExecutor executor = null; -384 Server server = null; -385 SessionManager sessionManager = null; -386 try { -387 logger.info("Starting the Central Dogma .."); -388 -389 final ThreadPoolExecutor repositoryWorkerImpl = new ThreadPoolExecutor( -390 cfg.numRepositoryWorkers(), cfg.numRepositoryWorkers(), -391 // TODO(minwoox): Use LinkedTransferQueue when we upgrade to JDK 21. -392 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), -393 new DefaultThreadFactory("repository-worker", true)); -394 repositoryWorkerImpl.allowCoreThreadTimeOut(true); -395 repositoryWorker = ExecutorServiceMetrics.monitor(meterRegistry, repositoryWorkerImpl, -396 "repositoryWorker"); -397 -398 logger.info("Starting the project manager: {}", cfg.dataDir()); -399 -400 purgeWorker = Executors.newSingleThreadScheduledExecutor( -401 new DefaultThreadFactory("purge-worker", true)); -402 -403 pm = new DefaultProjectManager(cfg.dataDir(), repositoryWorker, purgeWorker, -404 meterRegistry, cfg.repositoryCacheSpec()); -405 -406 logger.info("Started the project manager: {}", pm); -407 -408 logger.info("Current settings:\n{}", cfg); -409 -410 sessionManager = initializeSessionManager(); -411 -412 logger.info("Starting the command executor .."); -413 executor = startCommandExecutor(pm, repositoryWorker, purgeWorker, -414 meterRegistry, sessionManager); -415 // The projectInitializer is set in startCommandExecutor. -416 assert projectInitializer != null; -417 if (executor.isWritable()) { -418 logger.info("Started the command executor."); -419 } -420 -421 logger.info("Starting the RPC server."); -422 server = startServer(pm, executor, purgeWorker, meterRegistry, sessionManager, -423 projectInitializer); -424 logger.info("Started the RPC server at: {}", server.activePorts()); -425 logger.info("Started the Central Dogma successfully."); -426 success = true; -427 } finally { -428 if (success) { -429 serverHealth.setHealthy(true); -430 this.repositoryWorker = repositoryWorker; -431 this.purgeWorker = purgeWorker; -432 this.pm = pm; -433 this.executor = executor; -434 this.server = server; -435 this.sessionManager = sessionManager; -436 } else { -437 doStop(server, executor, pm, repositoryWorker, purgeWorker, sessionManager); -438 } -439 } -440 } -441 -442 private CommandExecutor startCommandExecutor( -443 ProjectManager pm, Executor repositoryWorker, -444 ScheduledExecutorService purgeWorker, MeterRegistry meterRegistry, -445 @Nullable SessionManager sessionManager) { -446 -447 final Consumer<CommandExecutor> onTakeLeadership = exec -> { -448 if (pluginsForLeaderOnly != null) { -449 logger.info("Starting plugins on the leader replica .."); -450 pluginsForLeaderOnly -451 .start(cfg, pm, exec, meterRegistry, purgeWorker, projectInitializer) -452 .handle((unused, cause) -> { -453 if (cause == null) { -454 logger.info("Started plugins on the leader replica."); -455 } else { -456 logger.error("Failed to start plugins on the leader replica..", cause); -457 } -458 return null; -459 }); -460 } -461 }; -462 -463 final Consumer<CommandExecutor> onReleaseLeadership = exec -> { -464 if (pluginsForLeaderOnly != null) { -465 logger.info("Stopping plugins on the leader replica .."); -466 pluginsForLeaderOnly.stop(cfg, pm, exec, meterRegistry, purgeWorker, projectInitializer) -467 .handle((unused, cause) -> { -468 if (cause == null) { -469 logger.info("Stopped plugins on the leader replica."); -470 } else { -471 logger.error("Failed to stop plugins on the leader replica.", -472 cause); -473 } -474 return null; -475 }); -476 } -477 }; -478 -479 statusManager = new ServerStatusManager(cfg.dataDir()); -480 logger.info("Startup mode: {}", statusManager.serverStatus()); -481 final CommandExecutor executor; -482 final ReplicationMethod replicationMethod = cfg.replicationConfig().method(); -483 switch (replicationMethod) { -484 case ZOOKEEPER: -485 executor = newZooKeeperCommandExecutor(pm, repositoryWorker, statusManager, meterRegistry, -486 sessionManager, onTakeLeadership, onReleaseLeadership); -487 break; -488 case NONE: -489 logger.info("No replication mechanism specified; entering standalone"); -490 executor = new StandaloneCommandExecutor(pm, repositoryWorker, statusManager, sessionManager, -491 cfg.writeQuotaPerRepository(), -492 onTakeLeadership, onReleaseLeadership); -493 break; -494 default: -495 throw new Error("unknown replication method: " + replicationMethod); -496 } -497 projectInitializer = new InternalProjectInitializer(executor); -498 -499 final ServerStatus initialServerStatus = statusManager.serverStatus(); -500 executor.setWritable(initialServerStatus.writable()); -501 if (!initialServerStatus.replicating()) { -502 projectInitializer.whenInitialized().complete(null); -503 return executor; -504 } -505 try { -506 final CompletableFuture<Void> startFuture = executor.start(); -507 while (!startFuture.isDone()) { -508 if (numPendingStopRequests.get() > 0) { -509 // Stop request has been issued. -510 executor.stop().get(); -511 break; -512 } -513 -514 try { -515 startFuture.get(100, TimeUnit.MILLISECONDS); -516 } catch (TimeoutException unused) { -517 // Taking long time .. -518 } -519 } -520 -521 // Trigger the exception if any. -522 startFuture.get(); -523 projectInitializer.initialize(); -524 } catch (Exception e) { -525 projectInitializer.whenInitialized().complete(null); -526 logger.warn("Failed to start the command executor. Entering read-only.", e); -527 } -528 -529 return executor; -530 } -531 -532 @Nullable -533 private SessionManager initializeSessionManager() throws Exception { -534 final AuthConfig authCfg = cfg.authConfig(); -535 if (authCfg == null) { -536 return null; -537 } -538 -539 boolean success = false; -540 SessionManager manager = null; -541 try { -542 manager = new FileBasedSessionManager(new File(cfg.dataDir(), "_sessions").toPath(), -543 authCfg.sessionValidationSchedule()); -544 manager = new CachedSessionManager(manager, Caffeine.from(authCfg.sessionCacheSpec()).build()); -545 manager = new ExpiredSessionDeletingSessionManager(manager); -546 success = true; -547 return manager; -548 } finally { -549 if (!success && manager != null) { -550 try { -551 // It will eventually close FileBasedSessionManager because the other managers just forward -552 // the close method call to their delegate. -553 manager.close(); -554 } catch (Exception e) { -555 logger.warn("Failed to close a session manager.", e); -556 } -557 } -558 } -559 } -560 -561 private Server startServer(ProjectManager pm, CommandExecutor executor, -562 ScheduledExecutorService purgeWorker, MeterRegistry meterRegistry, -563 @Nullable SessionManager sessionManager, -564 InternalProjectInitializer projectInitializer) { -565 final ServerBuilder sb = Server.builder(); -566 sb.verboseResponses(true); -567 cfg.ports().forEach(sb::port); -568 -569 if (cfg.ports().stream().anyMatch(ServerPort::hasTls)) { -570 try { -571 final TlsConfig tlsConfig = cfg.tls(); -572 if (tlsConfig != null) { -573 try (InputStream keyCertChainInputStream = tlsConfig.keyCertChainInputStream(); -574 InputStream keyInputStream = tlsConfig.keyInputStream()) { -575 sb.tls(keyCertChainInputStream, keyInputStream, tlsConfig.keyPassword()); -576 } -577 } else { -578 logger.warn( -579 "Missing TLS configuration. Generating a self-signed certificate for TLS support."); -580 sb.tlsSelfSigned(); -581 } -582 } catch (Exception e) { -583 Exceptions.throwUnsafely(e); -584 } -585 } -586 -587 sb.clientAddressSources(cfg.clientAddressSourceList()); -588 sb.clientAddressTrustedProxyFilter(cfg.trustedProxyAddressPredicate()); -589 -590 cfg.numWorkers().ifPresent( -591 numWorkers -> sb.workerGroup(EventLoopGroups.newEventLoopGroup(numWorkers), true)); -592 cfg.maxNumConnections().ifPresent(sb::maxNumConnections); -593 cfg.idleTimeoutMillis().ifPresent(sb::idleTimeoutMillis); -594 cfg.requestTimeoutMillis().ifPresent(sb::requestTimeoutMillis); -595 cfg.maxFrameLength().ifPresent(sb::maxRequestLength); -596 cfg.gracefulShutdownTimeout().ifPresent( -597 t -> sb.gracefulShutdownTimeoutMillis(t.quietPeriodMillis(), t.timeoutMillis())); -598 -599 final MetadataService mds = new MetadataService(pm, executor); -600 final WatchService watchService = new WatchService(meterRegistry); -601 final AuthProvider authProvider = createAuthProvider(executor, sessionManager, mds); -602 final ProjectApiManager projectApiManager = new ProjectApiManager(pm, executor, mds); -603 -604 configureThriftService(sb, projectApiManager, executor, watchService, mds); -605 -606 sb.service("/title", webAppTitleFile(cfg.webAppTitle(), SystemInfo.hostname()).asService()); -607 -608 sb.service(HEALTH_CHECK_PATH, HealthCheckService.builder() -609 .checkers(serverHealth) -610 .build()); -611 -612 sb.serviceUnder("/docs/", -613 DocService.builder() -614 .exampleHeaders(CentralDogmaService.class, -615 HttpHeaders.of(HttpHeaderNames.AUTHORIZATION, -616 "Bearer " + CsrfToken.ANONYMOUS)) -617 .build()); -618 -619 configureHttpApi(sb, projectApiManager, executor, watchService, mds, authProvider, sessionManager, -620 meterRegistry); -621 -622 configureMetrics(sb, meterRegistry); -623 // Add the CORS service as the last decorator(executed first) so that the CORS service is applied -624 // before AuthService. -625 configCors(sb, config().corsConfig()); -626 -627 // Configure access log format. -628 final String accessLogFormat = cfg.accessLogFormat(); -629 if (isNullOrEmpty(accessLogFormat)) { -630 sb.accessLogWriter(AccessLogWriter.disabled(), true); -631 } else if ("common".equals(accessLogFormat)) { -632 sb.accessLogWriter(AccessLogWriter.common(), true); -633 } else if ("combined".equals(accessLogFormat)) { -634 sb.accessLogWriter(AccessLogWriter.combined(), true); -635 } else { -636 sb.accessLogFormat(accessLogFormat); -637 } -638 -639 if (pluginsForAllReplicas != null) { -640 final PluginInitContext pluginInitContext = -641 new PluginInitContext(config(), pm, executor, meterRegistry, purgeWorker, sb, -642 projectInitializer); -643 pluginsForAllReplicas.plugins() -644 .forEach(p -> { -645 if (!(p instanceof AllReplicasPlugin)) { -646 return; -647 } -648 final AllReplicasPlugin plugin = (AllReplicasPlugin) p; -649 plugin.init(pluginInitContext); -650 }); -651 } -652 // Configure the uncaught exception handler just before starting the server so that override the -653 // default exception handler set by third-party libraries such as NIOServerCnxnFactory. -654 Thread.setDefaultUncaughtExceptionHandler((t, e) -> logger.warn("Uncaught exception: {}", t, e)); -655 -656 final Server s = sb.build(); -657 s.start().join(); -658 return s; -659 } -660 -661 static HttpFile webAppTitleFile(@Nullable String webAppTitle, String hostname) { -662 requireNonNull(hostname, "hostname"); -663 final Map<String, String> titleAndHostname = ImmutableMap.of( -664 "title", firstNonNull(webAppTitle, "Central Dogma at {{hostname}}"), -665 "hostname", hostname); -666 -667 try { -668 final HttpData data = HttpData.ofUtf8(Jackson.writeValueAsString(titleAndHostname)); -669 return HttpFile.builder(data) -670 .contentType(MediaType.JSON_UTF_8) -671 .cacheControl(ServerCacheControl.REVALIDATED) -672 .build(); -673 } catch (JsonProcessingException e) { -674 throw new Error("Failed to encode the title and hostname:", e); -675 } -676 } -677 -678 @Nullable -679 private AuthProvider createAuthProvider( -680 CommandExecutor commandExecutor, @Nullable SessionManager sessionManager, MetadataService mds) { -681 final AuthConfig authCfg = cfg.authConfig(); -682 if (authCfg == null) { -683 return null; -684 } -685 -686 checkState(sessionManager != null, "SessionManager is null"); -687 final AuthProviderParameters parameters = new AuthProviderParameters( -688 // Find application first, then find the session token. -689 new ApplicationTokenAuthorizer(mds::findTokenBySecret).orElse( -690 new SessionTokenAuthorizer(sessionManager, authCfg.administrators())), -691 cfg, -692 sessionManager::generateSessionId, -693 // Propagate login and logout events to the other replicas. -694 session -> commandExecutor.execute(Command.createSession(session)), -695 sessionId -> commandExecutor.execute(Command.removeSession(sessionId))); -696 return authCfg.factory().create(parameters); -697 } -698 -699 private CommandExecutor newZooKeeperCommandExecutor( -700 ProjectManager pm, Executor repositoryWorker, -701 ServerStatusManager serverStatusManager, -702 MeterRegistry meterRegistry, -703 @Nullable SessionManager sessionManager, -704 @Nullable Consumer<CommandExecutor> onTakeLeadership, -705 @Nullable Consumer<CommandExecutor> onReleaseLeadership) { -706 final ZooKeeperReplicationConfig zkCfg = (ZooKeeperReplicationConfig) cfg.replicationConfig(); -707 -708 // Delete the old UUID replica ID which is not used anymore. -709 final File dataDir = cfg.dataDir(); -710 new File(dataDir, "replica_id").delete(); -711 -712 // TODO(trustin): Provide a way to restart/reload the replicator -713 // so that we can recover from ZooKeeper maintenance automatically. -714 return new ZooKeeperCommandExecutor( -715 zkCfg, dataDir, -716 new StandaloneCommandExecutor(pm, repositoryWorker, serverStatusManager, sessionManager, -717 /* onTakeLeadership */ null, /* onReleaseLeadership */ null), -718 meterRegistry, pm, config().writeQuotaPerRepository(), onTakeLeadership, onReleaseLeadership); -719 } -720 -721 private void configureThriftService(ServerBuilder sb, ProjectApiManager projectApiManager, -722 CommandExecutor executor, -723 WatchService watchService, MetadataService mds) { -724 final CentralDogmaServiceImpl service = -725 new CentralDogmaServiceImpl(projectApiManager, executor, watchService, mds); -726 -727 HttpService thriftService = -728 ThriftCallService.of(service) -729 .decorate(CentralDogmaTimeoutScheduler::new) -730 .decorate(CentralDogmaExceptionTranslator::new) -731 .decorate(THttpService.newDecorator()); -732 -733 if (cfg.isCsrfTokenRequiredForThrift()) { -734 thriftService = thriftService.decorate(AuthService.newDecorator(new CsrfTokenAuthorizer())); -735 } else { -736 thriftService = thriftService.decorate(TokenlessClientLogger::new); -737 } -738 -739 // Enable content compression for API responses. -740 thriftService = thriftService.decorate(contentEncodingDecorator()); -741 -742 sb.service("/cd/thrift/v1", thriftService); -743 } -744 -745 private void configureHttpApi(ServerBuilder sb, -746 ProjectApiManager projectApiManager, CommandExecutor executor, -747 WatchService watchService, MetadataService mds, -748 @Nullable AuthProvider authProvider, -749 @Nullable SessionManager sessionManager, MeterRegistry meterRegistry) { -750 Function<? super HttpService, ? extends HttpService> decorator; -751 -752 if (authProvider != null) { -753 sb.service("/security_enabled", new AbstractHttpService() { -754 @Override -755 protected HttpResponse doGet(ServiceRequestContext ctx, HttpRequest req) { -756 return HttpResponse.of(HttpStatus.OK); -757 } -758 }); -759 -760 final AuthConfig authCfg = cfg.authConfig(); -761 assert authCfg != null : "authCfg"; -762 assert sessionManager != null : "sessionManager"; -763 final Authorizer<HttpRequest> tokenAuthorizer = -764 new ApplicationTokenAuthorizer(mds::findTokenBySecret) -765 .orElse(new SessionTokenAuthorizer(sessionManager, -766 authCfg.administrators())); -767 decorator = MetadataServiceInjector -768 .newDecorator(mds) -769 .andThen(AuthService.builder() -770 .add(tokenAuthorizer) -771 .onFailure(new CentralDogmaAuthFailureHandler()) -772 .newDecorator()); -773 } else { -774 decorator = MetadataServiceInjector -775 .newDecorator(mds) -776 .andThen(AuthService.newDecorator(new CsrfTokenAuthorizer())); -777 } -778 -779 final DependencyInjector dependencyInjector = DependencyInjector.ofSingletons( -780 // Use the default ObjectMapper without any configuration. -781 // See JacksonRequestConverterFunctionTest -782 new JacksonRequestConverterFunction(new ObjectMapper()), -783 new HttpApiRequestConverter(projectApiManager) -784 ); -785 sb.dependencyInjector(dependencyInjector, false) -786 // TODO(ikhoon): Consider exposing ReflectiveDependencyInjector as a public API via -787 // DependencyInjector.ofReflective() -788 .dependencyInjector(new ReflectiveDependencyInjector(), false); -789 -790 // Enable content compression for API responses. -791 decorator = decorator.andThen(contentEncodingDecorator()); -792 for (String path : ImmutableList.of(API_V0_PATH_PREFIX, API_V1_PATH_PREFIX)) { -793 final DecoratingServiceBindingBuilder decoratorBuilder = -794 sb.routeDecorator().pathPrefix(path); -795 for (Route loginRoute : LOGIN_API_ROUTES) { -796 decoratorBuilder.exclude(loginRoute); -797 } -798 for (Route logoutRoute : LOGOUT_API_ROUTES) { -799 decoratorBuilder.exclude(logoutRoute); -800 } -801 decoratorBuilder.build(decorator); -802 } -803 -804 assert statusManager != null; -805 final ContextPathServicesBuilder apiV0ServiceBuilder = sb.contextPath(API_V0_PATH_PREFIX); -806 final ContextPathServicesBuilder apiV1ServiceBuilder = sb.contextPath(API_V1_PATH_PREFIX); -807 apiV1ServiceBuilder -808 .annotatedService(new AdministrativeService(executor, statusManager)) -809 .annotatedService(new ProjectServiceV1(projectApiManager, executor)) -810 .annotatedService(new RepositoryServiceV1(executor, mds)); -811 -812 if (GIT_MIRROR_ENABLED) { -813 apiV1ServiceBuilder.annotatedService(new MirroringServiceV1(projectApiManager, executor)) -814 .annotatedService(new CredentialServiceV1(projectApiManager, executor)); -815 } -816 -817 apiV1ServiceBuilder.annotatedService() -818 .defaultServiceNaming(new ServiceNaming() { -819 private final String serviceName = ContentServiceV1.class.getName(); -820 private final String watchServiceName = -821 serviceName.replace("ContentServiceV1", "WatchContentServiceV1"); -822 -823 @Override -824 public String serviceName(ServiceRequestContext ctx) { -825 if (ctx.request().headers().contains(HttpHeaderNames.IF_NONE_MATCH)) { -826 return watchServiceName; -827 } -828 return serviceName; -829 } -830 }) -831 .build(new ContentServiceV1(executor, watchService, meterRegistry)); -832 -833 sb.annotatedService() -834 .decorator(decorator) -835 .decorator(DecodingService.newDecorator()) -836 .build(new GitHttpService(projectApiManager)); -837 -838 if (authProvider != null) { -839 final AuthConfig authCfg = cfg.authConfig(); -840 assert authCfg != null : "authCfg"; -841 apiV1ServiceBuilder -842 .annotatedService(new MetadataApiService(executor, mds, authCfg.loginNameNormalizer())) -843 .annotatedService(new TokenService(executor, mds)); -844 -845 // authentication services: -846 Optional.ofNullable(authProvider.loginApiService()) -847 .ifPresent(login -> LOGIN_API_ROUTES.forEach(mapping -> sb.service(mapping, login))); -848 -849 // Provide logout API by default. -850 final HttpService logout = -851 Optional.ofNullable(authProvider.logoutApiService()) -852 .orElseGet(() -> new DefaultLogoutService(executor)); -853 for (Route route : LOGOUT_API_ROUTES) { -854 sb.service(route, decorator.apply(logout)); -855 } -856 -857 authProvider.moreServices().forEach(sb::service); -858 } -859 -860 if (cfg.isWebAppEnabled()) { -861 apiV0ServiceBuilder -862 .annotatedService(new UserService(executor)) -863 .annotatedService(new RepositoryService(projectApiManager, executor)); -864 -865 if (authProvider != null) { -866 // Will redirect to /web/auth/login by default. -867 sb.service(LOGIN_PATH, authProvider.webLoginService()); -868 // Will redirect to /web/auth/logout by default. -869 sb.service(LOGOUT_PATH, authProvider.webLogoutService()); -870 } -871 -872 // Folder names contain path patterns such as `[projectName]` which FileService can't infer from -873 // the request path. Return `index.html` as a fallback so that Next.js client router handles the -874 // path patterns. -875 final HttpService fallbackFileService = HttpFile.of(CentralDogma.class.getClassLoader(), -876 "com/linecorp/centraldogma/webapp/index.html") -877 .asService(); -878 sb.serviceUnder("/app", FileService.builder(CentralDogma.class.getClassLoader(), -879 "com/linecorp/centraldogma/webapp/app") -880 .cacheControl(ServerCacheControl.REVALIDATED) -881 .autoDecompress(true) -882 .serveCompressedFiles(true) -883 .build().orElse(fallbackFileService)); -884 -885 // Serve all web resources except for '/app'. -886 sb.route() -887 .pathPrefix("/") -888 .exclude("/app") -889 .build(FileService.builder(CentralDogma.class.getClassLoader(), -890 "com/linecorp/centraldogma/webapp") -891 .cacheControl(ServerCacheControl.REVALIDATED) -892 .autoDecompress(true) -893 .serveCompressedFiles(true) -894 .build()); -895 -896 sb.serviceUnder("/legacy-web", -897 FileService.builder(CentralDogma.class.getClassLoader(), "webapp") -898 .cacheControl(ServerCacheControl.REVALIDATED) -899 .autoDecompress(true) -900 .serveCompressedFiles(true) -901 .build()); -902 } -903 -904 sb.errorHandler(new HttpApiExceptionHandler()); -905 } -906 -907 private static void configCors(ServerBuilder sb, @Nullable CorsConfig corsConfig) { -908 if (corsConfig == null) { -909 return; -910 } -911 -912 sb.decorator(CorsService.builder(corsConfig.allowedOrigins()) -913 .allowRequestMethods(HttpMethod.knownMethods()) -914 .allowAllRequestHeaders(true) -915 .allowCredentials() -916 .maxAge(corsConfig.maxAgeSeconds()) -917 .newDecorator()); -918 } -919 -920 private static Function<? super HttpService, EncodingService> contentEncodingDecorator() { -921 return delegate -> EncodingService -922 .builder() -923 .encodableContentTypes(contentType -> { -924 if ("application".equals(contentType.type())) { -925 final String subtype = contentType.subtype(); -926 switch (subtype) { -927 case "json": -928 case "xml": -929 case "x-thrift": -930 case "x-git-upload-pack-advertisement": -931 case "x-git-upload-pack-result": -932 return true; -933 default: -934 return subtype.endsWith("+json") || -935 subtype.endsWith("+xml") || -936 subtype.startsWith("vnd.apache.thrift."); -937 } -938 } -939 return false; -940 }) -941 .build(delegate); -942 } +86 import com.linecorp.armeria.server.AbstractHttpService; +87 import com.linecorp.armeria.server.HttpService; +88 import com.linecorp.armeria.server.Route; +89 import com.linecorp.armeria.server.Server; +90 import com.linecorp.armeria.server.ServerBuilder; +91 import com.linecorp.armeria.server.ServerPort; +92 import com.linecorp.armeria.server.ServiceNaming; +93 import com.linecorp.armeria.server.ServiceRequestContext; +94 import com.linecorp.armeria.server.annotation.JacksonRequestConverterFunction; +95 import com.linecorp.armeria.server.auth.AuthService; +96 import com.linecorp.armeria.server.auth.Authorizer; +97 import com.linecorp.armeria.server.cors.CorsService; +98 import com.linecorp.armeria.server.docs.DocService; +99 import com.linecorp.armeria.server.encoding.DecodingService; +100 import com.linecorp.armeria.server.encoding.EncodingService; +101 import com.linecorp.armeria.server.file.FileService; +102 import com.linecorp.armeria.server.file.HttpFile; +103 import com.linecorp.armeria.server.healthcheck.HealthCheckService; +104 import com.linecorp.armeria.server.healthcheck.SettableHealthChecker; +105 import com.linecorp.armeria.server.logging.AccessLogWriter; +106 import com.linecorp.armeria.server.metric.MetricCollectingService; +107 import com.linecorp.armeria.server.prometheus.PrometheusExpositionService; +108 import com.linecorp.armeria.server.thrift.THttpService; +109 import com.linecorp.armeria.server.thrift.ThriftCallService; +110 import com.linecorp.centraldogma.common.ShuttingDownException; +111 import com.linecorp.centraldogma.internal.CsrfToken; +112 import com.linecorp.centraldogma.internal.Jackson; +113 import com.linecorp.centraldogma.internal.thrift.CentralDogmaService; +114 import com.linecorp.centraldogma.server.auth.AuthConfig; +115 import com.linecorp.centraldogma.server.auth.AuthProvider; +116 import com.linecorp.centraldogma.server.auth.AuthProviderParameters; +117 import com.linecorp.centraldogma.server.auth.SessionManager; +118 import com.linecorp.centraldogma.server.command.Command; +119 import com.linecorp.centraldogma.server.command.CommandExecutor; +120 import com.linecorp.centraldogma.server.command.StandaloneCommandExecutor; +121 import com.linecorp.centraldogma.server.internal.admin.auth.CachedSessionManager; +122 import com.linecorp.centraldogma.server.internal.admin.auth.CsrfTokenAuthorizer; +123 import com.linecorp.centraldogma.server.internal.admin.auth.ExpiredSessionDeletingSessionManager; +124 import com.linecorp.centraldogma.server.internal.admin.auth.FileBasedSessionManager; +125 import com.linecorp.centraldogma.server.internal.admin.auth.OrElseDefaultHttpFileService; +126 import com.linecorp.centraldogma.server.internal.admin.auth.SessionTokenAuthorizer; +127 import com.linecorp.centraldogma.server.internal.admin.service.DefaultLogoutService; +128 import com.linecorp.centraldogma.server.internal.admin.service.RepositoryService; +129 import com.linecorp.centraldogma.server.internal.admin.service.UserService; +130 import com.linecorp.centraldogma.server.internal.admin.util.RestfulJsonResponseConverter; +131 import com.linecorp.centraldogma.server.internal.api.AdministrativeService; +132 import com.linecorp.centraldogma.server.internal.api.ContentServiceV1; +133 import com.linecorp.centraldogma.server.internal.api.CredentialServiceV1; +134 import com.linecorp.centraldogma.server.internal.api.GitHttpService; +135 import com.linecorp.centraldogma.server.internal.api.MetadataApiService; +136 import com.linecorp.centraldogma.server.internal.api.MirroringServiceV1; +137 import com.linecorp.centraldogma.server.internal.api.ProjectServiceV1; +138 import com.linecorp.centraldogma.server.internal.api.RepositoryServiceV1; +139 import com.linecorp.centraldogma.server.internal.api.TokenService; +140 import com.linecorp.centraldogma.server.internal.api.WatchService; +141 import com.linecorp.centraldogma.server.internal.api.auth.ApplicationTokenAuthorizer; +142 import com.linecorp.centraldogma.server.internal.api.converter.HttpApiRequestConverter; +143 import com.linecorp.centraldogma.server.internal.api.converter.HttpApiResponseConverter; +144 import com.linecorp.centraldogma.server.internal.mirror.DefaultMirroringServicePlugin; +145 import com.linecorp.centraldogma.server.internal.replication.ZooKeeperCommandExecutor; +146 import com.linecorp.centraldogma.server.internal.storage.project.DefaultProjectManager; +147 import com.linecorp.centraldogma.server.internal.storage.project.ProjectApiManager; +148 import com.linecorp.centraldogma.server.internal.storage.repository.MirrorConfig; +149 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaExceptionTranslator; +150 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaServiceImpl; +151 import com.linecorp.centraldogma.server.internal.thrift.CentralDogmaTimeoutScheduler; +152 import com.linecorp.centraldogma.server.internal.thrift.TokenlessClientLogger; +153 import com.linecorp.centraldogma.server.management.ServerStatus; +154 import com.linecorp.centraldogma.server.management.ServerStatusManager; +155 import com.linecorp.centraldogma.server.metadata.MetadataService; +156 import com.linecorp.centraldogma.server.metadata.MetadataServiceInjector; +157 import com.linecorp.centraldogma.server.mirror.MirrorProvider; +158 import com.linecorp.centraldogma.server.plugin.AllReplicasPlugin; +159 import com.linecorp.centraldogma.server.plugin.Plugin; +160 import com.linecorp.centraldogma.server.plugin.PluginInitContext; +161 import com.linecorp.centraldogma.server.plugin.PluginTarget; +162 import com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer; +163 import com.linecorp.centraldogma.server.storage.project.ProjectManager; +164 +165 import io.micrometer.core.instrument.MeterRegistry; +166 import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; +167 import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; +168 import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics; +169 import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; +170 import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; +171 import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; +172 import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; +173 import io.micrometer.core.instrument.binder.system.ProcessorMetrics; +174 import io.micrometer.core.instrument.binder.system.UptimeMetrics; +175 import io.micrometer.core.instrument.composite.CompositeMeterRegistry; +176 import io.micrometer.prometheusmetrics.PrometheusMeterRegistry; +177 import io.netty.util.concurrent.DefaultThreadFactory; +178 import io.netty.util.concurrent.GlobalEventExecutor; +179 +180 /** +181 * Central Dogma server. +182 * +183 * @see CentralDogmaBuilder +184 */ +185 public class CentralDogma implements AutoCloseable { +186 +187 private static final Logger logger = LoggerFactory.getLogger(CentralDogma.class); +188 +189 private static final boolean GIT_MIRROR_ENABLED; +190 +191 static { +192 Jackson.registerModules(new SimpleModule().addSerializer(CacheStats.class, new CacheStatsSerializer())); +193 +194 boolean gitMirrorEnabled = false; +195 for (MirrorProvider mirrorProvider : MirrorConfig.MIRROR_PROVIDERS) { +196 if ("com.linecorp.centraldogma.server.internal.mirror.GitMirrorProvider" +197 .equals(mirrorProvider.getClass().getName())) { +198 gitMirrorEnabled = true; +199 break; +200 } +201 } +202 logger.info("Git mirroring: {}", +203 gitMirrorEnabled ? "enabled" +204 : "disabled ('centraldogma-server-mirror-git' module is not available)"); +205 GIT_MIRROR_ENABLED = gitMirrorEnabled; +206 } +207 +208 /** +209 * Creates a new instance from the given configuration file. +210 * +211 * @throws IOException if failed to load the configuration from the specified file +212 */ +213 public static CentralDogma forConfig(File configFile) throws IOException { +214 requireNonNull(configFile, "configFile"); +215 return new CentralDogma(CentralDogmaConfig.load(configFile), Flags.meterRegistry()); +216 } +217 +218 private final SettableHealthChecker serverHealth = new SettableHealthChecker(false); +219 private final CentralDogmaStartStop startStop; +220 +221 private final AtomicInteger numPendingStopRequests = new AtomicInteger(); +222 +223 @Nullable +224 private final PluginGroup pluginsForAllReplicas; +225 @Nullable +226 private final PluginGroup pluginsForLeaderOnly; +227 +228 private final CentralDogmaConfig cfg; +229 @Nullable +230 private volatile ProjectManager pm; +231 @Nullable +232 private volatile Server server; +233 @Nullable +234 private ExecutorService repositoryWorker; +235 @Nullable +236 private ScheduledExecutorService purgeWorker; +237 @Nullable +238 private CommandExecutor executor; +239 private final MeterRegistry meterRegistry; +240 @Nullable +241 MeterRegistry meterRegistryToBeClosed; +242 @Nullable +243 private SessionManager sessionManager; +244 @Nullable +245 private ServerStatusManager statusManager; +246 @Nullable +247 private InternalProjectInitializer projectInitializer; +248 +249 CentralDogma(CentralDogmaConfig cfg, MeterRegistry meterRegistry) { +250 this.cfg = requireNonNull(cfg, "cfg"); +251 pluginsForAllReplicas = PluginGroup.loadPlugins( +252 CentralDogma.class.getClassLoader(), PluginTarget.ALL_REPLICAS, cfg); +253 pluginsForLeaderOnly = PluginGroup.loadPlugins( +254 CentralDogma.class.getClassLoader(), PluginTarget.LEADER_ONLY, cfg); +255 startStop = new CentralDogmaStartStop(pluginsForAllReplicas); +256 this.meterRegistry = meterRegistry; +257 } +258 +259 /** +260 * Returns the configuration of the server. +261 * +262 * @return the {@link CentralDogmaConfig} instance which is used for configuring this {@link CentralDogma}. +263 */ +264 public CentralDogmaConfig config() { +265 return cfg; +266 } +267 +268 /** +269 * Returns the primary port of the server. +270 * +271 * @return the primary {@link ServerPort} if the server is started. {@link Optional#empty()} otherwise. +272 */ +273 @Nullable +274 public ServerPort activePort() { +275 final Server server = this.server; +276 return server != null ? server.activePort() : null; +277 } +278 +279 /** +280 * Returns the ports of the server. +281 * +282 * @return the {@link Map} which contains the pairs of local {@link InetSocketAddress} and +283 * {@link ServerPort} is the server is started. {@link Optional#empty()} otherwise. +284 */ +285 public Map<InetSocketAddress, ServerPort> activePorts() { +286 final Server server = this.server; +287 if (server != null) { +288 return server.activePorts(); +289 } else { +290 return Collections.emptyMap(); +291 } +292 } +293 +294 /** +295 * Returns the {@link ProjectManager} of the server if the server is started. +296 * {@code null} is returned, otherwise. +297 */ +298 @Nullable +299 public ProjectManager projectManager() { +300 return pm; +301 } +302 +303 /** +304 * Returns the {@link MirroringService} of the server. +305 * +306 * @return the {@link MirroringService} if the server is started and mirroring is enabled. +307 * {@link Optional#empty()} otherwise. +308 */ +309 public Optional<MirroringService> mirroringService() { +310 if (pluginsForLeaderOnly == null) { +311 return Optional.empty(); +312 } +313 return pluginsForLeaderOnly.findFirstPlugin(DefaultMirroringServicePlugin.class) +314 .map(DefaultMirroringServicePlugin::mirroringService); +315 } +316 +317 /** +318 * Returns the {@link Plugin}s which have been loaded. +319 * +320 * @param target the {@link PluginTarget} of the {@link Plugin}s to be returned +321 */ +322 public List<Plugin> plugins(PluginTarget target) { +323 switch (requireNonNull(target, "target")) { +324 case LEADER_ONLY: +325 return pluginsForLeaderOnly != null ? ImmutableList.copyOf(pluginsForLeaderOnly.plugins()) +326 : ImmutableList.of(); +327 case ALL_REPLICAS: +328 return pluginsForAllReplicas != null ? ImmutableList.copyOf(pluginsForAllReplicas.plugins()) +329 : ImmutableList.of(); +330 default: +331 // Should not reach here. +332 throw new Error("Unknown plugin target: " + target); +333 } +334 } +335 +336 /** +337 * Returns the {@link MeterRegistry} that contains the stats related with the server. +338 */ +339 public Optional<MeterRegistry> meterRegistry() { +340 return Optional.ofNullable(meterRegistry); +341 } +342 +343 /** +344 * Starts the server. +345 */ +346 public CompletableFuture<Void> start() { +347 return startStop.start(true); +348 } +349 +350 /** +351 * Stops the server. This method does nothing if the server is stopped already. +352 */ +353 public CompletableFuture<Void> stop() { +354 serverHealth.setHealthy(false); +355 +356 final Optional<GracefulShutdownTimeout> gracefulTimeoutOpt = cfg.gracefulShutdownTimeout(); +357 if (gracefulTimeoutOpt.isPresent()) { +358 try { +359 // Sleep 1 second so that clients have some time to redirect traffic according +360 // to the health status +361 Thread.sleep(1000); +362 } catch (InterruptedException e) { +363 logger.debug("Interrupted while waiting for quiet period", e); +364 Thread.currentThread().interrupt(); +365 } +366 } +367 +368 numPendingStopRequests.incrementAndGet(); +369 return startStop.stop().thenRun(numPendingStopRequests::decrementAndGet); +370 } +371 +372 @Override +373 public void close() { +374 startStop.close(); +375 } +376 +377 private void doStart() throws Exception { +378 boolean success = false; +379 ExecutorService repositoryWorker = null; +380 ScheduledExecutorService purgeWorker = null; +381 ProjectManager pm = null; +382 CommandExecutor executor = null; +383 Server server = null; +384 SessionManager sessionManager = null; +385 try { +386 logger.info("Starting the Central Dogma .."); +387 +388 final ThreadPoolExecutor repositoryWorkerImpl = new ThreadPoolExecutor( +389 cfg.numRepositoryWorkers(), cfg.numRepositoryWorkers(), +390 // TODO(minwoox): Use LinkedTransferQueue when we upgrade to JDK 21. +391 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), +392 new DefaultThreadFactory("repository-worker", true)); +393 repositoryWorkerImpl.allowCoreThreadTimeOut(true); +394 repositoryWorker = ExecutorServiceMetrics.monitor(meterRegistry, repositoryWorkerImpl, +395 "repositoryWorker"); +396 +397 logger.info("Starting the project manager: {}", cfg.dataDir()); +398 +399 purgeWorker = Executors.newSingleThreadScheduledExecutor( +400 new DefaultThreadFactory("purge-worker", true)); +401 +402 pm = new DefaultProjectManager(cfg.dataDir(), repositoryWorker, purgeWorker, +403 meterRegistry, cfg.repositoryCacheSpec()); +404 +405 logger.info("Started the project manager: {}", pm); +406 +407 logger.info("Current settings:\n{}", cfg); +408 +409 sessionManager = initializeSessionManager(); +410 +411 logger.info("Starting the command executor .."); +412 executor = startCommandExecutor(pm, repositoryWorker, purgeWorker, +413 meterRegistry, sessionManager); +414 // The projectInitializer is set in startCommandExecutor. +415 assert projectInitializer != null; +416 if (executor.isWritable()) { +417 logger.info("Started the command executor."); +418 } +419 +420 logger.info("Starting the RPC server."); +421 server = startServer(pm, executor, purgeWorker, meterRegistry, sessionManager, +422 projectInitializer); +423 logger.info("Started the RPC server at: {}", server.activePorts()); +424 logger.info("Started the Central Dogma successfully."); +425 success = true; +426 } finally { +427 if (success) { +428 serverHealth.setHealthy(true); +429 this.repositoryWorker = repositoryWorker; +430 this.purgeWorker = purgeWorker; +431 this.pm = pm; +432 this.executor = executor; +433 this.server = server; +434 this.sessionManager = sessionManager; +435 } else { +436 doStop(server, executor, pm, repositoryWorker, purgeWorker, sessionManager); +437 } +438 } +439 } +440 +441 private CommandExecutor startCommandExecutor( +442 ProjectManager pm, Executor repositoryWorker, +443 ScheduledExecutorService purgeWorker, MeterRegistry meterRegistry, +444 @Nullable SessionManager sessionManager) { +445 +446 final Consumer<CommandExecutor> onTakeLeadership = exec -> { +447 if (pluginsForLeaderOnly != null) { +448 logger.info("Starting plugins on the leader replica .."); +449 pluginsForLeaderOnly +450 .start(cfg, pm, exec, meterRegistry, purgeWorker, projectInitializer) +451 .handle((unused, cause) -> { +452 if (cause == null) { +453 logger.info("Started plugins on the leader replica."); +454 } else { +455 logger.error("Failed to start plugins on the leader replica..", cause); +456 } +457 return null; +458 }); +459 } +460 }; +461 +462 final Consumer<CommandExecutor> onReleaseLeadership = exec -> { +463 if (pluginsForLeaderOnly != null) { +464 logger.info("Stopping plugins on the leader replica .."); +465 pluginsForLeaderOnly.stop(cfg, pm, exec, meterRegistry, purgeWorker, projectInitializer) +466 .handle((unused, cause) -> { +467 if (cause == null) { +468 logger.info("Stopped plugins on the leader replica."); +469 } else { +470 logger.error("Failed to stop plugins on the leader replica.", +471 cause); +472 } +473 return null; +474 }); +475 } +476 }; +477 +478 statusManager = new ServerStatusManager(cfg.dataDir()); +479 logger.info("Startup mode: {}", statusManager.serverStatus()); +480 final CommandExecutor executor; +481 final ReplicationMethod replicationMethod = cfg.replicationConfig().method(); +482 switch (replicationMethod) { +483 case ZOOKEEPER: +484 executor = newZooKeeperCommandExecutor(pm, repositoryWorker, statusManager, meterRegistry, +485 sessionManager, onTakeLeadership, onReleaseLeadership); +486 break; +487 case NONE: +488 logger.info("No replication mechanism specified; entering standalone"); +489 executor = new StandaloneCommandExecutor(pm, repositoryWorker, statusManager, sessionManager, +490 cfg.writeQuotaPerRepository(), +491 onTakeLeadership, onReleaseLeadership); +492 break; +493 default: +494 throw new Error("unknown replication method: " + replicationMethod); +495 } +496 projectInitializer = new InternalProjectInitializer(executor); +497 +498 final ServerStatus initialServerStatus = statusManager.serverStatus(); +499 executor.setWritable(initialServerStatus.writable()); +500 if (!initialServerStatus.replicating()) { +501 projectInitializer.whenInitialized().complete(null); +502 return executor; +503 } +504 try { +505 final CompletableFuture<Void> startFuture = executor.start(); +506 while (!startFuture.isDone()) { +507 if (numPendingStopRequests.get() > 0) { +508 // Stop request has been issued. +509 executor.stop().get(); +510 break; +511 } +512 +513 try { +514 startFuture.get(100, TimeUnit.MILLISECONDS); +515 } catch (TimeoutException unused) { +516 // Taking long time .. +517 } +518 } +519 +520 // Trigger the exception if any. +521 startFuture.get(); +522 projectInitializer.initialize(); +523 } catch (Exception e) { +524 projectInitializer.whenInitialized().complete(null); +525 logger.warn("Failed to start the command executor. Entering read-only.", e); +526 } +527 +528 return executor; +529 } +530 +531 @Nullable +532 private SessionManager initializeSessionManager() throws Exception { +533 final AuthConfig authCfg = cfg.authConfig(); +534 if (authCfg == null) { +535 return null; +536 } +537 +538 boolean success = false; +539 SessionManager manager = null; +540 try { +541 manager = new FileBasedSessionManager(new File(cfg.dataDir(), "_sessions").toPath(), +542 authCfg.sessionValidationSchedule()); +543 manager = new CachedSessionManager(manager, Caffeine.from(authCfg.sessionCacheSpec()).build()); +544 manager = new ExpiredSessionDeletingSessionManager(manager); +545 success = true; +546 return manager; +547 } finally { +548 if (!success && manager != null) { +549 try { +550 // It will eventually close FileBasedSessionManager because the other managers just forward +551 // the close method call to their delegate. +552 manager.close(); +553 } catch (Exception e) { +554 logger.warn("Failed to close a session manager.", e); +555 } +556 } +557 } +558 } +559 +560 private Server startServer(ProjectManager pm, CommandExecutor executor, +561 ScheduledExecutorService purgeWorker, MeterRegistry meterRegistry, +562 @Nullable SessionManager sessionManager, +563 InternalProjectInitializer projectInitializer) { +564 final ServerBuilder sb = Server.builder(); +565 sb.verboseResponses(true); +566 cfg.ports().forEach(sb::port); +567 +568 if (cfg.ports().stream().anyMatch(ServerPort::hasTls)) { +569 try { +570 final TlsConfig tlsConfig = cfg.tls(); +571 if (tlsConfig != null) { +572 try (InputStream keyCertChainInputStream = tlsConfig.keyCertChainInputStream(); +573 InputStream keyInputStream = tlsConfig.keyInputStream()) { +574 sb.tls(keyCertChainInputStream, keyInputStream, tlsConfig.keyPassword()); +575 } +576 } else { +577 logger.warn( +578 "Missing TLS configuration. Generating a self-signed certificate for TLS support."); +579 sb.tlsSelfSigned(); +580 } +581 } catch (Exception e) { +582 Exceptions.throwUnsafely(e); +583 } +584 } +585 +586 sb.clientAddressSources(cfg.clientAddressSourceList()); +587 sb.clientAddressTrustedProxyFilter(cfg.trustedProxyAddressPredicate()); +588 +589 configCors(sb, config().corsConfig()); +590 +591 cfg.numWorkers().ifPresent( +592 numWorkers -> sb.workerGroup(EventLoopGroups.newEventLoopGroup(numWorkers), true)); +593 cfg.maxNumConnections().ifPresent(sb::maxNumConnections); +594 cfg.idleTimeoutMillis().ifPresent(sb::idleTimeoutMillis); +595 cfg.requestTimeoutMillis().ifPresent(sb::requestTimeoutMillis); +596 cfg.maxFrameLength().ifPresent(sb::maxRequestLength); +597 cfg.gracefulShutdownTimeout().ifPresent( +598 t -> sb.gracefulShutdownTimeoutMillis(t.quietPeriodMillis(), t.timeoutMillis())); +599 +600 final MetadataService mds = new MetadataService(pm, executor); +601 final WatchService watchService = new WatchService(meterRegistry); +602 final AuthProvider authProvider = createAuthProvider(executor, sessionManager, mds); +603 final ProjectApiManager projectApiManager = new ProjectApiManager(pm, executor, mds); +604 +605 configureThriftService(sb, projectApiManager, executor, watchService, mds); +606 +607 sb.service("/title", webAppTitleFile(cfg.webAppTitle(), SystemInfo.hostname()).asService()); +608 +609 sb.service(HEALTH_CHECK_PATH, HealthCheckService.builder() +610 .checkers(serverHealth) +611 .build()); +612 +613 sb.serviceUnder("/docs/", +614 DocService.builder() +615 .exampleHeaders(CentralDogmaService.class, +616 HttpHeaders.of(HttpHeaderNames.AUTHORIZATION, +617 "Bearer " + CsrfToken.ANONYMOUS)) +618 .build()); +619 +620 configureHttpApi(sb, projectApiManager, executor, watchService, mds, authProvider, sessionManager, +621 meterRegistry); +622 +623 configureMetrics(sb, meterRegistry); +624 +625 // Configure access log format. +626 final String accessLogFormat = cfg.accessLogFormat(); +627 if (isNullOrEmpty(accessLogFormat)) { +628 sb.accessLogWriter(AccessLogWriter.disabled(), true); +629 } else if ("common".equals(accessLogFormat)) { +630 sb.accessLogWriter(AccessLogWriter.common(), true); +631 } else if ("combined".equals(accessLogFormat)) { +632 sb.accessLogWriter(AccessLogWriter.combined(), true); +633 } else { +634 sb.accessLogFormat(accessLogFormat); +635 } +636 +637 if (pluginsForAllReplicas != null) { +638 final PluginInitContext pluginInitContext = +639 new PluginInitContext(config(), pm, executor, meterRegistry, purgeWorker, sb, +640 projectInitializer); +641 pluginsForAllReplicas.plugins() +642 .forEach(p -> { +643 if (!(p instanceof AllReplicasPlugin)) { +644 return; +645 } +646 final AllReplicasPlugin plugin = (AllReplicasPlugin) p; +647 plugin.init(pluginInitContext); +648 }); +649 } +650 // Configure the uncaught exception handler just before starting the server so that override the +651 // default exception handler set by third-party libraries such as NIOServerCnxnFactory. +652 Thread.setDefaultUncaughtExceptionHandler((t, e) -> logger.warn("Uncaught exception: {}", t, e)); +653 +654 final Server s = sb.build(); +655 s.start().join(); +656 return s; +657 } +658 +659 static HttpFile webAppTitleFile(@Nullable String webAppTitle, String hostname) { +660 requireNonNull(hostname, "hostname"); +661 final Map<String, String> titleAndHostname = ImmutableMap.of( +662 "title", firstNonNull(webAppTitle, "Central Dogma at {{hostname}}"), +663 "hostname", hostname); +664 +665 try { +666 final HttpData data = HttpData.ofUtf8(Jackson.writeValueAsString(titleAndHostname)); +667 return HttpFile.builder(data) +668 .contentType(MediaType.JSON_UTF_8) +669 .cacheControl(ServerCacheControl.REVALIDATED) +670 .build(); +671 } catch (JsonProcessingException e) { +672 throw new Error("Failed to encode the title and hostname:", e); +673 } +674 } +675 +676 @Nullable +677 private AuthProvider createAuthProvider( +678 CommandExecutor commandExecutor, @Nullable SessionManager sessionManager, MetadataService mds) { +679 final AuthConfig authCfg = cfg.authConfig(); +680 if (authCfg == null) { +681 return null; +682 } +683 +684 checkState(sessionManager != null, "SessionManager is null"); +685 final AuthProviderParameters parameters = new AuthProviderParameters( +686 // Find application first, then find the session token. +687 new ApplicationTokenAuthorizer(mds::findTokenBySecret).orElse( +688 new SessionTokenAuthorizer(sessionManager, authCfg.administrators())), +689 cfg, +690 sessionManager::generateSessionId, +691 // Propagate login and logout events to the other replicas. +692 session -> commandExecutor.execute(Command.createSession(session)), +693 sessionId -> commandExecutor.execute(Command.removeSession(sessionId))); +694 return authCfg.factory().create(parameters); +695 } +696 +697 private CommandExecutor newZooKeeperCommandExecutor( +698 ProjectManager pm, Executor repositoryWorker, +699 ServerStatusManager serverStatusManager, +700 MeterRegistry meterRegistry, +701 @Nullable SessionManager sessionManager, +702 @Nullable Consumer<CommandExecutor> onTakeLeadership, +703 @Nullable Consumer<CommandExecutor> onReleaseLeadership) { +704 final ZooKeeperReplicationConfig zkCfg = (ZooKeeperReplicationConfig) cfg.replicationConfig(); +705 +706 // Delete the old UUID replica ID which is not used anymore. +707 final File dataDir = cfg.dataDir(); +708 new File(dataDir, "replica_id").delete(); +709 +710 // TODO(trustin): Provide a way to restart/reload the replicator +711 // so that we can recover from ZooKeeper maintenance automatically. +712 return new ZooKeeperCommandExecutor( +713 zkCfg, dataDir, +714 new StandaloneCommandExecutor(pm, repositoryWorker, serverStatusManager, sessionManager, +715 /* onTakeLeadership */ null, /* onReleaseLeadership */ null), +716 meterRegistry, pm, config().writeQuotaPerRepository(), onTakeLeadership, onReleaseLeadership); +717 } +718 +719 private void configureThriftService(ServerBuilder sb, ProjectApiManager projectApiManager, +720 CommandExecutor executor, +721 WatchService watchService, MetadataService mds) { +722 final CentralDogmaServiceImpl service = +723 new CentralDogmaServiceImpl(projectApiManager, executor, watchService, mds); +724 +725 HttpService thriftService = +726 ThriftCallService.of(service) +727 .decorate(CentralDogmaTimeoutScheduler::new) +728 .decorate(CentralDogmaExceptionTranslator::new) +729 .decorate(THttpService.newDecorator()); +730 +731 if (cfg.isCsrfTokenRequiredForThrift()) { +732 thriftService = thriftService.decorate(AuthService.newDecorator(new CsrfTokenAuthorizer())); +733 } else { +734 thriftService = thriftService.decorate(TokenlessClientLogger::new); +735 } +736 +737 // Enable content compression for API responses. +738 thriftService = thriftService.decorate(contentEncodingDecorator()); +739 +740 sb.service("/cd/thrift/v1", thriftService); +741 } +742 +743 private void configureHttpApi(ServerBuilder sb, +744 ProjectApiManager projectApiManager, CommandExecutor executor, +745 WatchService watchService, MetadataService mds, +746 @Nullable AuthProvider authProvider, +747 @Nullable SessionManager sessionManager, MeterRegistry meterRegistry) { +748 Function<? super HttpService, ? extends HttpService> decorator; +749 +750 if (authProvider != null) { +751 sb.service("/security_enabled", new AbstractHttpService() { +752 @Override +753 protected HttpResponse doGet(ServiceRequestContext ctx, HttpRequest req) { +754 return HttpResponse.of(HttpStatus.OK); +755 } +756 }); +757 +758 final AuthConfig authCfg = cfg.authConfig(); +759 assert authCfg != null : "authCfg"; +760 assert sessionManager != null : "sessionManager"; +761 final Authorizer<HttpRequest> tokenAuthorizer = +762 new ApplicationTokenAuthorizer(mds::findTokenBySecret) +763 .orElse(new SessionTokenAuthorizer(sessionManager, +764 authCfg.administrators())); +765 decorator = MetadataServiceInjector +766 .newDecorator(mds) +767 .andThen(AuthService.builder() +768 .add(tokenAuthorizer) +769 .onFailure(new CentralDogmaAuthFailureHandler()) +770 .newDecorator()); +771 } else { +772 decorator = MetadataServiceInjector +773 .newDecorator(mds) +774 .andThen(AuthService.newDecorator(new CsrfTokenAuthorizer())); +775 } +776 +777 final HttpApiRequestConverter v1RequestConverter = new HttpApiRequestConverter(projectApiManager); +778 final JacksonRequestConverterFunction jacksonRequestConverterFunction = +779 // Use the default ObjectMapper without any configuration. +780 // See JacksonRequestConverterFunctionTest +781 new JacksonRequestConverterFunction(new ObjectMapper()); +782 // Do not need jacksonResponseConverterFunction because HttpApiResponseConverter handles the JSON data. +783 final HttpApiResponseConverter v1ResponseConverter = new HttpApiResponseConverter(); +784 +785 // Enable content compression for API responses. +786 decorator = decorator.andThen(contentEncodingDecorator()); +787 +788 assert statusManager != null; +789 sb.annotatedService(API_V1_PATH_PREFIX, +790 new AdministrativeService(executor, statusManager), decorator, +791 v1RequestConverter, jacksonRequestConverterFunction, v1ResponseConverter); +792 sb.annotatedService(API_V1_PATH_PREFIX, +793 new ProjectServiceV1(projectApiManager), decorator, +794 v1RequestConverter, jacksonRequestConverterFunction, v1ResponseConverter); +795 sb.annotatedService(API_V1_PATH_PREFIX, +796 new RepositoryServiceV1(executor, mds), decorator, +797 v1RequestConverter, jacksonRequestConverterFunction, v1ResponseConverter); +798 +799 if (GIT_MIRROR_ENABLED) { +800 sb.annotatedService(API_V1_PATH_PREFIX, +801 new MirroringServiceV1(projectApiManager, executor), decorator, +802 v1RequestConverter, jacksonRequestConverterFunction, v1RequestConverter); +803 sb.annotatedService(API_V1_PATH_PREFIX, +804 new CredentialServiceV1(projectApiManager, executor), decorator, +805 v1RequestConverter, jacksonRequestConverterFunction, v1RequestConverter); +806 } +807 +808 sb.annotatedService() +809 .pathPrefix(API_V1_PATH_PREFIX) +810 .defaultServiceNaming(new ServiceNaming() { +811 private final String serviceName = ContentServiceV1.class.getName(); +812 private final String watchServiceName = +813 serviceName.replace("ContentServiceV1", "WatchContentServiceV1"); +814 +815 @Override +816 public String serviceName(ServiceRequestContext ctx) { +817 if (ctx.request().headers().contains(HttpHeaderNames.IF_NONE_MATCH)) { +818 return watchServiceName; +819 } +820 return serviceName; +821 } +822 }) +823 .decorator(decorator) +824 .requestConverters(v1RequestConverter, jacksonRequestConverterFunction) +825 .responseConverters(v1ResponseConverter) +826 .build(new ContentServiceV1(executor, watchService, meterRegistry)); +827 +828 sb.annotatedService().decorator(decorator) +829 .decorator(DecodingService.newDecorator()) +830 .build(new GitHttpService(projectApiManager)); +831 +832 if (authProvider != null) { +833 final AuthConfig authCfg = cfg.authConfig(); +834 assert authCfg != null : "authCfg"; +835 sb.annotatedService(API_V1_PATH_PREFIX, +836 new MetadataApiService(mds, authCfg.loginNameNormalizer()), +837 decorator, v1RequestConverter, jacksonRequestConverterFunction, +838 v1ResponseConverter); +839 sb.annotatedService(API_V1_PATH_PREFIX, new TokenService(executor, mds), +840 decorator, v1RequestConverter, jacksonRequestConverterFunction, +841 v1ResponseConverter); +842 +843 // authentication services: +844 Optional.ofNullable(authProvider.loginApiService()) +845 .ifPresent(login -> LOGIN_API_ROUTES.forEach(mapping -> sb.service(mapping, login))); +846 +847 // Provide logout API by default. +848 final HttpService logout = +849 Optional.ofNullable(authProvider.logoutApiService()) +850 .orElseGet(() -> new DefaultLogoutService(executor)); +851 for (Route route : LOGOUT_API_ROUTES) { +852 sb.service(route, decorator.apply(logout)); +853 } +854 +855 authProvider.moreServices().forEach(sb::service); +856 } +857 +858 if (cfg.isWebAppEnabled()) { +859 final RestfulJsonResponseConverter httpApiV0Converter = new RestfulJsonResponseConverter(); +860 +861 // TODO(hyangtack): Simplify this if https://github.com/line/armeria/issues/582 is resolved. +862 sb.annotatedService(API_V0_PATH_PREFIX, new UserService(executor), +863 decorator, jacksonRequestConverterFunction, httpApiV0Converter) +864 .annotatedService(API_V0_PATH_PREFIX, new RepositoryService(projectApiManager, executor), +865 decorator, jacksonRequestConverterFunction, httpApiV0Converter); +866 +867 if (authProvider != null) { +868 // Will redirect to /web/auth/login by default. +869 sb.service(LOGIN_PATH, authProvider.webLoginService()); +870 // Will redirect to /web/auth/logout by default. +871 sb.service(LOGOUT_PATH, authProvider.webLogoutService()); +872 +873 sb.serviceUnder(BUILTIN_WEB_BASE_PATH, new OrElseDefaultHttpFileService( +874 FileService.builder(CentralDogma.class.getClassLoader(), "auth-webapp") +875 .autoDecompress(true) +876 .serveCompressedFiles(true) +877 .cacheControl(ServerCacheControl.REVALIDATED) +878 .build(), +879 "/index.html")); +880 } +881 sb.serviceUnder("/", +882 FileService.builder(CentralDogma.class.getClassLoader(), "webapp") +883 .cacheControl(ServerCacheControl.REVALIDATED) +884 .build()); +885 } +886 } +887 +888 private static void configCors(ServerBuilder sb, @Nullable CorsConfig corsConfig) { +889 if (corsConfig == null) { +890 return; +891 } +892 +893 sb.decorator(CorsService.builder(corsConfig.allowedOrigins()) +894 .allowRequestMethods(HttpMethod.knownMethods()) +895 .allowAllRequestHeaders(true) +896 .allowCredentials() +897 .maxAge(corsConfig.maxAgeSeconds()) +898 .newDecorator()); +899 } +900 +901 private static Function<? super HttpService, EncodingService> contentEncodingDecorator() { +902 return delegate -> EncodingService +903 .builder() +904 .encodableContentTypes(contentType -> { +905 if ("application".equals(contentType.type())) { +906 final String subtype = contentType.subtype(); +907 switch (subtype) { +908 case "json": +909 case "xml": +910 case "x-thrift": +911 case "x-git-upload-pack-advertisement": +912 case "x-git-upload-pack-result": +913 return true; +914 default: +915 return subtype.endsWith("+json") || +916 subtype.endsWith("+xml") || +917 subtype.startsWith("vnd.apache.thrift."); +918 } +919 } +920 return false; +921 }) +922 .build(delegate); +923 } +924 +925 private void configureMetrics(ServerBuilder sb, MeterRegistry registry) { +926 sb.meterRegistry(registry); +927 +928 // expose the prometheus endpoint if the registry is either a PrometheusMeterRegistry or +929 // CompositeMeterRegistry +930 if (registry instanceof PrometheusMeterRegistry) { +931 final PrometheusMeterRegistry prometheusMeterRegistry = (PrometheusMeterRegistry) registry; +932 sb.service(METRICS_PATH, +933 PrometheusExpositionService.of(prometheusMeterRegistry.getPrometheusRegistry())); +934 } else if (registry instanceof CompositeMeterRegistry) { +935 final PrometheusMeterRegistry prometheusMeterRegistry = PrometheusMeterRegistries.newRegistry(); +936 ((CompositeMeterRegistry) registry).add(prometheusMeterRegistry); +937 sb.service(METRICS_PATH, +938 PrometheusExpositionService.of(prometheusMeterRegistry.getPrometheusRegistry())); +939 meterRegistryToBeClosed = prometheusMeterRegistry; +940 } else { +941 logger.info("Not exposing a prometheus endpoint for the type: {}", registry.getClass()); +942 } 943 -944 private void configureMetrics(ServerBuilder sb, MeterRegistry registry) { -945 sb.meterRegistry(registry); -946 -947 // expose the prometheus endpoint if the registry is either a PrometheusMeterRegistry or -948 // CompositeMeterRegistry -949 if (registry instanceof PrometheusMeterRegistry) { -950 final PrometheusMeterRegistry prometheusMeterRegistry = (PrometheusMeterRegistry) registry; -951 sb.service(METRICS_PATH, -952 PrometheusExpositionService.of(prometheusMeterRegistry.getPrometheusRegistry())); -953 } else if (registry instanceof CompositeMeterRegistry) { -954 final PrometheusMeterRegistry prometheusMeterRegistry = PrometheusMeterRegistries.newRegistry(); -955 ((CompositeMeterRegistry) registry).add(prometheusMeterRegistry); -956 sb.service(METRICS_PATH, -957 PrometheusExpositionService.of(prometheusMeterRegistry.getPrometheusRegistry())); -958 meterRegistryToBeClosed = prometheusMeterRegistry; -959 } else { -960 logger.info("Not exposing a prometheus endpoint for the type: {}", registry.getClass()); -961 } -962 -963 sb.decorator(MetricCollectingService.newDecorator(MeterIdPrefixFunction.ofDefault("api"))); +944 sb.decorator(MetricCollectingService.newDecorator(MeterIdPrefixFunction.ofDefault("api"))); +945 +946 // Bind system metrics. +947 new FileDescriptorMetrics().bindTo(registry); +948 new ProcessorMetrics().bindTo(registry); +949 new ClassLoaderMetrics().bindTo(registry); +950 new UptimeMetrics().bindTo(registry); +951 new DiskSpaceMetrics(cfg.dataDir()).bindTo(registry); +952 new JvmGcMetrics().bindTo(registry); +953 new JvmMemoryMetrics().bindTo(registry); +954 new JvmThreadMetrics().bindTo(registry); +955 +956 // Bind global thread pool metrics. +957 ExecutorServiceMetrics.monitor(registry, ForkJoinPool.commonPool(), "commonPool"); +958 } +959 +960 private void doStop() { +961 if (server == null) { +962 return; +963 } 964 -965 // Bind system metrics. -966 new FileDescriptorMetrics().bindTo(registry); -967 new ProcessorMetrics().bindTo(registry); -968 new ClassLoaderMetrics().bindTo(registry); -969 new UptimeMetrics().bindTo(registry); -970 new DiskSpaceMetrics(cfg.dataDir()).bindTo(registry); -971 new JvmGcMetrics().bindTo(registry); -972 new JvmMemoryMetrics().bindTo(registry); -973 new JvmThreadMetrics().bindTo(registry); -974 -975 // Bind global thread pool metrics. -976 ExecutorServiceMetrics.monitor(registry, ForkJoinPool.commonPool(), "commonPool"); -977 } -978 -979 private void doStop() { -980 if (server == null) { -981 return; -982 } -983 -984 final Server server = this.server; -985 final CommandExecutor executor = this.executor; -986 final ProjectManager pm = this.pm; -987 final ExecutorService repositoryWorker = this.repositoryWorker; -988 final ExecutorService purgeWorker = this.purgeWorker; -989 final SessionManager sessionManager = this.sessionManager; -990 -991 this.server = null; -992 this.executor = null; -993 this.pm = null; -994 this.repositoryWorker = null; -995 this.sessionManager = null; -996 projectInitializer = null; -997 if (meterRegistryToBeClosed != null) { -998 assert meterRegistry instanceof CompositeMeterRegistry; -999 ((CompositeMeterRegistry) meterRegistry).remove(meterRegistryToBeClosed); -1000 meterRegistryToBeClosed.close(); -1001 meterRegistryToBeClosed = null; -1002 } -1003 -1004 logger.info("Stopping the Central Dogma .."); -1005 if (!doStop(server, executor, pm, repositoryWorker, purgeWorker, sessionManager)) { -1006 logger.warn("Stopped the Central Dogma with failure."); -1007 } else { -1008 logger.info("Stopped the Central Dogma successfully."); +965 final Server server = this.server; +966 final CommandExecutor executor = this.executor; +967 final ProjectManager pm = this.pm; +968 final ExecutorService repositoryWorker = this.repositoryWorker; +969 final ExecutorService purgeWorker = this.purgeWorker; +970 final SessionManager sessionManager = this.sessionManager; +971 +972 this.server = null; +973 this.executor = null; +974 this.pm = null; +975 this.repositoryWorker = null; +976 this.sessionManager = null; +977 projectInitializer = null; +978 if (meterRegistryToBeClosed != null) { +979 assert meterRegistry instanceof CompositeMeterRegistry; +980 ((CompositeMeterRegistry) meterRegistry).remove(meterRegistryToBeClosed); +981 meterRegistryToBeClosed.close(); +982 meterRegistryToBeClosed = null; +983 } +984 +985 logger.info("Stopping the Central Dogma .."); +986 if (!doStop(server, executor, pm, repositoryWorker, purgeWorker, sessionManager)) { +987 logger.warn("Stopped the Central Dogma with failure."); +988 } else { +989 logger.info("Stopped the Central Dogma successfully."); +990 } +991 } +992 +993 private static boolean doStop( +994 @Nullable Server server, @Nullable CommandExecutor executor, +995 @Nullable ProjectManager pm, +996 @Nullable ExecutorService repositoryWorker, @Nullable ExecutorService purgeWorker, +997 @Nullable SessionManager sessionManager) { +998 +999 boolean success = true; +1000 try { +1001 if (sessionManager != null) { +1002 logger.info("Stopping the session manager .."); +1003 sessionManager.close(); +1004 logger.info("Stopped the session manager."); +1005 } +1006 } catch (Throwable t) { +1007 success = false; +1008 logger.warn("Failed to stop the session manager:", t); 1009 } -1010 } -1011 -1012 private static boolean doStop( -1013 @Nullable Server server, @Nullable CommandExecutor executor, -1014 @Nullable ProjectManager pm, -1015 @Nullable ExecutorService repositoryWorker, @Nullable ExecutorService purgeWorker, -1016 @Nullable SessionManager sessionManager) { -1017 -1018 boolean success = true; -1019 try { -1020 if (sessionManager != null) { -1021 logger.info("Stopping the session manager .."); -1022 sessionManager.close(); -1023 logger.info("Stopped the session manager."); -1024 } -1025 } catch (Throwable t) { -1026 success = false; -1027 logger.warn("Failed to stop the session manager:", t); -1028 } -1029 -1030 try { -1031 if (pm != null) { -1032 logger.info("Stopping the project manager .."); -1033 pm.close(ShuttingDownException::new); -1034 logger.info("Stopped the project manager."); -1035 } -1036 } catch (Throwable t) { -1037 success = false; -1038 logger.warn("Failed to stop the project manager:", t); -1039 } -1040 -1041 try { -1042 if (executor != null) { -1043 logger.info("Stopping the command executor .."); -1044 executor.stop(); -1045 logger.info("Stopped the command executor."); -1046 } -1047 } catch (Throwable t) { -1048 success = false; -1049 logger.warn("Failed to stop the command executor:", t); -1050 } -1051 -1052 final BiFunction<ExecutorService, String, Boolean> stopWorker = (worker, name) -> { -1053 try { -1054 if (worker != null && !worker.isTerminated()) { -1055 logger.info("Stopping the {} worker ..", name); -1056 boolean interruptLater = false; -1057 while (!worker.isTerminated()) { -1058 worker.shutdownNow(); -1059 try { -1060 worker.awaitTermination(1, TimeUnit.SECONDS); -1061 } catch (InterruptedException e) { -1062 // Interrupt later. -1063 interruptLater = true; -1064 } -1065 } -1066 logger.info("Stopped the {} worker.", name); -1067 -1068 if (interruptLater) { -1069 Thread.currentThread().interrupt(); -1070 } -1071 } -1072 return true; -1073 } catch (Throwable t) { -1074 logger.warn("Failed to stop the " + name + " worker:", t); -1075 return false; -1076 } -1077 }; -1078 if (!stopWorker.apply(repositoryWorker, "repository")) { -1079 success = false; -1080 } -1081 if (!stopWorker.apply(purgeWorker, "purge")) { -1082 success = false; -1083 } +1010 +1011 try { +1012 if (pm != null) { +1013 logger.info("Stopping the project manager .."); +1014 pm.close(ShuttingDownException::new); +1015 logger.info("Stopped the project manager."); +1016 } +1017 } catch (Throwable t) { +1018 success = false; +1019 logger.warn("Failed to stop the project manager:", t); +1020 } +1021 +1022 try { +1023 if (executor != null) { +1024 logger.info("Stopping the command executor .."); +1025 executor.stop(); +1026 logger.info("Stopped the command executor."); +1027 } +1028 } catch (Throwable t) { +1029 success = false; +1030 logger.warn("Failed to stop the command executor:", t); +1031 } +1032 +1033 final BiFunction<ExecutorService, String, Boolean> stopWorker = (worker, name) -> { +1034 try { +1035 if (worker != null && !worker.isTerminated()) { +1036 logger.info("Stopping the {} worker ..", name); +1037 boolean interruptLater = false; +1038 while (!worker.isTerminated()) { +1039 worker.shutdownNow(); +1040 try { +1041 worker.awaitTermination(1, TimeUnit.SECONDS); +1042 } catch (InterruptedException e) { +1043 // Interrupt later. +1044 interruptLater = true; +1045 } +1046 } +1047 logger.info("Stopped the {} worker.", name); +1048 +1049 if (interruptLater) { +1050 Thread.currentThread().interrupt(); +1051 } +1052 } +1053 return true; +1054 } catch (Throwable t) { +1055 logger.warn("Failed to stop the " + name + " worker:", t); +1056 return false; +1057 } +1058 }; +1059 if (!stopWorker.apply(repositoryWorker, "repository")) { +1060 success = false; +1061 } +1062 if (!stopWorker.apply(purgeWorker, "purge")) { +1063 success = false; +1064 } +1065 +1066 try { +1067 if (server != null) { +1068 logger.info("Stopping the RPC server .."); +1069 server.stop().join(); +1070 logger.info("Stopped the RPC server."); +1071 } +1072 } catch (Throwable t) { +1073 success = false; +1074 logger.warn("Failed to stop the RPC server:", t); +1075 } +1076 +1077 return success; +1078 } +1079 +1080 private final class CentralDogmaStartStop extends StartStopSupport<Void, Void, Void, Void> { +1081 +1082 @Nullable +1083 private final PluginGroup pluginsForAllReplicas; 1084 -1085 try { -1086 if (server != null) { -1087 logger.info("Stopping the RPC server .."); -1088 server.stop().join(); -1089 logger.info("Stopped the RPC server."); -1090 } -1091 } catch (Throwable t) { -1092 success = false; -1093 logger.warn("Failed to stop the RPC server:", t); -1094 } -1095 -1096 return success; -1097 } -1098 -1099 private final class CentralDogmaStartStop extends StartStopSupport<Void, Void, Void, Void> { -1100 -1101 @Nullable -1102 private final PluginGroup pluginsForAllReplicas; -1103 -1104 CentralDogmaStartStop(@Nullable PluginGroup pluginsForAllReplicas) { -1105 super(GlobalEventExecutor.INSTANCE); -1106 this.pluginsForAllReplicas = pluginsForAllReplicas; -1107 } -1108 -1109 @Override -1110 protected CompletionStage<Void> doStart(@Nullable Void unused) throws Exception { -1111 return execute("startup", () -> { -1112 try { -1113 CentralDogma.this.doStart(); -1114 if (pluginsForAllReplicas != null) { -1115 final ProjectManager pm = CentralDogma.this.pm; -1116 final CommandExecutor executor = CentralDogma.this.executor; -1117 final MeterRegistry meterRegistry = CentralDogma.this.meterRegistry; -1118 if (pm != null && executor != null && meterRegistry != null) { -1119 pluginsForAllReplicas.start(cfg, pm, executor, meterRegistry, purgeWorker, -1120 projectInitializer).join(); -1121 } -1122 } -1123 } catch (Exception e) { -1124 Exceptions.throwUnsafely(e); -1125 } -1126 }); -1127 } -1128 -1129 @Override -1130 protected CompletionStage<Void> doStop(@Nullable Void unused) throws Exception { -1131 return execute("shutdown", () -> { -1132 if (pluginsForAllReplicas != null) { -1133 final ProjectManager pm = CentralDogma.this.pm; -1134 final CommandExecutor executor = CentralDogma.this.executor; -1135 final MeterRegistry meterRegistry = CentralDogma.this.meterRegistry; -1136 if (pm != null && executor != null && meterRegistry != null) { -1137 pluginsForAllReplicas.stop(cfg, pm, executor, meterRegistry, purgeWorker, -1138 projectInitializer).join(); -1139 } -1140 } -1141 CentralDogma.this.doStop(); -1142 }); -1143 } -1144 -1145 private CompletionStage<Void> execute(String mode, Runnable task) { -1146 final CompletableFuture<Void> future = new CompletableFuture<>(); -1147 final Thread thread = new Thread(() -> { -1148 try { -1149 task.run(); -1150 future.complete(null); -1151 } catch (Throwable cause) { -1152 future.completeExceptionally(cause); -1153 } -1154 }, "dogma-" + mode + "-0x" + Long.toHexString(CentralDogma.this.hashCode() & 0xFFFFFFFFL)); -1155 thread.start(); -1156 return future; -1157 } -1158 } -1159 } +1085 CentralDogmaStartStop(@Nullable PluginGroup pluginsForAllReplicas) { +1086 super(GlobalEventExecutor.INSTANCE); +1087 this.pluginsForAllReplicas = pluginsForAllReplicas; +1088 } +1089 +1090 @Override +1091 protected CompletionStage<Void> doStart(@Nullable Void unused) throws Exception { +1092 return execute("startup", () -> { +1093 try { +1094 CentralDogma.this.doStart(); +1095 if (pluginsForAllReplicas != null) { +1096 final ProjectManager pm = CentralDogma.this.pm; +1097 final CommandExecutor executor = CentralDogma.this.executor; +1098 final MeterRegistry meterRegistry = CentralDogma.this.meterRegistry; +1099 if (pm != null && executor != null && meterRegistry != null) { +1100 pluginsForAllReplicas.start(cfg, pm, executor, meterRegistry, purgeWorker, +1101 projectInitializer).join(); +1102 } +1103 } +1104 } catch (Exception e) { +1105 Exceptions.throwUnsafely(e); +1106 } +1107 }); +1108 } +1109 +1110 @Override +1111 protected CompletionStage<Void> doStop(@Nullable Void unused) throws Exception { +1112 return execute("shutdown", () -> { +1113 if (pluginsForAllReplicas != null) { +1114 final ProjectManager pm = CentralDogma.this.pm; +1115 final CommandExecutor executor = CentralDogma.this.executor; +1116 final MeterRegistry meterRegistry = CentralDogma.this.meterRegistry; +1117 if (pm != null && executor != null && meterRegistry != null) { +1118 pluginsForAllReplicas.stop(cfg, pm, executor, meterRegistry, purgeWorker, +1119 projectInitializer).join(); +1120 } +1121 } +1122 CentralDogma.this.doStop(); +1123 }); +1124 } +1125 +1126 private CompletionStage<Void> execute(String mode, Runnable task) { +1127 final CompletableFuture<Void> future = new CompletableFuture<>(); +1128 final Thread thread = new Thread(() -> { +1129 try { +1130 task.run(); +1131 future.complete(null); +1132 } catch (Throwable cause) { +1133 future.completeExceptionally(cause); +1134 } +1135 }, "dogma-" + mode + "-0x" + Long.toHexString(CentralDogma.this.hashCode() & 0xFFFFFFFFL)); +1136 thread.start(); +1137 return future; +1138 } +1139 } +1140 }

  • diff --git a/xref/com/linecorp/centraldogma/server/auth/AuthProvider.html b/xref/com/linecorp/centraldogma/server/auth/AuthProvider.html index 220bf28631..ecca281195 100644 --- a/xref/com/linecorp/centraldogma/server/auth/AuthProvider.html +++ b/xref/com/linecorp/centraldogma/server/auth/AuthProvider.html @@ -33,125 +33,114 @@ 25 import com.google.common.collect.ImmutableList; 26 import com.google.common.collect.ImmutableSet; 27 -28 import com.linecorp.armeria.common.HttpResponse; -29 import com.linecorp.armeria.common.HttpStatus; -30 import com.linecorp.armeria.server.HttpService; -31 import com.linecorp.armeria.server.HttpServiceWithRoutes; -32 import com.linecorp.armeria.server.Route; -33 import com.linecorp.armeria.server.Service; -34 -35 /** -36 * An interface which configures the authentication layer for the Central Dogma server. -37 */ -38 public interface AuthProvider { -39 /** -40 * A login page path for the web console. If a user, who has not logged into the web console yet, -41 * opens the web console, the web browser would bring the user to the login page. -42 */ -43 // TODO(ikhoon): Remove the trailing slash once https://github.com/line/armeria/issues/4542 is resolved. -44 String LOGIN_PATH = "/link/auth/login/"; -45 -46 /** -47 * A logout page path for the web console. If a user clicks the logout button on the navigation bar, -48 * the web browser would bring the user to the logout page. -49 */ -50 String LOGOUT_PATH = "/link/auth/logout/"; -51 -52 /** -53 * A base path of the built-in web app. -54 */ -55 String BUILTIN_WEB_BASE_PATH = "/web/auth"; -56 -57 /** -58 * A path which provides a built-in HTML login form to a user. -59 */ -60 String BUILTIN_WEB_LOGIN_PATH = BUILTIN_WEB_BASE_PATH + "/login/"; -61 -62 /** -63 * A path which provides a built-in HTML logout page to a user. -64 */ -65 String BUILTIN_WEB_LOGOUT_PATH = BUILTIN_WEB_BASE_PATH + "/logout/"; -66 -67 /** -68 * A set of {@link Route}s which handles a login request. It is necessary only if -69 * an authentication protocol requires a login feature provided by the server. -70 */ -71 Set<Route> LOGIN_API_ROUTES = -72 ImmutableSet.of(Route.builder().exact(API_V0_PATH_PREFIX + "authenticate").build(), -73 Route.builder().exact(API_V1_PATH_PREFIX + "login").build()); -74 -75 /** -76 * A set of {@link Route}s which handles a logout request. It is necessary only if -77 * an authentication protocol requires a logout feature provided by the server. -78 */ -79 Set<Route> LOGOUT_API_ROUTES = -80 ImmutableSet.of(Route.builder().exact(API_V0_PATH_PREFIX + "logout").build(), -81 Route.builder().exact(API_V1_PATH_PREFIX + "logout").build()); -82 -83 /** -84 * Returns a {@link Service} which handles a login request from a web browser. By default, -85 * the browser would bring a user to the built-in web login page served on {@value BUILTIN_WEB_LOGIN_PATH}. -86 */ -87 default HttpService webLoginService() { -88 // Redirect to the default page: /link/auth/login -> /web/auth/login/ -89 return (ctx, req) -> { -90 String returnTo = ctx.queryParam("return_to"); -91 if (returnTo != null) { -92 returnTo += BUILTIN_WEB_LOGIN_PATH; -93 } else { -94 returnTo = BUILTIN_WEB_LOGIN_PATH; -95 } -96 return HttpResponse.ofRedirect(HttpStatus.MOVED_PERMANENTLY, returnTo); -97 }; -98 } -99 -100 /** -101 * Returns a {@link Service} which handles a logout request from a web browser. By default, -102 * the browser would bring a user to the built-in web logout page served on -103 * {@value BUILTIN_WEB_LOGOUT_PATH}. -104 */ -105 default HttpService webLogoutService() { -106 // Redirect to the default page: /link/auth/logout -> /web/auth/logout/ -107 return (ctx, req) -> { -108 String returnTo = ctx.queryParam("return_to"); -109 if (returnTo != null) { -110 returnTo += BUILTIN_WEB_LOGOUT_PATH; -111 } else { -112 returnTo = BUILTIN_WEB_LOGOUT_PATH; -113 } -114 return HttpResponse.ofRedirect(HttpStatus.MOVED_PERMANENTLY, returnTo); -115 }; -116 } -117 -118 /** -119 * Returns a {@link Service} which handles a login request sent from the built-in web login page or -120 * somewhere implemented by an {@link AuthProvider}. This service would be added to the server -121 * with {@link #LOGIN_API_ROUTES} only if it is provided. +28 import com.linecorp.armeria.common.HttpHeaderNames; +29 import com.linecorp.armeria.common.HttpResponse; +30 import com.linecorp.armeria.common.HttpStatus; +31 import com.linecorp.armeria.common.ResponseHeaders; +32 import com.linecorp.armeria.server.HttpService; +33 import com.linecorp.armeria.server.HttpServiceWithRoutes; +34 import com.linecorp.armeria.server.Route; +35 import com.linecorp.armeria.server.Service; +36 +37 /** +38 * An interface which configures the authentication layer for the Central Dogma server. +39 */ +40 public interface AuthProvider { +41 /** +42 * A login page path for the web console. If a user, who has not logged into the web console yet, +43 * opens the web console, the web browser would bring the user to the login page. +44 */ +45 String LOGIN_PATH = "/link/auth/login"; +46 +47 /** +48 * A logout page path for the web console. If a user clicks the logout button on the navigation bar, +49 * the web browser would bring the user to the logout page. +50 */ +51 String LOGOUT_PATH = "/link/auth/logout"; +52 +53 /** +54 * A base path of the built-in web app. +55 */ +56 String BUILTIN_WEB_BASE_PATH = "/web/auth"; +57 +58 /** +59 * A path which provides a built-in HTML login form to a user. +60 */ +61 String BUILTIN_WEB_LOGIN_PATH = BUILTIN_WEB_BASE_PATH + "/login"; +62 +63 /** +64 * A path which provides a built-in HTML logout page to a user. +65 */ +66 String BUILTIN_WEB_LOGOUT_PATH = BUILTIN_WEB_BASE_PATH + "/logout"; +67 +68 /** +69 * A set of {@link Route}s which handles a login request. It is necessary only if +70 * an authentication protocol requires a login feature provided by the server. +71 */ +72 Set<Route> LOGIN_API_ROUTES = +73 ImmutableSet.of(Route.builder().exact(API_V0_PATH_PREFIX + "authenticate").build(), +74 Route.builder().exact(API_V1_PATH_PREFIX + "login").build()); +75 +76 /** +77 * A set of {@link Route}s which handles a logout request. It is necessary only if +78 * an authentication protocol requires a logout feature provided by the server. +79 */ +80 Set<Route> LOGOUT_API_ROUTES = +81 ImmutableSet.of(Route.builder().exact(API_V0_PATH_PREFIX + "logout").build(), +82 Route.builder().exact(API_V1_PATH_PREFIX + "logout").build()); +83 +84 /** +85 * Returns a {@link Service} which handles a login request from a web browser. By default, +86 * the browser would bring a user to the built-in web login page served on {@value BUILTIN_WEB_LOGIN_PATH}. +87 */ +88 default HttpService webLoginService() { +89 // Redirect to the default page: /link/auth/login -> /web/auth/login +90 return (ctx, req) -> HttpResponse.of( +91 ResponseHeaders.of(HttpStatus.MOVED_PERMANENTLY, HttpHeaderNames.LOCATION, +92 BUILTIN_WEB_LOGIN_PATH)); +93 } +94 +95 /** +96 * Returns a {@link Service} which handles a logout request from a web browser. By default, +97 * the browser would bring a user to the built-in web logout page served on +98 * {@value BUILTIN_WEB_LOGOUT_PATH}. +99 */ +100 default HttpService webLogoutService() { +101 // Redirect to the default page: /link/auth/logout -> /web/auth/logout +102 return (ctx, req) -> HttpResponse.of( +103 ResponseHeaders.of(HttpStatus.MOVED_PERMANENTLY, HttpHeaderNames.LOCATION, +104 BUILTIN_WEB_LOGOUT_PATH)); +105 } +106 +107 /** +108 * Returns a {@link Service} which handles a login request sent from the built-in web login page or +109 * somewhere implemented by an {@link AuthProvider}. This service would be added to the server +110 * with {@link #LOGIN_API_ROUTES} only if it is provided. +111 */ +112 @Nullable +113 default HttpService loginApiService() { +114 return null; +115 } +116 +117 /** +118 * Returns a {@link Service} which handles a logout request sent from the built-in web logout page or +119 * somewhere implemented by an {@link AuthProvider}. This service would be added to the server +120 * with {@link #LOGOUT_API_ROUTES}. If it is not provided, a default service would be added +121 * because the web console provides a logout button on the navigation bar by default. 122 */ 123 @Nullable -124 default HttpService loginApiService() { +124 default HttpService logoutApiService() { 125 return null; 126 } 127 128 /** -129 * Returns a {@link Service} which handles a logout request sent from the built-in web logout page or -130 * somewhere implemented by an {@link AuthProvider}. This service would be added to the server -131 * with {@link #LOGOUT_API_ROUTES}. If it is not provided, a default service would be added -132 * because the web console provides a logout button on the navigation bar by default. -133 */ -134 @Nullable -135 default HttpService logoutApiService() { -136 return null; -137 } -138 -139 /** -140 * Returns additional {@link Service}s which are required for working this {@link AuthProvider} -141 * well. -142 */ -143 default Iterable<HttpServiceWithRoutes> moreServices() { -144 return ImmutableList.of(); -145 } -146 } +129 * Returns additional {@link Service}s which are required for working this {@link AuthProvider} +130 * well. +131 */ +132 default Iterable<HttpServiceWithRoutes> moreServices() { +133 return ImmutableList.of(); +134 } +135 }

    diff --git a/xref/com/linecorp/centraldogma/server/auth/package-frame.html b/xref/com/linecorp/centraldogma/server/auth/package-frame.html index e1f70d1906..cc19a767c4 100644 --- a/xref/com/linecorp/centraldogma/server/auth/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/auth/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth diff --git a/xref/com/linecorp/centraldogma/server/auth/package-summary.html b/xref/com/linecorp/centraldogma/server/auth/package-summary.html index 867106dc72..47713383f0 100644 --- a/xref/com/linecorp/centraldogma/server/auth/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/auth/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth diff --git a/xref/com/linecorp/centraldogma/server/auth/saml/package-frame.html b/xref/com/linecorp/centraldogma/server/auth/saml/package-frame.html index 554d19c890..83cb3c662f 100644 --- a/xref/com/linecorp/centraldogma/server/auth/saml/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/auth/saml/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.saml + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.saml diff --git a/xref/com/linecorp/centraldogma/server/auth/saml/package-summary.html b/xref/com/linecorp/centraldogma/server/auth/saml/package-summary.html index 19464d9e9e..c6bd4a0e74 100644 --- a/xref/com/linecorp/centraldogma/server/auth/saml/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/auth/saml/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.saml + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.saml diff --git a/xref/com/linecorp/centraldogma/server/auth/shiro/package-frame.html b/xref/com/linecorp/centraldogma/server/auth/shiro/package-frame.html index 6e60b5a75e..8201ba8441 100644 --- a/xref/com/linecorp/centraldogma/server/auth/shiro/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/auth/shiro/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.shiro + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.shiro diff --git a/xref/com/linecorp/centraldogma/server/auth/shiro/package-summary.html b/xref/com/linecorp/centraldogma/server/auth/shiro/package-summary.html index b4b217de6f..03258bf605 100644 --- a/xref/com/linecorp/centraldogma/server/auth/shiro/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/auth/shiro/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.shiro + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.shiro diff --git a/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-frame.html b/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-frame.html index b0c8b5db6e..827dbb165b 100644 --- a/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.shiro.realm + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.shiro.realm diff --git a/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html b/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html index 440c24435b..9953c050c8 100644 --- a/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/auth/shiro/realm/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.auth.shiro.realm + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.auth.shiro.realm diff --git a/xref/com/linecorp/centraldogma/server/command/package-frame.html b/xref/com/linecorp/centraldogma/server/command/package-frame.html index 2e54240bb8..fd70651fae 100644 --- a/xref/com/linecorp/centraldogma/server/command/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/command/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.command + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.command diff --git a/xref/com/linecorp/centraldogma/server/command/package-summary.html b/xref/com/linecorp/centraldogma/server/command/package-summary.html index 18f627090b..8ed8d6c0e3 100644 --- a/xref/com/linecorp/centraldogma/server/command/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/command/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.command + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.command diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-frame.html index 6176a64442..0b39473207 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.auth diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-summary.html index 07f0a556d0..a6fb76552e 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/auth/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.auth diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-frame.html index 2fe0032b98..9505e166f9 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.dto + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.dto diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-summary.html index 4fab3f4da2..fee9f78bac 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/dto/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.dto + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.dto diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/service/RepositoryService.html b/xref/com/linecorp/centraldogma/server/internal/admin/service/RepositoryService.html index b50790e1e7..08b0e8afba 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/service/RepositoryService.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/service/RepositoryService.html @@ -44,12 +44,12 @@ 36 import com.linecorp.armeria.common.HttpStatus; 37 import com.linecorp.armeria.server.ServiceRequestContext; 38 import com.linecorp.armeria.server.annotation.Default; -39 import com.linecorp.armeria.server.annotation.Get; -40 import com.linecorp.armeria.server.annotation.Param; -41 import com.linecorp.armeria.server.annotation.Path; -42 import com.linecorp.armeria.server.annotation.Post; -43 import com.linecorp.armeria.server.annotation.Put; -44 import com.linecorp.armeria.server.annotation.ResponseConverter; +39 import com.linecorp.armeria.server.annotation.ExceptionHandler; +40 import com.linecorp.armeria.server.annotation.Get; +41 import com.linecorp.armeria.server.annotation.Param; +42 import com.linecorp.armeria.server.annotation.Path; +43 import com.linecorp.armeria.server.annotation.Post; +44 import com.linecorp.armeria.server.annotation.Put; 45 import com.linecorp.centraldogma.common.Author; 46 import com.linecorp.centraldogma.common.Change; 47 import com.linecorp.centraldogma.common.Markup; @@ -65,8 +65,8 @@ 57 import com.linecorp.centraldogma.server.internal.admin.dto.CommitMessageDto; 58 import com.linecorp.centraldogma.server.internal.admin.dto.EntryDto; 59 import com.linecorp.centraldogma.server.internal.admin.dto.RevisionDto; -60 import com.linecorp.centraldogma.server.internal.admin.util.RestfulJsonResponseConverter; -61 import com.linecorp.centraldogma.server.internal.api.AbstractService; +60 import com.linecorp.centraldogma.server.internal.api.AbstractService; +61 import com.linecorp.centraldogma.server.internal.api.HttpApiExceptionHandler; 62 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; 63 import com.linecorp.centraldogma.server.internal.api.auth.RequiresWritePermission; 64 import com.linecorp.centraldogma.server.internal.storage.project.ProjectApiManager; @@ -76,7 +76,7 @@ 68 * Annotated service object for managing repositories. 69 */ 70 @RequiresReadPermission -71 @ResponseConverter(RestfulJsonResponseConverter.class) +71 @ExceptionHandler(HttpApiExceptionHandler.class) 72 public class RepositoryService extends AbstractService { 73 74 private static final Object VOID = new Object(); diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/service/UserService.html b/xref/com/linecorp/centraldogma/server/internal/admin/service/UserService.html index 6d54be4bc5..338e0863ca 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/service/UserService.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/service/UserService.html @@ -29,36 +29,33 @@ 21 import com.linecorp.armeria.common.HttpStatus; 22 import com.linecorp.armeria.common.MediaType; 23 import com.linecorp.armeria.server.annotation.Get; -24 import com.linecorp.armeria.server.annotation.ResponseConverter; -25 import com.linecorp.centraldogma.internal.Jackson; -26 import com.linecorp.centraldogma.server.command.CommandExecutor; -27 import com.linecorp.centraldogma.server.internal.admin.auth.AuthUtil; -28 import com.linecorp.centraldogma.server.internal.admin.util.RestfulJsonResponseConverter; -29 import com.linecorp.centraldogma.server.internal.api.AbstractService; -30 import com.linecorp.centraldogma.server.metadata.User; -31 -32 /** -33 * Annotated service object for managing users. -34 */ -35 @ResponseConverter(RestfulJsonResponseConverter.class) -36 public class UserService extends AbstractService { -37 -38 public UserService(CommandExecutor executor) { -39 super(executor); -40 } -41 -42 /** -43 * GET /users/me -44 * Returns a login {@link User} if the user is authorized. Otherwise, {@code 401 Unauthorized} HTTP -45 * response is sent. -46 */ -47 @Get("/users/me") -48 public HttpResponse usersMe() throws Exception { -49 final User user = AuthUtil.currentUser(); -50 return HttpResponse.of(HttpStatus.OK, MediaType.JSON_UTF_8, -51 HttpData.wrap(Jackson.writeValueAsBytes(user))); -52 } -53 } +24 import com.linecorp.centraldogma.internal.Jackson; +25 import com.linecorp.centraldogma.server.command.CommandExecutor; +26 import com.linecorp.centraldogma.server.internal.admin.auth.AuthUtil; +27 import com.linecorp.centraldogma.server.internal.api.AbstractService; +28 import com.linecorp.centraldogma.server.metadata.User; +29 +30 /** +31 * Annotated service object for managing users. +32 */ +33 public class UserService extends AbstractService { +34 +35 public UserService(CommandExecutor executor) { +36 super(executor); +37 } +38 +39 /** +40 * GET /users/me +41 * Returns a login {@link User} if the user is authorized. Otherwise, {@code 401 Unauthorized} HTTP +42 * response is sent. +43 */ +44 @Get("/users/me") +45 public HttpResponse usersMe() throws Exception { +46 final User user = AuthUtil.currentUser(); +47 return HttpResponse.of(HttpStatus.OK, MediaType.JSON_UTF_8, +48 HttpData.wrap(Jackson.writeValueAsBytes(user))); +49 } +50 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/service/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/admin/service/package-frame.html index fd5b438fc0..3f3e454426 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/service/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/service/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.service + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.service diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/service/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/admin/service/package-summary.html index eadae46173..436158523a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/service/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/service/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.service + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.service diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/util/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/admin/util/package-frame.html index f6604b4f6b..3cc3d12b91 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/util/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/util/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.util + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.util diff --git a/xref/com/linecorp/centraldogma/server/internal/admin/util/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/admin/util/package-summary.html index 3edbbdf2d6..330ffbc4be 100644 --- a/xref/com/linecorp/centraldogma/server/internal/admin/util/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/admin/util/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.admin.util + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.admin.util diff --git a/xref/com/linecorp/centraldogma/server/internal/api/AbstractService.html b/xref/com/linecorp/centraldogma/server/internal/api/AbstractService.html index 1fd857fa8f..a37f3940dd 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/AbstractService.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/AbstractService.html @@ -28,37 +28,28 @@ 20 21 import java.util.concurrent.CompletableFuture; 22 -23 import com.linecorp.armeria.server.annotation.JacksonRequestConverterFunction; -24 import com.linecorp.armeria.server.annotation.RequestConverter; -25 import com.linecorp.armeria.server.annotation.ResponseConverter; -26 import com.linecorp.centraldogma.server.command.Command; -27 import com.linecorp.centraldogma.server.command.CommandExecutor; -28 import com.linecorp.centraldogma.server.internal.api.converter.HttpApiRequestConverter; -29 import com.linecorp.centraldogma.server.internal.api.converter.HttpApiResponseConverter; +23 import com.linecorp.centraldogma.server.command.Command; +24 import com.linecorp.centraldogma.server.command.CommandExecutor; +25 +26 /** +27 * A base service class for HTTP API. +28 */ +29 public class AbstractService { 30 -31 /** -32 * A base service class for HTTP API. -33 */ -34 @RequestConverter(HttpApiRequestConverter.class) -35 @RequestConverter(JacksonRequestConverterFunction.class) -36 // Do not need jacksonResponseConverterFunction because HttpApiResponseConverter handles the JSON data. -37 @ResponseConverter(HttpApiResponseConverter.class) -38 public class AbstractService { -39 -40 private final CommandExecutor executor; -41 -42 protected AbstractService(CommandExecutor executor) { -43 this.executor = requireNonNull(executor, "executor"); -44 } -45 -46 public final CommandExecutor executor() { -47 return executor; -48 } -49 -50 public <T> CompletableFuture<T> execute(Command<T> command) { -51 return executor().execute(command); -52 } -53 } +31 private final CommandExecutor executor; +32 +33 protected AbstractService(CommandExecutor executor) { +34 this.executor = requireNonNull(executor, "executor"); +35 } +36 +37 public final CommandExecutor executor() { +38 return executor; +39 } +40 +41 public <T> CompletableFuture<T> execute(Command<T> command) { +42 return executor().execute(command); +43 } +44 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/ContentServiceV1.html b/xref/com/linecorp/centraldogma/server/internal/api/ContentServiceV1.html index 09ba294624..fcfac7cc55 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/ContentServiceV1.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/ContentServiceV1.html @@ -60,459 +60,461 @@ 52 import com.linecorp.armeria.common.util.Exceptions; 53 import com.linecorp.armeria.server.ServiceRequestContext; 54 import com.linecorp.armeria.server.annotation.Default; -55 import com.linecorp.armeria.server.annotation.Get; -56 import com.linecorp.armeria.server.annotation.Param; -57 import com.linecorp.armeria.server.annotation.Post; -58 import com.linecorp.armeria.server.annotation.ProducesJson; -59 import com.linecorp.armeria.server.annotation.RequestConverter; -60 import com.linecorp.centraldogma.common.Author; -61 import com.linecorp.centraldogma.common.Change; -62 import com.linecorp.centraldogma.common.ChangeType; -63 import com.linecorp.centraldogma.common.Entry; -64 import com.linecorp.centraldogma.common.InvalidPushException; -65 import com.linecorp.centraldogma.common.Markup; -66 import com.linecorp.centraldogma.common.MergeQuery; -67 import com.linecorp.centraldogma.common.Query; -68 import com.linecorp.centraldogma.common.Revision; -69 import com.linecorp.centraldogma.common.RevisionRange; -70 import com.linecorp.centraldogma.common.ShuttingDownException; -71 import com.linecorp.centraldogma.internal.api.v1.ChangeDto; -72 import com.linecorp.centraldogma.internal.api.v1.CommitMessageDto; -73 import com.linecorp.centraldogma.internal.api.v1.EntryDto; -74 import com.linecorp.centraldogma.internal.api.v1.MergedEntryDto; -75 import com.linecorp.centraldogma.internal.api.v1.PushResultDto; -76 import com.linecorp.centraldogma.internal.api.v1.WatchResultDto; -77 import com.linecorp.centraldogma.server.command.Command; -78 import com.linecorp.centraldogma.server.command.CommandExecutor; -79 import com.linecorp.centraldogma.server.command.CommitResult; -80 import com.linecorp.centraldogma.server.internal.admin.auth.AuthUtil; -81 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; -82 import com.linecorp.centraldogma.server.internal.api.auth.RequiresWritePermission; -83 import com.linecorp.centraldogma.server.internal.api.converter.ChangesRequestConverter; -84 import com.linecorp.centraldogma.server.internal.api.converter.CommitMessageRequestConverter; -85 import com.linecorp.centraldogma.server.internal.api.converter.MergeQueryRequestConverter; -86 import com.linecorp.centraldogma.server.internal.api.converter.QueryRequestConverter; -87 import com.linecorp.centraldogma.server.internal.api.converter.WatchRequestConverter; -88 import com.linecorp.centraldogma.server.internal.api.converter.WatchRequestConverter.WatchRequest; -89 import com.linecorp.centraldogma.server.metadata.User; -90 import com.linecorp.centraldogma.server.storage.project.Project; -91 import com.linecorp.centraldogma.server.storage.repository.FindOption; -92 import com.linecorp.centraldogma.server.storage.repository.FindOptions; -93 import com.linecorp.centraldogma.server.storage.repository.Repository; -94 -95 import io.micrometer.core.instrument.MeterRegistry; -96 -97 /** -98 * Annotated service object for managing and watching contents. -99 */ -100 @ProducesJson -101 @RequiresReadPermission -102 @RequestConverter(CommitMessageRequestConverter.class) -103 public class ContentServiceV1 extends AbstractService { -104 -105 private static final String MIRROR_LOCAL_REPO = "localRepo"; +55 import com.linecorp.armeria.server.annotation.ExceptionHandler; +56 import com.linecorp.armeria.server.annotation.Get; +57 import com.linecorp.armeria.server.annotation.Param; +58 import com.linecorp.armeria.server.annotation.Post; +59 import com.linecorp.armeria.server.annotation.ProducesJson; +60 import com.linecorp.armeria.server.annotation.RequestConverter; +61 import com.linecorp.centraldogma.common.Author; +62 import com.linecorp.centraldogma.common.Change; +63 import com.linecorp.centraldogma.common.ChangeType; +64 import com.linecorp.centraldogma.common.Entry; +65 import com.linecorp.centraldogma.common.InvalidPushException; +66 import com.linecorp.centraldogma.common.Markup; +67 import com.linecorp.centraldogma.common.MergeQuery; +68 import com.linecorp.centraldogma.common.Query; +69 import com.linecorp.centraldogma.common.Revision; +70 import com.linecorp.centraldogma.common.RevisionRange; +71 import com.linecorp.centraldogma.common.ShuttingDownException; +72 import com.linecorp.centraldogma.internal.api.v1.ChangeDto; +73 import com.linecorp.centraldogma.internal.api.v1.CommitMessageDto; +74 import com.linecorp.centraldogma.internal.api.v1.EntryDto; +75 import com.linecorp.centraldogma.internal.api.v1.MergedEntryDto; +76 import com.linecorp.centraldogma.internal.api.v1.PushResultDto; +77 import com.linecorp.centraldogma.internal.api.v1.WatchResultDto; +78 import com.linecorp.centraldogma.server.command.Command; +79 import com.linecorp.centraldogma.server.command.CommandExecutor; +80 import com.linecorp.centraldogma.server.command.CommitResult; +81 import com.linecorp.centraldogma.server.internal.admin.auth.AuthUtil; +82 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; +83 import com.linecorp.centraldogma.server.internal.api.auth.RequiresWritePermission; +84 import com.linecorp.centraldogma.server.internal.api.converter.ChangesRequestConverter; +85 import com.linecorp.centraldogma.server.internal.api.converter.CommitMessageRequestConverter; +86 import com.linecorp.centraldogma.server.internal.api.converter.MergeQueryRequestConverter; +87 import com.linecorp.centraldogma.server.internal.api.converter.QueryRequestConverter; +88 import com.linecorp.centraldogma.server.internal.api.converter.WatchRequestConverter; +89 import com.linecorp.centraldogma.server.internal.api.converter.WatchRequestConverter.WatchRequest; +90 import com.linecorp.centraldogma.server.metadata.User; +91 import com.linecorp.centraldogma.server.storage.project.Project; +92 import com.linecorp.centraldogma.server.storage.repository.FindOption; +93 import com.linecorp.centraldogma.server.storage.repository.FindOptions; +94 import com.linecorp.centraldogma.server.storage.repository.Repository; +95 +96 import io.micrometer.core.instrument.MeterRegistry; +97 +98 /** +99 * Annotated service object for managing and watching contents. +100 */ +101 @ProducesJson +102 @RequiresReadPermission +103 @RequestConverter(CommitMessageRequestConverter.class) +104 @ExceptionHandler(HttpApiExceptionHandler.class) +105 public class ContentServiceV1 extends AbstractService { 106 -107 private final WatchService watchService; -108 private final MeterRegistry meterRegistry; -109 -110 public ContentServiceV1(CommandExecutor executor, WatchService watchService, MeterRegistry meterRegistry) { -111 super(executor); -112 this.watchService = requireNonNull(watchService, "watchService"); -113 this.meterRegistry = requireNonNull(meterRegistry, "meterRegistry"); -114 } -115 -116 /** -117 * GET /projects/{projectName}/repos/{repoName}/list{path}?revision={revision} -118 * -119 * <p>Returns the list of files in the path. -120 */ -121 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/list(?<path>(|/.*))$") -122 public CompletableFuture<List<EntryDto<?>>> listFiles(ServiceRequestContext ctx, -123 @Param String path, -124 @Param @Default("-1") String revision, -125 Repository repository) { -126 final String normalizedPath = normalizePath(path); -127 final Revision normalizedRev = repository.normalizeNow(new Revision(revision)); -128 increaseCounterIfOldRevisionUsed(ctx, repository, normalizedRev); -129 final CompletableFuture<List<EntryDto<?>>> future = new CompletableFuture<>(); -130 listFiles(repository, normalizedPath, normalizedRev, false, future); -131 return future; -132 } -133 -134 private static void listFiles(Repository repository, String pathPattern, Revision normalizedRev, -135 boolean withContent, CompletableFuture<List<EntryDto<?>>> result) { -136 final Map<FindOption<?>, ?> options = withContent ? FindOptions.FIND_ALL_WITH_CONTENT -137 : FindOptions.FIND_ALL_WITHOUT_CONTENT; -138 -139 repository.find(normalizedRev, pathPattern, options).handle((entries, thrown) -> { -140 if (thrown != null) { -141 result.completeExceptionally(thrown); -142 return null; -143 } -144 // If the pathPattern is a valid file path and the result is a directory, the client forgets to add -145 // "/*" to the end of the path. So, let's do it and invoke once more. -146 // This is called once at most, because the pathPattern is not a valid file path anymore. -147 if (isValidFilePath(pathPattern) && entries.size() == 1 && -148 entries.values().iterator().next().type() == DIRECTORY) { -149 listFiles(repository, pathPattern + "/*", normalizedRev, withContent, result); -150 } else { -151 result.complete(entries.values().stream() -152 .map(entry -> convert(repository, normalizedRev, entry, withContent)) -153 .collect(toImmutableList())); -154 } -155 return null; -156 }); -157 } -158 -159 /** -160 * Normalizes the path according to the following order. -161 * <ul> -162 * <li>if the path is {@code null}, empty string or "/", normalize to {@code "/*"}</li> -163 * <li>if the path is a valid file path, return the path as it is</li> -164 * <li>if the path is a valid directory path, append "*" at the end</li> -165 * </ul> -166 */ -167 private static String normalizePath(String path) { -168 if (path == null || path.isEmpty() || "/".equals(path)) { -169 return "/*"; -170 } -171 if (isValidFilePath(path)) { -172 return path; -173 } -174 if (isValidDirPath(path)) { -175 if (path.endsWith("/")) { -176 return path + '*'; -177 } else { -178 return path + "/*"; -179 } -180 } -181 return path; -182 } -183 -184 /** -185 * POST /projects/{projectName}/repos/{repoName}/contents?revision={revision} -186 * -187 * <p>Pushes a commit. -188 */ -189 @Post("/projects/{projectName}/repos/{repoName}/contents") -190 @RequiresWritePermission -191 public CompletableFuture<PushResultDto> push( -192 ServiceRequestContext ctx, -193 @Param @Default("-1") String revision, -194 Repository repository, -195 Author author, -196 CommitMessageDto commitMessage, -197 @RequestConverter(ChangesRequestConverter.class) Iterable<Change<?>> changes) { -198 final User user = AuthUtil.currentUser(ctx); -199 checkPush(repository.name(), changes, user.isAdmin()); -200 meterRegistry.counter("commits.push", -201 "project", repository.parent().name(), -202 "repository", repository.name()) -203 .increment(); -204 -205 final long commitTimeMillis = System.currentTimeMillis(); -206 return push(commitTimeMillis, author, repository, new Revision(revision), commitMessage, changes) -207 .toCompletableFuture() -208 .thenApply(rrev -> convert(rrev, commitTimeMillis)); -209 } -210 -211 private CompletableFuture<Revision> push(long commitTimeMills, Author author, Repository repository, -212 Revision revision, CommitMessageDto commitMessage, -213 Iterable<Change<?>> changes) { -214 final String summary = commitMessage.summary(); -215 final String detail = commitMessage.detail(); -216 final Markup markup = commitMessage.markup(); -217 -218 return execute(Command.push( -219 commitTimeMills, author, repository.parent().name(), repository.name(), -220 revision, summary, detail, markup, changes)).thenApply(CommitResult::revision); -221 } -222 -223 /** -224 * POST /projects/{projectName}/repos/{repoName}/preview?revision={revision} -225 * -226 * <p>Previews the actual changes which will be resulted by the given changes. -227 */ -228 @Post("/projects/{projectName}/repos/{repoName}/preview") -229 public CompletableFuture<Iterable<ChangeDto<?>>> preview( -230 ServiceRequestContext ctx, -231 @Param @Default("-1") String revision, -232 Repository repository, -233 @RequestConverter(ChangesRequestConverter.class) Iterable<Change<?>> changes) { -234 final Revision baseRevision = new Revision(revision); -235 increaseCounterIfOldRevisionUsed(ctx, repository, baseRevision); -236 final CompletableFuture<Map<String, Change<?>>> changesFuture = -237 repository.previewDiff(baseRevision, changes); -238 -239 return changesFuture.thenApply(previewDiffs -> previewDiffs.values().stream() -240 .map(DtoConverter::convert) -241 .collect(toImmutableList())); -242 } -243 -244 /** -245 * GET /projects/{projectName}/repos/{repoName}/contents{path}?revision={revision}&amp; -246 * jsonpath={jsonpath} -247 * -248 * <p>Returns the entry of files in the path. This is same with -249 * {@link #listFiles(ServiceRequestContext, String, String, Repository)} except that containing -250 * the content of the files. -251 * Note that if the {@link HttpHeaderNames#IF_NONE_MATCH} in which has a revision is sent with, -252 * this will await for the time specified in {@link HttpHeaderNames#PREFER}. -253 * During the time if the specified revision becomes different with the latest revision, this will -254 * response back right away to the client. -255 * {@link HttpStatus#NOT_MODIFIED} otherwise. -256 */ -257 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/contents(?<path>(|/.*))$") -258 public CompletableFuture<?> getFiles( -259 ServiceRequestContext ctx, -260 @Param String path, @Param @Default("-1") String revision, -261 Repository repository, -262 @RequestConverter(WatchRequestConverter.class) @Nullable WatchRequest watchRequest, -263 @RequestConverter(QueryRequestConverter.class) @Nullable Query<?> query) { -264 increaseCounterIfOldRevisionUsed(ctx, repository, new Revision(revision)); -265 final String normalizedPath = normalizePath(path); -266 -267 // watch repository or a file -268 if (watchRequest != null) { -269 final Revision lastKnownRevision = watchRequest.lastKnownRevision(); -270 final long timeOutMillis = watchRequest.timeoutMillis(); -271 final boolean errorOnEntryNotFound = watchRequest.notifyEntryNotFound(); -272 if (query != null) { -273 return watchFile(ctx, repository, lastKnownRevision, query, timeOutMillis, -274 errorOnEntryNotFound); -275 } -276 -277 return watchRepository(ctx, repository, lastKnownRevision, normalizedPath, -278 timeOutMillis, errorOnEntryNotFound); -279 } -280 -281 final Revision normalizedRev = repository.normalizeNow(new Revision(revision)); -282 if (query != null) { -283 // get a file -284 return repository.get(normalizedRev, query) -285 .handle(returnOrThrow((Entry<?> result) -> convert(repository, normalizedRev, -286 result, true))); -287 } -288 -289 // get files -290 final CompletableFuture<List<EntryDto<?>>> future = new CompletableFuture<>(); -291 listFiles(repository, normalizedPath, normalizedRev, true, future); -292 return future; -293 } -294 -295 private CompletableFuture<?> watchFile(ServiceRequestContext ctx, -296 Repository repository, Revision lastKnownRevision, -297 Query<?> query, long timeOutMillis, boolean errorOnEntryNotFound) { -298 final CompletableFuture<? extends Entry<?>> future = watchService.watchFile( -299 repository, lastKnownRevision, query, timeOutMillis, errorOnEntryNotFound); -300 -301 if (!future.isDone()) { -302 ctx.log().whenComplete().thenRun(() -> future.cancel(false)); -303 } -304 -305 return future.thenApply(entry -> { -306 final Revision revision = entry.revision(); -307 final EntryDto<?> entryDto = convert(repository, revision, entry, true); -308 return (Object) new WatchResultDto(revision, entryDto); -309 }).exceptionally(ContentServiceV1::handleWatchFailure); -310 } -311 -312 private CompletableFuture<?> watchRepository(ServiceRequestContext ctx, -313 Repository repository, Revision lastKnownRevision, -314 String pathPattern, long timeOutMillis, -315 boolean errorOnEntryNotFound) { -316 final CompletableFuture<Revision> future = -317 watchService.watchRepository(repository, lastKnownRevision, pathPattern, -318 timeOutMillis, errorOnEntryNotFound); -319 -320 if (!future.isDone()) { -321 ctx.log().whenComplete().thenRun(() -> future.cancel(false)); -322 } -323 -324 return future.thenApply(revision -> (Object) new WatchResultDto(revision, null)) -325 .exceptionally(ContentServiceV1::handleWatchFailure); -326 } -327 -328 private static Object handleWatchFailure(Throwable thrown) { -329 final Throwable rootCause = Throwables.getRootCause(thrown); -330 if (rootCause instanceof CancellationException || rootCause instanceof ShuttingDownException) { -331 // timeout happens -332 return HttpResponse.of(HttpStatus.NOT_MODIFIED); -333 } -334 return Exceptions.throwUnsafely(thrown); -335 } -336 -337 /** -338 * GET /projects/{projectName}/repos/{repoName}/commits/{revision}? -339 * path={path}&amp;to={to}&amp;maxCommits={maxCommits} -340 * -341 * <p>Returns a commit or the list of commits in the path. If the user specify the {@code revision} only, -342 * this will return the corresponding commit. If the user does not specify the {@code revision} or -343 * specify {@code to}, this will return the list of commits. -344 */ -345 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/commits(?<revision>(|/.*))$") -346 public CompletableFuture<?> listCommits(ServiceRequestContext ctx, -347 @Param String revision, -348 @Param @Default("/**") String path, -349 @Param @Nullable String to, -350 @Param @Nullable Integer maxCommits, -351 Repository repository) { -352 final Revision fromRevision; -353 final Revision toRevision; -354 -355 // 1. only the "revision" is specified: get the "revision" and return just one commit -356 // 2. only the "to" is specified: get from "HEAD" to "to" and return the list -357 // 3. the "revision" and "to" is specified: get from the "revision" to "to" and return the list -358 // 4. nothing is specified: get from "HEAD" to "INIT" and return the list -359 if (isNullOrEmpty(revision) || "/".equalsIgnoreCase(revision)) { -360 fromRevision = Revision.HEAD; -361 toRevision = to != null ? new Revision(to) : Revision.INIT; -362 } else { -363 fromRevision = new Revision(revision.substring(1)); -364 toRevision = to != null ? new Revision(to) : fromRevision; -365 } -366 -367 final RevisionRange range = repository.normalizeNow(fromRevision, toRevision).toDescending(); +107 private static final String MIRROR_LOCAL_REPO = "localRepo"; +108 +109 private final WatchService watchService; +110 private final MeterRegistry meterRegistry; +111 +112 public ContentServiceV1(CommandExecutor executor, WatchService watchService, MeterRegistry meterRegistry) { +113 super(executor); +114 this.watchService = requireNonNull(watchService, "watchService"); +115 this.meterRegistry = requireNonNull(meterRegistry, "meterRegistry"); +116 } +117 +118 /** +119 * GET /projects/{projectName}/repos/{repoName}/list{path}?revision={revision} +120 * +121 * <p>Returns the list of files in the path. +122 */ +123 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/list(?<path>(|/.*))$") +124 public CompletableFuture<List<EntryDto<?>>> listFiles(ServiceRequestContext ctx, +125 @Param String path, +126 @Param @Default("-1") String revision, +127 Repository repository) { +128 final String normalizedPath = normalizePath(path); +129 final Revision normalizedRev = repository.normalizeNow(new Revision(revision)); +130 increaseCounterIfOldRevisionUsed(ctx, repository, normalizedRev); +131 final CompletableFuture<List<EntryDto<?>>> future = new CompletableFuture<>(); +132 listFiles(repository, normalizedPath, normalizedRev, false, future); +133 return future; +134 } +135 +136 private static void listFiles(Repository repository, String pathPattern, Revision normalizedRev, +137 boolean withContent, CompletableFuture<List<EntryDto<?>>> result) { +138 final Map<FindOption<?>, ?> options = withContent ? FindOptions.FIND_ALL_WITH_CONTENT +139 : FindOptions.FIND_ALL_WITHOUT_CONTENT; +140 +141 repository.find(normalizedRev, pathPattern, options).handle((entries, thrown) -> { +142 if (thrown != null) { +143 result.completeExceptionally(thrown); +144 return null; +145 } +146 // If the pathPattern is a valid file path and the result is a directory, the client forgets to add +147 // "/*" to the end of the path. So, let's do it and invoke once more. +148 // This is called once at most, because the pathPattern is not a valid file path anymore. +149 if (isValidFilePath(pathPattern) && entries.size() == 1 && +150 entries.values().iterator().next().type() == DIRECTORY) { +151 listFiles(repository, pathPattern + "/*", normalizedRev, withContent, result); +152 } else { +153 result.complete(entries.values().stream() +154 .map(entry -> convert(repository, normalizedRev, entry, withContent)) +155 .collect(toImmutableList())); +156 } +157 return null; +158 }); +159 } +160 +161 /** +162 * Normalizes the path according to the following order. +163 * <ul> +164 * <li>if the path is {@code null}, empty string or "/", normalize to {@code "/*"}</li> +165 * <li>if the path is a valid file path, return the path as it is</li> +166 * <li>if the path is a valid directory path, append "*" at the end</li> +167 * </ul> +168 */ +169 private static String normalizePath(String path) { +170 if (path == null || path.isEmpty() || "/".equals(path)) { +171 return "/*"; +172 } +173 if (isValidFilePath(path)) { +174 return path; +175 } +176 if (isValidDirPath(path)) { +177 if (path.endsWith("/")) { +178 return path + '*'; +179 } else { +180 return path + "/*"; +181 } +182 } +183 return path; +184 } +185 +186 /** +187 * POST /projects/{projectName}/repos/{repoName}/contents?revision={revision} +188 * +189 * <p>Pushes a commit. +190 */ +191 @Post("/projects/{projectName}/repos/{repoName}/contents") +192 @RequiresWritePermission +193 public CompletableFuture<PushResultDto> push( +194 ServiceRequestContext ctx, +195 @Param @Default("-1") String revision, +196 Repository repository, +197 Author author, +198 CommitMessageDto commitMessage, +199 @RequestConverter(ChangesRequestConverter.class) Iterable<Change<?>> changes) { +200 final User user = AuthUtil.currentUser(ctx); +201 checkPush(repository.name(), changes, user.isAdmin()); +202 meterRegistry.counter("commits.push", +203 "project", repository.parent().name(), +204 "repository", repository.name()) +205 .increment(); +206 +207 final long commitTimeMillis = System.currentTimeMillis(); +208 return push(commitTimeMillis, author, repository, new Revision(revision), commitMessage, changes) +209 .toCompletableFuture() +210 .thenApply(rrev -> convert(rrev, commitTimeMillis)); +211 } +212 +213 private CompletableFuture<Revision> push(long commitTimeMills, Author author, Repository repository, +214 Revision revision, CommitMessageDto commitMessage, +215 Iterable<Change<?>> changes) { +216 final String summary = commitMessage.summary(); +217 final String detail = commitMessage.detail(); +218 final Markup markup = commitMessage.markup(); +219 +220 return execute(Command.push( +221 commitTimeMills, author, repository.parent().name(), repository.name(), +222 revision, summary, detail, markup, changes)).thenApply(CommitResult::revision); +223 } +224 +225 /** +226 * POST /projects/{projectName}/repos/{repoName}/preview?revision={revision} +227 * +228 * <p>Previews the actual changes which will be resulted by the given changes. +229 */ +230 @Post("/projects/{projectName}/repos/{repoName}/preview") +231 public CompletableFuture<Iterable<ChangeDto<?>>> preview( +232 ServiceRequestContext ctx, +233 @Param @Default("-1") String revision, +234 Repository repository, +235 @RequestConverter(ChangesRequestConverter.class) Iterable<Change<?>> changes) { +236 final Revision baseRevision = new Revision(revision); +237 increaseCounterIfOldRevisionUsed(ctx, repository, baseRevision); +238 final CompletableFuture<Map<String, Change<?>>> changesFuture = +239 repository.previewDiff(baseRevision, changes); +240 +241 return changesFuture.thenApply(previewDiffs -> previewDiffs.values().stream() +242 .map(DtoConverter::convert) +243 .collect(toImmutableList())); +244 } +245 +246 /** +247 * GET /projects/{projectName}/repos/{repoName}/contents{path}?revision={revision}&amp; +248 * jsonpath={jsonpath} +249 * +250 * <p>Returns the entry of files in the path. This is same with +251 * {@link #listFiles(ServiceRequestContext, String, String, Repository)} except that containing +252 * the content of the files. +253 * Note that if the {@link HttpHeaderNames#IF_NONE_MATCH} in which has a revision is sent with, +254 * this will await for the time specified in {@link HttpHeaderNames#PREFER}. +255 * During the time if the specified revision becomes different with the latest revision, this will +256 * response back right away to the client. +257 * {@link HttpStatus#NOT_MODIFIED} otherwise. +258 */ +259 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/contents(?<path>(|/.*))$") +260 public CompletableFuture<?> getFiles( +261 ServiceRequestContext ctx, +262 @Param String path, @Param @Default("-1") String revision, +263 Repository repository, +264 @RequestConverter(WatchRequestConverter.class) @Nullable WatchRequest watchRequest, +265 @RequestConverter(QueryRequestConverter.class) @Nullable Query<?> query) { +266 increaseCounterIfOldRevisionUsed(ctx, repository, new Revision(revision)); +267 final String normalizedPath = normalizePath(path); +268 +269 // watch repository or a file +270 if (watchRequest != null) { +271 final Revision lastKnownRevision = watchRequest.lastKnownRevision(); +272 final long timeOutMillis = watchRequest.timeoutMillis(); +273 final boolean errorOnEntryNotFound = watchRequest.notifyEntryNotFound(); +274 if (query != null) { +275 return watchFile(ctx, repository, lastKnownRevision, query, timeOutMillis, +276 errorOnEntryNotFound); +277 } +278 +279 return watchRepository(ctx, repository, lastKnownRevision, normalizedPath, +280 timeOutMillis, errorOnEntryNotFound); +281 } +282 +283 final Revision normalizedRev = repository.normalizeNow(new Revision(revision)); +284 if (query != null) { +285 // get a file +286 return repository.get(normalizedRev, query) +287 .handle(returnOrThrow((Entry<?> result) -> convert(repository, normalizedRev, +288 result, true))); +289 } +290 +291 // get files +292 final CompletableFuture<List<EntryDto<?>>> future = new CompletableFuture<>(); +293 listFiles(repository, normalizedPath, normalizedRev, true, future); +294 return future; +295 } +296 +297 private CompletableFuture<?> watchFile(ServiceRequestContext ctx, +298 Repository repository, Revision lastKnownRevision, +299 Query<?> query, long timeOutMillis, boolean errorOnEntryNotFound) { +300 final CompletableFuture<? extends Entry<?>> future = watchService.watchFile( +301 repository, lastKnownRevision, query, timeOutMillis, errorOnEntryNotFound); +302 +303 if (!future.isDone()) { +304 ctx.log().whenComplete().thenRun(() -> future.cancel(false)); +305 } +306 +307 return future.thenApply(entry -> { +308 final Revision revision = entry.revision(); +309 final EntryDto<?> entryDto = convert(repository, revision, entry, true); +310 return (Object) new WatchResultDto(revision, entryDto); +311 }).exceptionally(ContentServiceV1::handleWatchFailure); +312 } +313 +314 private CompletableFuture<?> watchRepository(ServiceRequestContext ctx, +315 Repository repository, Revision lastKnownRevision, +316 String pathPattern, long timeOutMillis, +317 boolean errorOnEntryNotFound) { +318 final CompletableFuture<Revision> future = +319 watchService.watchRepository(repository, lastKnownRevision, pathPattern, +320 timeOutMillis, errorOnEntryNotFound); +321 +322 if (!future.isDone()) { +323 ctx.log().whenComplete().thenRun(() -> future.cancel(false)); +324 } +325 +326 return future.thenApply(revision -> (Object) new WatchResultDto(revision, null)) +327 .exceptionally(ContentServiceV1::handleWatchFailure); +328 } +329 +330 private static Object handleWatchFailure(Throwable thrown) { +331 final Throwable rootCause = Throwables.getRootCause(thrown); +332 if (rootCause instanceof CancellationException || rootCause instanceof ShuttingDownException) { +333 // timeout happens +334 return HttpResponse.of(HttpStatus.NOT_MODIFIED); +335 } +336 return Exceptions.throwUnsafely(thrown); +337 } +338 +339 /** +340 * GET /projects/{projectName}/repos/{repoName}/commits/{revision}? +341 * path={path}&amp;to={to}&amp;maxCommits={maxCommits} +342 * +343 * <p>Returns a commit or the list of commits in the path. If the user specify the {@code revision} only, +344 * this will return the corresponding commit. If the user does not specify the {@code revision} or +345 * specify {@code to}, this will return the list of commits. +346 */ +347 @Get("regex:/projects/(?<projectName>[^/]+)/repos/(?<repoName>[^/]+)/commits(?<revision>(|/.*))$") +348 public CompletableFuture<?> listCommits(ServiceRequestContext ctx, +349 @Param String revision, +350 @Param @Default("/**") String path, +351 @Param @Nullable String to, +352 @Param @Nullable Integer maxCommits, +353 Repository repository) { +354 final Revision fromRevision; +355 final Revision toRevision; +356 +357 // 1. only the "revision" is specified: get the "revision" and return just one commit +358 // 2. only the "to" is specified: get from "HEAD" to "to" and return the list +359 // 3. the "revision" and "to" is specified: get from the "revision" to "to" and return the list +360 // 4. nothing is specified: get from "HEAD" to "INIT" and return the list +361 if (isNullOrEmpty(revision) || "/".equalsIgnoreCase(revision)) { +362 fromRevision = Revision.HEAD; +363 toRevision = to != null ? new Revision(to) : Revision.INIT; +364 } else { +365 fromRevision = new Revision(revision.substring(1)); +366 toRevision = to != null ? new Revision(to) : fromRevision; +367 } 368 -369 increaseCounterIfOldRevisionUsed(ctx, repository, range.from()); -370 increaseCounterIfOldRevisionUsed(ctx, repository, range.to()); -371 -372 final int maxCommits0 = firstNonNull(maxCommits, Repository.DEFAULT_MAX_COMMITS); -373 return repository -374 .history(range.from(), range.to(), normalizePath(path), maxCommits0) -375 .thenApply(commits -> { -376 final boolean toList = to != null || -377 isNullOrEmpty(revision) || -378 "/".equalsIgnoreCase(revision); -379 return objectOrList(commits, toList, DtoConverter::convert); -380 }); -381 } -382 -383 /** -384 * GET /projects/{projectName}/repos/{repoName}/compare? -385 * path={path}&amp;from={from}&amp;to={to}&amp;jsonpath={jsonpath} returns a diff. -386 * -387 * <p>or, +369 final RevisionRange range = repository.normalizeNow(fromRevision, toRevision).toDescending(); +370 +371 increaseCounterIfOldRevisionUsed(ctx, repository, range.from()); +372 increaseCounterIfOldRevisionUsed(ctx, repository, range.to()); +373 +374 final int maxCommits0 = firstNonNull(maxCommits, Repository.DEFAULT_MAX_COMMITS); +375 return repository +376 .history(range.from(), range.to(), normalizePath(path), maxCommits0) +377 .thenApply(commits -> { +378 final boolean toList = to != null || +379 isNullOrEmpty(revision) || +380 "/".equalsIgnoreCase(revision); +381 return objectOrList(commits, toList, DtoConverter::convert); +382 }); +383 } +384 +385 /** +386 * GET /projects/{projectName}/repos/{repoName}/compare? +387 * path={path}&amp;from={from}&amp;to={to}&amp;jsonpath={jsonpath} returns a diff. 388 * -389 * <p>GET /projects/{projectName}/repos/{repoName}/compare? -390 * pathPattern={pathPattern}&amp;from={from}&amp;to={to} returns diffs. -391 */ -392 @Get("/projects/{projectName}/repos/{repoName}/compare") -393 public CompletableFuture<?> getDiff( -394 ServiceRequestContext ctx, -395 @Param @Default("/**") String pathPattern, -396 @Param @Default("1") String from, @Param @Default("head") String to, -397 Repository repository, -398 @RequestConverter(QueryRequestConverter.class) @Nullable Query<?> query) { -399 final Revision fromRevision = new Revision(from); -400 final Revision toRevision = new Revision(to); -401 increaseCounterIfOldRevisionUsed(ctx, repository, fromRevision); -402 increaseCounterIfOldRevisionUsed(ctx, repository, toRevision); -403 if (query != null) { -404 return repository.diff(fromRevision, toRevision, query) -405 .thenApply(DtoConverter::convert); -406 } else { -407 return repository -408 .diff(fromRevision, toRevision, normalizePath(pathPattern)) -409 .thenApply(changeMap -> changeMap.values().stream() -410 .map(DtoConverter::convert).collect(toImmutableList())); -411 } -412 } -413 -414 private static <T> Object objectOrList(Collection<T> collection, boolean toList, Function<T, ?> converter) { -415 if (collection.isEmpty()) { -416 return ImmutableList.of(); -417 } -418 if (toList) { -419 return collection.stream().map(converter).collect(toImmutableList()); -420 } -421 return converter.apply(Iterables.getOnlyElement(collection)); -422 } -423 -424 /** -425 * GET /projects/{projectName}/repos/{repoName}/merge? -426 * revision={revision}&amp;path={path}&amp;optional_path={optional_path} -427 * -428 * <p>Returns a merged entry of files which are specified in the query string. -429 */ -430 @Get("/projects/{projectName}/repos/{repoName}/merge") -431 public <T> CompletableFuture<MergedEntryDto<T>> mergeFiles( -432 ServiceRequestContext ctx, -433 @Param @Default("-1") String revision, Repository repository, -434 @RequestConverter(MergeQueryRequestConverter.class) MergeQuery<T> query) { -435 final Revision rev = new Revision(revision); -436 increaseCounterIfOldRevisionUsed(ctx, repository, rev); -437 return repository.mergeFiles(rev, query).thenApply(DtoConverter::convert); -438 } -439 -440 /** -441 * Checks if the commit is for creating a file and raises a {@link InvalidPushException} if the -442 * given {@code repoName} field is one of {@code meta} and {@code dogma} which are internal repositories. -443 */ -444 public static void checkPush(String repoName, Iterable<Change<?>> changes, boolean isAdmin) { -445 if (Project.REPO_META.equals(repoName)) { -446 final boolean hasChangesOtherThanMetaRepoFiles = -447 Streams.stream(changes).anyMatch(change -> !isMetaFile(change.path())); -448 if (hasChangesOtherThanMetaRepoFiles) { -449 throw new InvalidPushException( -450 "The " + Project.REPO_META + " repository is reserved for internal usage."); -451 } -452 -453 if (isAdmin) { -454 // Admin may push the legacy files to test the mirror migration. -455 } else { -456 for (Change<?> change : changes) { -457 // 'mirrors.json' and 'credentials.json' are disallowed to be created or modified. -458 // 'mirrors/{id}.json' and 'credentials/{id}.json' must be used instead. -459 final String path = change.path(); -460 if (change.type() == ChangeType.REMOVE) { -461 continue; -462 } -463 if ("/mirrors.json".equals(path)) { -464 throw new InvalidPushException( -465 "'/mirrors.json' file is not allowed to create. " + -466 "Use '/mirrors/{id}.json' file or " + -467 "'/api/v1/projects/{projectName}/mirrors' API instead."); -468 } -469 if ("/credentials.json".equals(path)) { -470 throw new InvalidPushException( -471 "'/credentials.json' file is not allowed to create. " + -472 "Use '/credentials/{id}.json' file or " + -473 "'/api/v1/projects/{projectName}/credentials' API instead."); -474 } -475 } -476 } -477 -478 // TODO(ikhoon): Disallow creating a mirror with the commit API. Mirroring REST API should be used -479 // to validate the input. -480 final Optional<String> notAllowedLocalRepo = -481 Streams.stream(changes) -482 .filter(change -> isMirrorFile(change.path())) -483 .filter(change -> change.content() != null) -484 .map(change -> { -485 final Object content = change.content(); -486 if (content instanceof JsonNode) { -487 final JsonNode node = (JsonNode) content; -488 if (!node.isObject()) { -489 return null; -490 } -491 final JsonNode localRepoNode = node.get(MIRROR_LOCAL_REPO); -492 if (localRepoNode != null) { -493 final String localRepo = localRepoNode.textValue(); -494 if (Project.isReservedRepoName(localRepo)) { -495 return localRepo; -496 } -497 } -498 } -499 return null; -500 }).filter(Objects::nonNull).findFirst(); -501 if (notAllowedLocalRepo.isPresent()) { -502 throw new InvalidPushException("invalid " + MIRROR_LOCAL_REPO + ": " + -503 notAllowedLocalRepo.get()); -504 } -505 } -506 } -507 } +389 * <p>or, +390 * +391 * <p>GET /projects/{projectName}/repos/{repoName}/compare? +392 * pathPattern={pathPattern}&amp;from={from}&amp;to={to} returns diffs. +393 */ +394 @Get("/projects/{projectName}/repos/{repoName}/compare") +395 public CompletableFuture<?> getDiff( +396 ServiceRequestContext ctx, +397 @Param @Default("/**") String pathPattern, +398 @Param @Default("1") String from, @Param @Default("head") String to, +399 Repository repository, +400 @RequestConverter(QueryRequestConverter.class) @Nullable Query<?> query) { +401 final Revision fromRevision = new Revision(from); +402 final Revision toRevision = new Revision(to); +403 increaseCounterIfOldRevisionUsed(ctx, repository, fromRevision); +404 increaseCounterIfOldRevisionUsed(ctx, repository, toRevision); +405 if (query != null) { +406 return repository.diff(fromRevision, toRevision, query) +407 .thenApply(DtoConverter::convert); +408 } else { +409 return repository +410 .diff(fromRevision, toRevision, normalizePath(pathPattern)) +411 .thenApply(changeMap -> changeMap.values().stream() +412 .map(DtoConverter::convert).collect(toImmutableList())); +413 } +414 } +415 +416 private static <T> Object objectOrList(Collection<T> collection, boolean toList, Function<T, ?> converter) { +417 if (collection.isEmpty()) { +418 return ImmutableList.of(); +419 } +420 if (toList) { +421 return collection.stream().map(converter).collect(toImmutableList()); +422 } +423 return converter.apply(Iterables.getOnlyElement(collection)); +424 } +425 +426 /** +427 * GET /projects/{projectName}/repos/{repoName}/merge? +428 * revision={revision}&amp;path={path}&amp;optional_path={optional_path} +429 * +430 * <p>Returns a merged entry of files which are specified in the query string. +431 */ +432 @Get("/projects/{projectName}/repos/{repoName}/merge") +433 public <T> CompletableFuture<MergedEntryDto<T>> mergeFiles( +434 ServiceRequestContext ctx, +435 @Param @Default("-1") String revision, Repository repository, +436 @RequestConverter(MergeQueryRequestConverter.class) MergeQuery<T> query) { +437 final Revision rev = new Revision(revision); +438 increaseCounterIfOldRevisionUsed(ctx, repository, rev); +439 return repository.mergeFiles(rev, query).thenApply(DtoConverter::convert); +440 } +441 +442 /** +443 * Checks if the commit is for creating a file and raises a {@link InvalidPushException} if the +444 * given {@code repoName} field is one of {@code meta} and {@code dogma} which are internal repositories. +445 */ +446 public static void checkPush(String repoName, Iterable<Change<?>> changes, boolean isAdmin) { +447 if (Project.REPO_META.equals(repoName)) { +448 final boolean hasChangesOtherThanMetaRepoFiles = +449 Streams.stream(changes).anyMatch(change -> !isMetaFile(change.path())); +450 if (hasChangesOtherThanMetaRepoFiles) { +451 throw new InvalidPushException( +452 "The " + Project.REPO_META + " repository is reserved for internal usage."); +453 } +454 +455 if (isAdmin) { +456 // Admin may push the legacy files to test the mirror migration. +457 } else { +458 for (Change<?> change : changes) { +459 // 'mirrors.json' and 'credentials.json' are disallowed to be created or modified. +460 // 'mirrors/{id}.json' and 'credentials/{id}.json' must be used instead. +461 final String path = change.path(); +462 if (change.type() == ChangeType.REMOVE) { +463 continue; +464 } +465 if ("/mirrors.json".equals(path)) { +466 throw new InvalidPushException( +467 "'/mirrors.json' file is not allowed to create. " + +468 "Use '/mirrors/{id}.json' file or " + +469 "'/api/v1/projects/{projectName}/mirrors' API instead."); +470 } +471 if ("/credentials.json".equals(path)) { +472 throw new InvalidPushException( +473 "'/credentials.json' file is not allowed to create. " + +474 "Use '/credentials/{id}.json' file or " + +475 "'/api/v1/projects/{projectName}/credentials' API instead."); +476 } +477 } +478 } +479 +480 // TODO(ikhoon): Disallow creating a mirror with the commit API. Mirroring REST API should be used +481 // to validate the input. +482 final Optional<String> notAllowedLocalRepo = +483 Streams.stream(changes) +484 .filter(change -> isMirrorFile(change.path())) +485 .filter(change -> change.content() != null) +486 .map(change -> { +487 final Object content = change.content(); +488 if (content instanceof JsonNode) { +489 final JsonNode node = (JsonNode) content; +490 if (!node.isObject()) { +491 return null; +492 } +493 final JsonNode localRepoNode = node.get(MIRROR_LOCAL_REPO); +494 if (localRepoNode != null) { +495 final String localRepo = localRepoNode.textValue(); +496 if (Project.isReservedRepoName(localRepo)) { +497 return localRepo; +498 } +499 } +500 } +501 return null; +502 }).filter(Objects::nonNull).findFirst(); +503 if (notAllowedLocalRepo.isPresent()) { +504 throw new InvalidPushException("invalid " + MIRROR_LOCAL_REPO + ": " + +505 notAllowedLocalRepo.get()); +506 } +507 } +508 } +509 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/CredentialServiceV1.html b/xref/com/linecorp/centraldogma/server/internal/api/CredentialServiceV1.html index 737ff940c7..562a590808 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/CredentialServiceV1.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/CredentialServiceV1.html @@ -24,123 +24,104 @@ 16 17 package com.linecorp.centraldogma.server.internal.api; 18 -19 import static com.google.common.base.Preconditions.checkArgument; -20 import static com.google.common.collect.ImmutableList.toImmutableList; +19 import java.util.List; +20 import java.util.concurrent.CompletableFuture; 21 -22 import java.util.List; -23 import java.util.concurrent.CompletableFuture; -24 -25 import com.linecorp.armeria.server.annotation.ConsumesJson; -26 import com.linecorp.armeria.server.annotation.Get; -27 import com.linecorp.armeria.server.annotation.Param; -28 import com.linecorp.armeria.server.annotation.Post; -29 import com.linecorp.armeria.server.annotation.ProducesJson; -30 import com.linecorp.armeria.server.annotation.Put; -31 import com.linecorp.armeria.server.annotation.StatusCode; -32 import com.linecorp.centraldogma.common.Author; -33 import com.linecorp.centraldogma.internal.api.v1.PushResultDto; -34 import com.linecorp.centraldogma.server.command.CommandExecutor; -35 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; -36 import com.linecorp.centraldogma.server.internal.api.auth.RequiresWritePermission; -37 import com.linecorp.centraldogma.server.internal.storage.project.ProjectApiManager; -38 import com.linecorp.centraldogma.server.metadata.User; -39 import com.linecorp.centraldogma.server.mirror.MirrorCredential; -40 import com.linecorp.centraldogma.server.storage.project.Project; -41 import com.linecorp.centraldogma.server.storage.repository.MetaRepository; -42 -43 /** -44 * Annotated service object for managing credential service. -45 */ -46 @ProducesJson -47 public class CredentialServiceV1 extends AbstractService { +22 import com.linecorp.armeria.server.annotation.ConsumesJson; +23 import com.linecorp.armeria.server.annotation.ExceptionHandler; +24 import com.linecorp.armeria.server.annotation.Get; +25 import com.linecorp.armeria.server.annotation.Param; +26 import com.linecorp.armeria.server.annotation.Post; +27 import com.linecorp.armeria.server.annotation.ProducesJson; +28 import com.linecorp.armeria.server.annotation.Put; +29 import com.linecorp.armeria.server.annotation.StatusCode; +30 import com.linecorp.centraldogma.common.Author; +31 import com.linecorp.centraldogma.internal.api.v1.PushResultDto; +32 import com.linecorp.centraldogma.server.command.CommandExecutor; +33 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; +34 import com.linecorp.centraldogma.server.internal.api.auth.RequiresWritePermission; +35 import com.linecorp.centraldogma.server.internal.storage.project.ProjectApiManager; +36 import com.linecorp.centraldogma.server.mirror.MirrorCredential; +37 import com.linecorp.centraldogma.server.storage.project.Project; +38 import com.linecorp.centraldogma.server.storage.repository.MetaRepository; +39 +40 /** +41 * Annotated service object for managing credential service. +42 */ +43 @ProducesJson +44 @ExceptionHandler(HttpApiExceptionHandler.class) +45 public class CredentialServiceV1 extends AbstractService { +46 +47 private final ProjectApiManager projectApiManager; 48 -49 private final ProjectApiManager projectApiManager; -50 -51 public CredentialServiceV1(ProjectApiManager projectApiManager, CommandExecutor executor) { -52 super(executor); -53 this.projectApiManager = projectApiManager; -54 } -55 -56 /** -57 * GET /projects/{projectName}/credentials -58 * -59 * <p>Returns the list of the credentials in the project. -60 */ -61 @RequiresReadPermission(repository = Project.REPO_META) -62 @Get("/projects/{projectName}/credentials") -63 public CompletableFuture<List<MirrorCredential>> listCredentials(User loginUser, -64 @Param String projectName) { -65 final CompletableFuture<List<MirrorCredential>> future = metaRepo(projectName).credentials(); -66 if (loginUser.isAdmin()) { -67 return future; -68 } -69 return future.thenApply(credentials -> { -70 return credentials -71 .stream() -72 .map(MirrorCredential::withoutSecret) -73 .collect(toImmutableList()); -74 }); -75 } -76 -77 /** -78 * GET /projects/{projectName}/credentials/{id} -79 * -80 * <p>Returns the credential for the ID in the project. -81 */ -82 @RequiresReadPermission(repository = Project.REPO_META) -83 @Get("/projects/{projectName}/credentials/{id}") -84 public CompletableFuture<MirrorCredential> getCredentialById(User loginUser, -85 @Param String projectName, @Param String id) { -86 final CompletableFuture<MirrorCredential> future = metaRepo(projectName).credential(id); -87 if (loginUser.isAdmin()) { -88 return future; -89 } -90 return future.thenApply(MirrorCredential::withoutSecret); -91 } -92 -93 /** -94 * POST /projects/{projectName}/credentials -95 * -96 * <p>Creates a new credential. -97 */ -98 @RequiresWritePermission(repository = Project.REPO_META) -99 @Post("/projects/{projectName}/credentials") -100 @ConsumesJson -101 @StatusCode(201) -102 public CompletableFuture<PushResultDto> createCredential(@Param String projectName, -103 MirrorCredential credential, Author author) { -104 return createOrUpdate(projectName, credential, author, false); -105 } -106 -107 /** -108 * PUT /projects/{projectName}/credentials/{id} -109 * -110 * <p>Update the existing credential. -111 */ -112 @RequiresWritePermission(repository = Project.REPO_META) -113 @Put("/projects/{projectName}/credentials/{id}") -114 @ConsumesJson -115 public CompletableFuture<PushResultDto> updateCredential(@Param String projectName, -116 @Param String id, -117 MirrorCredential credential, Author author) { -118 checkArgument(id.equals(credential.id()), "The credential ID (%s) can't be updated", id); -119 return createOrUpdate(projectName, credential, author, true); -120 } -121 -122 private CompletableFuture<PushResultDto> createOrUpdate(String projectName, -123 MirrorCredential credential, -124 Author author, boolean update) { -125 return metaRepo(projectName).createPushCommand(credential, author, update).thenCompose(command -> { -126 return executor().execute(command).thenApply(result -> { -127 return new PushResultDto(result.revision(), command.timestamp()); -128 }); -129 }); -130 } -131 -132 private MetaRepository metaRepo(String projectName) { -133 return projectApiManager.getProject(projectName).metaRepo(); -134 } -135 } +49 public CredentialServiceV1(ProjectApiManager projectApiManager, CommandExecutor executor) { +50 super(executor); +51 this.projectApiManager = projectApiManager; +52 } +53 +54 /** +55 * GET /projects/{projectName}/credentials +56 * +57 * <p>Returns the list of the credentials in the project. +58 */ +59 @RequiresReadPermission(repository = Project.REPO_META) +60 @Get("/projects/{projectName}/credentials") +61 public CompletableFuture<List<MirrorCredential>> listCredentials(@Param String projectName) { +62 return metaRepo(projectName).credentials(); +63 } +64 +65 /** +66 * GET /projects/{projectName}/credentials/{id} +67 * +68 * <p>Returns the credential for the ID in the project. +69 */ +70 @RequiresReadPermission(repository = Project.REPO_META) +71 @Get("/projects/{projectName}/credentials/{id}") +72 public CompletableFuture<MirrorCredential> getCredentialById(@Param String projectName, @Param String id) { +73 return metaRepo(projectName).credential(id); +74 } +75 +76 /** +77 * POST /projects/{projectName}/credentials +78 * +79 * <p>Creates a new credential. +80 */ +81 @RequiresWritePermission(repository = Project.REPO_META) +82 @Post("/projects/{projectName}/credentials") +83 @ConsumesJson +84 @StatusCode(201) +85 public CompletableFuture<PushResultDto> createCredential(@Param String projectName, +86 MirrorCredential credential, Author author) { +87 return createOrUpdate(projectName, credential, author, false); +88 } +89 +90 /** +91 * PUT /projects/{projectName}/credentials +92 * +93 * <p>Update the existing credential. +94 */ +95 @RequiresWritePermission(repository = Project.REPO_META) +96 @Put("/projects/{projectName}/credentials") +97 @ConsumesJson +98 public CompletableFuture<PushResultDto> updateCredential(@Param String projectName, +99 MirrorCredential credential, Author author) { +100 return createOrUpdate(projectName, credential, author, true); +101 } +102 +103 private CompletableFuture<PushResultDto> createOrUpdate(String projectName, +104 MirrorCredential credential, +105 Author author, boolean update) { +106 return metaRepo(projectName).createPushCommand(credential, author, update).thenCompose(command -> { +107 return executor().execute(command).thenApply(result -> { +108 return new PushResultDto(result.revision(), command.timestamp()); +109 }); +110 }); +111 } +112 +113 private MetaRepository metaRepo(String projectName) { +114 return projectApiManager.getProject(projectName).metaRepo(); +115 } +116 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/HttpApiExceptionHandler.html b/xref/com/linecorp/centraldogma/server/internal/api/HttpApiExceptionHandler.html index 8ce1caff87..1f697df487 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/HttpApiExceptionHandler.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/HttpApiExceptionHandler.html @@ -28,127 +28,124 @@ 20 import static com.linecorp.centraldogma.server.internal.api.HttpApiUtil.newResponse; 21 22 import java.util.Map; -23 import java.util.function.BiFunction; -24 -25 import com.google.common.collect.ImmutableMap; -26 +23 +24 import com.google.common.collect.ImmutableMap; +25 +26 import com.linecorp.armeria.common.HttpRequest; 27 import com.linecorp.armeria.common.HttpResponse; 28 import com.linecorp.armeria.common.HttpStatus; 29 import com.linecorp.armeria.common.util.Exceptions; 30 import com.linecorp.armeria.server.HttpResponseException; 31 import com.linecorp.armeria.server.HttpStatusException; -32 import com.linecorp.armeria.server.ServerErrorHandler; -33 import com.linecorp.armeria.server.ServiceRequestContext; -34 import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction; -35 import com.linecorp.centraldogma.common.ChangeConflictException; -36 import com.linecorp.centraldogma.common.EntryNoContentException; -37 import com.linecorp.centraldogma.common.EntryNotFoundException; -38 import com.linecorp.centraldogma.common.InvalidPushException; -39 import com.linecorp.centraldogma.common.ProjectExistsException; -40 import com.linecorp.centraldogma.common.ProjectNotFoundException; -41 import com.linecorp.centraldogma.common.QueryExecutionException; -42 import com.linecorp.centraldogma.common.ReadOnlyException; -43 import com.linecorp.centraldogma.common.RedundantChangeException; -44 import com.linecorp.centraldogma.common.RepositoryExistsException; -45 import com.linecorp.centraldogma.common.RepositoryNotFoundException; -46 import com.linecorp.centraldogma.common.RevisionNotFoundException; -47 import com.linecorp.centraldogma.common.TooManyRequestsException; -48 import com.linecorp.centraldogma.server.internal.admin.service.TokenNotFoundException; -49 import com.linecorp.centraldogma.server.internal.storage.RequestAlreadyTimedOutException; -50 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryMetadataException; -51 -52 /** -53 * A default {@link ExceptionHandlerFunction} of HTTP API. -54 */ -55 public final class HttpApiExceptionHandler implements ServerErrorHandler { -56 -57 /** -58 * A map of exception handler functions for well known exceptions. -59 */ -60 private static final Map<Class<?>, BiFunction<ServiceRequestContext, Throwable, HttpResponse>> -61 exceptionHandlers; -62 -63 static { -64 final ImmutableMap.Builder<Class<?>, -65 BiFunction<ServiceRequestContext, Throwable, HttpResponse>> builder = ImmutableMap.builder(); -66 -67 builder.put(ChangeConflictException.class, -68 (ctx, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, -69 "The given changeset or revision has a conflict.")) -70 .put(EntryNotFoundException.class, -71 (ctx, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, -72 "Entry '%s' does not exist.", cause.getMessage())) -73 .put(EntryNoContentException.class, -74 (ctx, cause) -> HttpResponse.of(HttpStatus.NO_CONTENT)) -75 .put(ProjectExistsException.class, -76 (ctx, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, -77 "Project '%s' exists already.", cause.getMessage())) -78 .put(ProjectNotFoundException.class, -79 (ctx, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, -80 "Project '%s' does not exist.", cause.getMessage())) -81 .put(RedundantChangeException.class, -82 (ctx, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, -83 "The given changeset does not change anything.")) -84 .put(RepositoryExistsException.class, -85 (ctx, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, -86 "Repository '%s' exists already.", cause.getMessage())) -87 .put(RepositoryMetadataException.class, -88 (ctx, cause) -> newResponse(ctx, HttpStatus.INTERNAL_SERVER_ERROR, cause)) -89 .put(RepositoryNotFoundException.class, -90 (ctx, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, -91 "Repository '%s' does not exist.", cause.getMessage())) -92 .put(RevisionNotFoundException.class, -93 (ctx, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, -94 "Revision %s does not exist.", cause.getMessage())) -95 .put(TokenNotFoundException.class, -96 (ctx, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, -97 "Token '%s' does not exist.", cause.getMessage())) -98 .put(QueryExecutionException.class, -99 (ctx, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) -100 .put(UnsupportedOperationException.class, -101 (ctx, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) -102 .put(TooManyRequestsException.class, -103 (ctx, cause) -> { -104 final TooManyRequestsException cast = (TooManyRequestsException) cause; -105 final Object type = firstNonNull(cast.type(), "requests"); -106 return newResponse(ctx, HttpStatus.TOO_MANY_REQUESTS, cast, -107 "Too many %s are sent to %s", type, cause.getMessage()); -108 }) -109 .put(InvalidPushException.class, -110 (ctx, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) -111 .put(ReadOnlyException.class, -112 (ctx, cause) -> newResponse(ctx, HttpStatus.SERVICE_UNAVAILABLE, cause)); -113 -114 exceptionHandlers = builder.build(); -115 } -116 -117 @Override -118 public HttpResponse onServiceException(ServiceRequestContext ctx, Throwable cause) { -119 final Throwable peeledCause = Exceptions.peel(cause); -120 -121 if (peeledCause instanceof HttpStatusException || -122 peeledCause instanceof HttpResponseException) { -123 return null; -124 } -125 -126 // Use precomputed map if the cause is instance of CentralDogmaException to access in a faster way. -127 final BiFunction<ServiceRequestContext, Throwable, HttpResponse> func = -128 exceptionHandlers.get(peeledCause.getClass()); -129 if (func != null) { -130 return func.apply(ctx, peeledCause); -131 } -132 -133 if (peeledCause instanceof IllegalArgumentException) { -134 return newResponse(ctx, HttpStatus.BAD_REQUEST, peeledCause); -135 } -136 -137 if (peeledCause instanceof RequestAlreadyTimedOutException) { -138 return newResponse(ctx, HttpStatus.SERVICE_UNAVAILABLE, peeledCause); -139 } -140 -141 return newResponse(ctx, HttpStatus.INTERNAL_SERVER_ERROR, peeledCause); -142 } -143 } +32 import com.linecorp.armeria.server.ServiceRequestContext; +33 import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction; +34 import com.linecorp.centraldogma.common.ChangeConflictException; +35 import com.linecorp.centraldogma.common.EntryNoContentException; +36 import com.linecorp.centraldogma.common.EntryNotFoundException; +37 import com.linecorp.centraldogma.common.InvalidPushException; +38 import com.linecorp.centraldogma.common.ProjectExistsException; +39 import com.linecorp.centraldogma.common.ProjectNotFoundException; +40 import com.linecorp.centraldogma.common.QueryExecutionException; +41 import com.linecorp.centraldogma.common.ReadOnlyException; +42 import com.linecorp.centraldogma.common.RedundantChangeException; +43 import com.linecorp.centraldogma.common.RepositoryExistsException; +44 import com.linecorp.centraldogma.common.RepositoryNotFoundException; +45 import com.linecorp.centraldogma.common.RevisionNotFoundException; +46 import com.linecorp.centraldogma.common.TooManyRequestsException; +47 import com.linecorp.centraldogma.server.internal.admin.service.TokenNotFoundException; +48 import com.linecorp.centraldogma.server.internal.storage.RequestAlreadyTimedOutException; +49 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryMetadataException; +50 +51 /** +52 * A default {@link ExceptionHandlerFunction} of HTTP API. +53 */ +54 public final class HttpApiExceptionHandler implements ExceptionHandlerFunction { +55 +56 /** +57 * A map of exception handler functions for well known exceptions. +58 */ +59 private static final Map<Class<?>, ExceptionHandlerFunction> exceptionHandlers; +60 +61 static { +62 final ImmutableMap.Builder<Class<?>, +63 ExceptionHandlerFunction> builder = ImmutableMap.builder(); +64 +65 builder.put(ChangeConflictException.class, +66 (ctx, req, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, +67 "The given changeset or revision has a conflict.")) +68 .put(EntryNotFoundException.class, +69 (ctx, req, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, +70 "Entry '%s' does not exist.", cause.getMessage())) +71 .put(EntryNoContentException.class, +72 (ctx, req, cause) -> HttpResponse.of(HttpStatus.NO_CONTENT)) +73 .put(ProjectExistsException.class, +74 (ctx, req, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, +75 "Project '%s' exists already.", cause.getMessage())) +76 .put(ProjectNotFoundException.class, +77 (ctx, req, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, +78 "Project '%s' does not exist.", cause.getMessage())) +79 .put(RedundantChangeException.class, +80 (ctx, req, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, +81 "The given changeset does not change anything.")) +82 .put(RepositoryExistsException.class, +83 (ctx, req, cause) -> newResponse(ctx, HttpStatus.CONFLICT, cause, +84 "Repository '%s' exists already.", cause.getMessage())) +85 .put(RepositoryMetadataException.class, +86 (ctx, req, cause) -> newResponse(ctx, HttpStatus.INTERNAL_SERVER_ERROR, cause)) +87 .put(RepositoryNotFoundException.class, +88 (ctx, req, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, +89 "Repository '%s' does not exist.", cause.getMessage())) +90 .put(RevisionNotFoundException.class, +91 (ctx, req, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, +92 "Revision %s does not exist.", cause.getMessage())) +93 .put(TokenNotFoundException.class, +94 (ctx, req, cause) -> newResponse(ctx, HttpStatus.NOT_FOUND, cause, +95 "Token '%s' does not exist.", cause.getMessage())) +96 .put(QueryExecutionException.class, +97 (ctx, req, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) +98 .put(UnsupportedOperationException.class, +99 (ctx, req, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) +100 .put(TooManyRequestsException.class, +101 (ctx, req, cause) -> { +102 final TooManyRequestsException cast = (TooManyRequestsException) cause; +103 final Object type = firstNonNull(cast.type(), "requests"); +104 return newResponse(ctx, HttpStatus.TOO_MANY_REQUESTS, cast, +105 "Too many %s are sent to %s", type, cause.getMessage()); +106 }) +107 .put(InvalidPushException.class, +108 (ctx, req, cause) -> newResponse(ctx, HttpStatus.BAD_REQUEST, cause)) +109 .put(ReadOnlyException.class, +110 (ctx, req, cause) -> newResponse(ctx, HttpStatus.SERVICE_UNAVAILABLE, cause)); +111 +112 exceptionHandlers = builder.build(); +113 } +114 +115 @Override +116 public HttpResponse handleException(ServiceRequestContext ctx, HttpRequest req, Throwable cause) { +117 final Throwable peeledCause = Exceptions.peel(cause); +118 +119 if (peeledCause instanceof HttpStatusException || +120 peeledCause instanceof HttpResponseException) { +121 return ExceptionHandlerFunction.fallthrough(); +122 } +123 +124 // Use precomputed map if the cause is instance of CentralDogmaException to access in a faster way. +125 final ExceptionHandlerFunction func = exceptionHandlers.get(peeledCause.getClass()); +126 if (func != null) { +127 return func.handleException(ctx, req, peeledCause); +128 } +129 +130 if (peeledCause instanceof IllegalArgumentException) { +131 return newResponse(ctx, HttpStatus.BAD_REQUEST, peeledCause); +132 } +133 +134 if (peeledCause instanceof RequestAlreadyTimedOutException) { +135 return newResponse(ctx, HttpStatus.SERVICE_UNAVAILABLE, peeledCause); +136 } +137 +138 return newResponse(ctx, HttpStatus.INTERNAL_SERVER_ERROR, peeledCause); +139 } +140 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/MetadataApiService.html b/xref/com/linecorp/centraldogma/server/internal/api/MetadataApiService.html index 43f519a567..52dadfea21 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/MetadataApiService.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/MetadataApiService.html @@ -43,18 +43,18 @@ 35 import com.linecorp.armeria.common.util.Exceptions; 36 import com.linecorp.armeria.server.annotation.Consumes; 37 import com.linecorp.armeria.server.annotation.Delete; -38 import com.linecorp.armeria.server.annotation.Param; -39 import com.linecorp.armeria.server.annotation.Patch; -40 import com.linecorp.armeria.server.annotation.Post; -41 import com.linecorp.armeria.server.annotation.ProducesJson; -42 import com.linecorp.centraldogma.common.Author; -43 import com.linecorp.centraldogma.common.Revision; -44 import com.linecorp.centraldogma.internal.Jackson; -45 import com.linecorp.centraldogma.internal.jsonpatch.JsonPatch; -46 import com.linecorp.centraldogma.internal.jsonpatch.JsonPatchOperation; -47 import com.linecorp.centraldogma.internal.jsonpatch.ReplaceOperation; -48 import com.linecorp.centraldogma.server.QuotaConfig; -49 import com.linecorp.centraldogma.server.command.CommandExecutor; +38 import com.linecorp.armeria.server.annotation.ExceptionHandler; +39 import com.linecorp.armeria.server.annotation.Param; +40 import com.linecorp.armeria.server.annotation.Patch; +41 import com.linecorp.armeria.server.annotation.Post; +42 import com.linecorp.armeria.server.annotation.ProducesJson; +43 import com.linecorp.centraldogma.common.Author; +44 import com.linecorp.centraldogma.common.Revision; +45 import com.linecorp.centraldogma.internal.Jackson; +46 import com.linecorp.centraldogma.internal.jsonpatch.JsonPatch; +47 import com.linecorp.centraldogma.internal.jsonpatch.JsonPatchOperation; +48 import com.linecorp.centraldogma.internal.jsonpatch.ReplaceOperation; +49 import com.linecorp.centraldogma.server.QuotaConfig; 50 import com.linecorp.centraldogma.server.internal.api.auth.RequiresAdministrator; 51 import com.linecorp.centraldogma.server.internal.api.auth.RequiresRole; 52 import com.linecorp.centraldogma.server.metadata.MetadataService; @@ -69,347 +69,346 @@ 61 */ 62 @ProducesJson 63 @RequiresRole(roles = ProjectRole.OWNER) -64 public class MetadataApiService extends AbstractService { -65 -66 private static final TypeReference<Collection<Permission>> permissionsTypeRef = -67 new TypeReference<Collection<Permission>>() {}; -68 -69 private final MetadataService mds; -70 private final Function<String, String> loginNameNormalizer; -71 -72 public MetadataApiService(CommandExecutor executor, MetadataService mds, -73 Function<String, String> loginNameNormalizer) { -74 super(executor); -75 this.mds = requireNonNull(mds, "mds"); -76 this.loginNameNormalizer = requireNonNull(loginNameNormalizer, "loginNameNormalizer"); -77 } -78 -79 /** -80 * POST /metadata/{projectName}/members -81 * -82 * <p>Adds a member to the specified {@code projectName}. -83 */ -84 @Post("/metadata/{projectName}/members") -85 public CompletableFuture<Revision> addMember(@Param String projectName, -86 IdentifierWithRole request, -87 Author author) { -88 final ProjectRole role = toProjectRole(request.role()); -89 final User member = new User(loginNameNormalizer.apply(request.id())); -90 return mds.addMember(author, projectName, member, role); -91 } -92 -93 /** -94 * PATCH /metadata/{projectName}/members/{memberId} -95 * -96 * <p>Updates the {@link ProjectRole} of the specified {@code memberId} in the specified -97 * {@code projectName}. -98 */ -99 @Patch("/metadata/{projectName}/members/{memberId}") -100 @Consumes("application/json-patch+json") -101 public CompletableFuture<Revision> updateMember(@Param String projectName, -102 @Param String memberId, -103 JsonPatch jsonPatch, -104 Author author) { -105 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/role"); -106 final ProjectRole role = ProjectRole.of(operation.value()); -107 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); -108 return mds.getMember(projectName, member) -109 .thenCompose(unused -> mds.updateMemberRole(author, projectName, member, role)); -110 } -111 -112 /** -113 * DELETE /metadata/{projectName}/members/{memberId} -114 * -115 * <p>Removes the specified {@code memberId} from the specified {@code projectName}. -116 */ -117 @Delete("/metadata/{projectName}/members/{memberId}") -118 public CompletableFuture<Revision> removeMember(@Param String projectName, -119 @Param String memberId, -120 Author author) { -121 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); -122 return mds.getMember(projectName, member) -123 .thenCompose(unused -> mds.removeMember(author, projectName, member)); -124 } -125 -126 /** -127 * POST /metadata/{projectName}/tokens -128 * -129 * <p>Adds a {@link Token} to the specified {@code projectName}. -130 */ -131 @Post("/metadata/{projectName}/tokens") -132 public CompletableFuture<Revision> addToken(@Param String projectName, -133 IdentifierWithRole request, -134 Author author) { -135 final ProjectRole role = toProjectRole(request.role()); -136 return mds.findTokenByAppId(request.id()) -137 .thenCompose(token -> mds.addToken(author, projectName, token.appId(), role)); -138 } -139 -140 /** -141 * PATCH /metadata/{projectName}/tokens/{appId} -142 * -143 * <p>Updates the {@link ProjectRole} of the {@link Token} of the specified {@code appId} -144 * in the specified {@code projectName}. -145 */ -146 @Patch("/metadata/{projectName}/tokens/{appId}") -147 @Consumes("application/json-patch+json") -148 public CompletableFuture<Revision> updateTokenRole(@Param String projectName, -149 @Param String appId, -150 JsonPatch jsonPatch, -151 Author author) { -152 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/role"); -153 final ProjectRole role = ProjectRole.of(operation.value()); -154 return mds.findTokenByAppId(appId) -155 .thenCompose(token -> mds.updateTokenRole(author, projectName, token, role)); -156 } -157 -158 /** -159 * DELETE /metadata/{projectName}/tokens/{appId} -160 * -161 * <p>Removes the {@link Token} of the specified {@code appId} from the specified {@code projectName}. -162 */ -163 @Delete("/metadata/{projectName}/tokens/{appId}") -164 public CompletableFuture<Revision> removeToken(@Param String projectName, -165 @Param String appId, -166 Author author) { -167 return mds.findTokenByAppId(appId) -168 .thenCompose(token -> mds.removeToken(author, projectName, token.appId())); -169 } -170 -171 /** -172 * POST /metadata/{projectName}/repos/{repoName}/perm/role -173 * -174 * <p>Updates the {@link PerRolePermissions} of the specified {@code repoName} in the specified -175 * {@code projectName}. -176 */ -177 @Post("/metadata/{projectName}/repos/{repoName}/perm/role") -178 public CompletableFuture<Revision> updateRolePermission(@Param String projectName, -179 @Param String repoName, -180 PerRolePermissions newPermission, -181 Author author) { -182 return mds.updatePerRolePermissions(author, projectName, repoName, newPermission); -183 } -184 -185 /** -186 * POST /metadata/{projectName}/repos/{repoName}/perm/users -187 * -188 * <p>Adds {@link Permission}s of the specific users to the specified {@code repoName} in the -189 * specified {@code projectName}. -190 */ -191 @Post("/metadata/{projectName}/repos/{repoName}/perm/users") -192 public CompletableFuture<Revision> addSpecificUserPermission( -193 @Param String projectName, -194 @Param String repoName, -195 IdentifierWithPermissions memberWithPermissions, -196 Author author) { -197 final User member = new User(loginNameNormalizer.apply(memberWithPermissions.id())); -198 return mds.addPerUserPermission(author, projectName, repoName, -199 member, memberWithPermissions.permissions()); -200 } -201 -202 /** -203 * PATCH /metadata/{projectName}/repos/{repoName}/perm/users/{memberId} -204 * -205 * <p>Updates {@link Permission}s for the specified {@code memberId} of the specified {@code repoName} -206 * in the specified {@code projectName}. -207 */ -208 @Patch("/metadata/{projectName}/repos/{repoName}/perm/users/{memberId}") -209 @Consumes("application/json-patch+json") -210 public CompletableFuture<Revision> updateSpecificUserPermission(@Param String projectName, -211 @Param String repoName, -212 @Param String memberId, -213 JsonPatch jsonPatch, -214 Author author) { -215 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/permissions"); -216 final Collection<Permission> permissions = Jackson.convertValue(operation.value(), permissionsTypeRef); -217 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); -218 return mds.findPermissions(projectName, repoName, member) -219 .thenCompose(unused -> mds.updatePerUserPermission(author, -220 projectName, repoName, member, -221 permissions)); -222 } -223 -224 /** -225 * DELETE /metadata/{projectName}/repos/{repoName}/perm/users/{memberId} -226 * -227 * <p>Removes {@link Permission}s for the specified {@code memberId} from the specified {@code repoName} -228 * in the specified {@code projectName}. -229 */ -230 @Delete("/metadata/{projectName}/repos/{repoName}/perm/users/{memberId}") -231 public CompletableFuture<Revision> removeSpecificUserPermission(@Param String projectName, -232 @Param String repoName, -233 @Param String memberId, -234 Author author) { -235 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); -236 return mds.findPermissions(projectName, repoName, member) -237 .thenCompose(unused -> mds.removePerUserPermission(author, projectName, -238 repoName, member)); -239 } -240 -241 /** -242 * POST /metadata/{projectName}/repos/{repoName}/perm/tokens -243 * -244 * <p>Adds {@link Permission}s for a token to the specified {@code repoName} in the specified -245 * {@code projectName}. -246 */ -247 @Post("/metadata/{projectName}/repos/{repoName}/perm/tokens") -248 public CompletableFuture<Revision> addSpecificTokenPermission( -249 @Param String projectName, -250 @Param String repoName, -251 IdentifierWithPermissions tokenWithPermissions, -252 Author author) { -253 return mds.addPerTokenPermission(author, projectName, repoName, -254 tokenWithPermissions.id(), tokenWithPermissions.permissions()); -255 } -256 -257 /** -258 * PATCH /metadata/{projectName}/repos/{repoName}/perm/tokens/{appId} -259 * -260 * <p>Updates {@link Permission}s for the specified {@code appId} of the specified {@code repoName} -261 * in the specified {@code projectName}. -262 */ -263 @Patch("/metadata/{projectName}/repos/{repoName}/perm/tokens/{appId}") -264 @Consumes("application/json-patch+json") -265 public CompletableFuture<Revision> updateSpecificTokenPermission(@Param String projectName, -266 @Param String repoName, -267 @Param String appId, -268 JsonPatch jsonPatch, -269 Author author) { -270 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/permissions"); -271 final Collection<Permission> permissions = Jackson.convertValue(operation.value(), permissionsTypeRef); -272 return mds.findTokenByAppId(appId) -273 .thenCompose(token -> mds.updatePerTokenPermission( -274 author, projectName, repoName, appId, permissions)); -275 } -276 -277 /** -278 * DELETE /metadata/{projectName}/repos/{repoName}/perm/tokens/{appId} -279 * -280 * <p>Removes {@link Permission}s of the specified {@code appId} from the specified {@code repoName} -281 * in the specified {@code projectName}. -282 */ -283 @Delete("/metadata/{projectName}/repos/{repoName}/perm/tokens/{appId}") -284 public CompletableFuture<Revision> removeSpecificTokenPermission(@Param String projectName, -285 @Param String repoName, -286 @Param String appId, -287 Author author) { -288 return mds.findTokenByAppId(appId) -289 .thenCompose(token -> mds.removePerTokenPermission(author, -290 projectName, repoName, appId)); -291 } -292 -293 /** -294 * PATCH /metadata/{projectName}/repos/{repoName}/quota/write -295 * -296 * <p>Updates the {@linkplain QuotaConfig write quota} for the specified {@code repoName} -297 * in the specified {@code projectName}. -298 */ -299 @Patch("/metadata/{projectName}/repos/{repoName}/quota/write") -300 @Consumes("application/json-patch+json") -301 @RequiresAdministrator -302 public CompletableFuture<Revision> updateWriteQuota(@Param String projectName, -303 @Param String repoName, -304 QuotaConfig quota, -305 Author author) { -306 return mds.updateWriteQuota(author, projectName, repoName, quota); -307 } -308 -309 private static ReplaceOperation ensureSingleReplaceOperation(JsonPatch patch, String expectedPath) { -310 final List<JsonPatchOperation> operations = patch.operations(); -311 checkArgument(operations.size() == 1, -312 "Should be a single JSON patch operation in the list: " + operations.size()); -313 -314 final JsonPatchOperation operation = patch.operations().get(0); -315 checkArgument(operation instanceof ReplaceOperation, -316 "Should be a replace operation: " + operation); -317 -318 checkArgument(expectedPath.equals(operation.path().toString()), -319 "Invalid path value: " + operation.path()); -320 -321 return (ReplaceOperation) operation; -322 } -323 -324 private static String urlDecode(String input) { -325 try { -326 // TODO(hyangtack) Remove this after https://github.com/line/armeria/issues/756 is resolved. -327 return URLDecoder.decode(input, StandardCharsets.UTF_8.name()); -328 } catch (UnsupportedEncodingException e) { -329 return Exceptions.throwUnsafely(e); -330 } -331 } -332 -333 private static ProjectRole toProjectRole(String roleStr) { -334 final ProjectRole role = ProjectRole.valueOf(requireNonNull(roleStr, "roleStr")); -335 checkArgument(role == ProjectRole.OWNER || role == ProjectRole.MEMBER, -336 "Invalid role: " + role + -337 " (expected: '" + ProjectRole.OWNER + "' or '" + ProjectRole.MEMBER + "')"); -338 return role; -339 } -340 -341 // TODO(hyangtack) Move these classes to the common module later when our java client accesses to -342 // the metadata. -343 static final class IdentifierWithRole { -344 -345 private final String id; -346 private final String role; -347 -348 @JsonCreator -349 IdentifierWithRole(@JsonProperty("id") String id, -350 @JsonProperty("role") String role) { -351 this.id = requireNonNull(id, "id"); -352 this.role = requireNonNull(role, "role"); -353 } -354 -355 @JsonProperty -356 public String id() { -357 return id; -358 } -359 -360 @JsonProperty -361 public String role() { -362 return role; -363 } -364 -365 @Override -366 public String toString() { -367 return MoreObjects.toStringHelper(this) -368 .add("id", id()) -369 .add("role", role()) -370 .toString(); -371 } -372 } -373 -374 static final class IdentifierWithPermissions { -375 -376 private final String id; -377 private final Collection<Permission> permissions; -378 -379 @JsonCreator -380 IdentifierWithPermissions(@JsonProperty("id") String id, -381 @JsonProperty("permissions") Collection<Permission> permissions) { -382 this.id = requireNonNull(id, "id"); -383 this.permissions = requireNonNull(permissions, "permissions"); -384 } -385 -386 @JsonProperty -387 public String id() { -388 return id; -389 } -390 -391 @JsonProperty -392 public Collection<Permission> permissions() { -393 return permissions; -394 } -395 -396 @Override -397 public String toString() { -398 return MoreObjects.toStringHelper(this) -399 .add("id", id()) -400 .add("permissions", permissions()) -401 .toString(); -402 } -403 } -404 } +64 @ExceptionHandler(HttpApiExceptionHandler.class) +65 public class MetadataApiService { +66 +67 private static final TypeReference<Collection<Permission>> permissionsTypeRef = +68 new TypeReference<Collection<Permission>>() {}; +69 +70 private final MetadataService mds; +71 private final Function<String, String> loginNameNormalizer; +72 +73 public MetadataApiService(MetadataService mds, Function<String, String> loginNameNormalizer) { +74 this.mds = requireNonNull(mds, "mds"); +75 this.loginNameNormalizer = requireNonNull(loginNameNormalizer, "loginNameNormalizer"); +76 } +77 +78 /** +79 * POST /metadata/{projectName}/members +80 * +81 * <p>Adds a member to the specified {@code projectName}. +82 */ +83 @Post("/metadata/{projectName}/members") +84 public CompletableFuture<Revision> addMember(@Param String projectName, +85 IdentifierWithRole request, +86 Author author) { +87 final ProjectRole role = toProjectRole(request.role()); +88 final User member = new User(loginNameNormalizer.apply(request.id())); +89 return mds.addMember(author, projectName, member, role); +90 } +91 +92 /** +93 * PATCH /metadata/{projectName}/members/{memberId} +94 * +95 * <p>Updates the {@link ProjectRole} of the specified {@code memberId} in the specified +96 * {@code projectName}. +97 */ +98 @Patch("/metadata/{projectName}/members/{memberId}") +99 @Consumes("application/json-patch+json") +100 public CompletableFuture<Revision> updateMember(@Param String projectName, +101 @Param String memberId, +102 JsonPatch jsonPatch, +103 Author author) { +104 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/role"); +105 final ProjectRole role = ProjectRole.of(operation.value()); +106 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); +107 return mds.getMember(projectName, member) +108 .thenCompose(unused -> mds.updateMemberRole(author, projectName, member, role)); +109 } +110 +111 /** +112 * DELETE /metadata/{projectName}/members/{memberId} +113 * +114 * <p>Removes the specified {@code memberId} from the specified {@code projectName}. +115 */ +116 @Delete("/metadata/{projectName}/members/{memberId}") +117 public CompletableFuture<Revision> removeMember(@Param String projectName, +118 @Param String memberId, +119 Author author) { +120 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); +121 return mds.getMember(projectName, member) +122 .thenCompose(unused -> mds.removeMember(author, projectName, member)); +123 } +124 +125 /** +126 * POST /metadata/{projectName}/tokens +127 * +128 * <p>Adds a {@link Token} to the specified {@code projectName}. +129 */ +130 @Post("/metadata/{projectName}/tokens") +131 public CompletableFuture<Revision> addToken(@Param String projectName, +132 IdentifierWithRole request, +133 Author author) { +134 final ProjectRole role = toProjectRole(request.role()); +135 return mds.findTokenByAppId(request.id()) +136 .thenCompose(token -> mds.addToken(author, projectName, token.appId(), role)); +137 } +138 +139 /** +140 * PATCH /metadata/{projectName}/tokens/{appId} +141 * +142 * <p>Updates the {@link ProjectRole} of the {@link Token} of the specified {@code appId} +143 * in the specified {@code projectName}. +144 */ +145 @Patch("/metadata/{projectName}/tokens/{appId}") +146 @Consumes("application/json-patch+json") +147 public CompletableFuture<Revision> updateTokenRole(@Param String projectName, +148 @Param String appId, +149 JsonPatch jsonPatch, +150 Author author) { +151 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/role"); +152 final ProjectRole role = ProjectRole.of(operation.value()); +153 return mds.findTokenByAppId(appId) +154 .thenCompose(token -> mds.updateTokenRole(author, projectName, token, role)); +155 } +156 +157 /** +158 * DELETE /metadata/{projectName}/tokens/{appId} +159 * +160 * <p>Removes the {@link Token} of the specified {@code appId} from the specified {@code projectName}. +161 */ +162 @Delete("/metadata/{projectName}/tokens/{appId}") +163 public CompletableFuture<Revision> removeToken(@Param String projectName, +164 @Param String appId, +165 Author author) { +166 return mds.findTokenByAppId(appId) +167 .thenCompose(token -> mds.removeToken(author, projectName, token.appId())); +168 } +169 +170 /** +171 * POST /metadata/{projectName}/repos/{repoName}/perm/role +172 * +173 * <p>Updates the {@link PerRolePermissions} of the specified {@code repoName} in the specified +174 * {@code projectName}. +175 */ +176 @Post("/metadata/{projectName}/repos/{repoName}/perm/role") +177 public CompletableFuture<Revision> updateRolePermission(@Param String projectName, +178 @Param String repoName, +179 PerRolePermissions newPermission, +180 Author author) { +181 return mds.updatePerRolePermissions(author, projectName, repoName, newPermission); +182 } +183 +184 /** +185 * POST /metadata/{projectName}/repos/{repoName}/perm/users +186 * +187 * <p>Adds {@link Permission}s of the specific users to the specified {@code repoName} in the +188 * specified {@code projectName}. +189 */ +190 @Post("/metadata/{projectName}/repos/{repoName}/perm/users") +191 public CompletableFuture<Revision> addSpecificUserPermission( +192 @Param String projectName, +193 @Param String repoName, +194 IdentifierWithPermissions memberWithPermissions, +195 Author author) { +196 final User member = new User(loginNameNormalizer.apply(memberWithPermissions.id())); +197 return mds.addPerUserPermission(author, projectName, repoName, +198 member, memberWithPermissions.permissions()); +199 } +200 +201 /** +202 * PATCH /metadata/{projectName}/repos/{repoName}/perm/users/{memberId} +203 * +204 * <p>Updates {@link Permission}s for the specified {@code memberId} of the specified {@code repoName} +205 * in the specified {@code projectName}. +206 */ +207 @Patch("/metadata/{projectName}/repos/{repoName}/perm/users/{memberId}") +208 @Consumes("application/json-patch+json") +209 public CompletableFuture<Revision> updateSpecificUserPermission(@Param String projectName, +210 @Param String repoName, +211 @Param String memberId, +212 JsonPatch jsonPatch, +213 Author author) { +214 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/permissions"); +215 final Collection<Permission> permissions = Jackson.convertValue(operation.value(), permissionsTypeRef); +216 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); +217 return mds.findPermissions(projectName, repoName, member) +218 .thenCompose(unused -> mds.updatePerUserPermission(author, +219 projectName, repoName, member, +220 permissions)); +221 } +222 +223 /** +224 * DELETE /metadata/{projectName}/repos/{repoName}/perm/users/{memberId} +225 * +226 * <p>Removes {@link Permission}s for the specified {@code memberId} from the specified {@code repoName} +227 * in the specified {@code projectName}. +228 */ +229 @Delete("/metadata/{projectName}/repos/{repoName}/perm/users/{memberId}") +230 public CompletableFuture<Revision> removeSpecificUserPermission(@Param String projectName, +231 @Param String repoName, +232 @Param String memberId, +233 Author author) { +234 final User member = new User(loginNameNormalizer.apply(urlDecode(memberId))); +235 return mds.findPermissions(projectName, repoName, member) +236 .thenCompose(unused -> mds.removePerUserPermission(author, projectName, +237 repoName, member)); +238 } +239 +240 /** +241 * POST /metadata/{projectName}/repos/{repoName}/perm/tokens +242 * +243 * <p>Adds {@link Permission}s for a token to the specified {@code repoName} in the specified +244 * {@code projectName}. +245 */ +246 @Post("/metadata/{projectName}/repos/{repoName}/perm/tokens") +247 public CompletableFuture<Revision> addSpecificTokenPermission( +248 @Param String projectName, +249 @Param String repoName, +250 IdentifierWithPermissions tokenWithPermissions, +251 Author author) { +252 return mds.addPerTokenPermission(author, projectName, repoName, +253 tokenWithPermissions.id(), tokenWithPermissions.permissions()); +254 } +255 +256 /** +257 * PATCH /metadata/{projectName}/repos/{repoName}/perm/tokens/{appId} +258 * +259 * <p>Updates {@link Permission}s for the specified {@code appId} of the specified {@code repoName} +260 * in the specified {@code projectName}. +261 */ +262 @Patch("/metadata/{projectName}/repos/{repoName}/perm/tokens/{appId}") +263 @Consumes("application/json-patch+json") +264 public CompletableFuture<Revision> updateSpecificTokenPermission(@Param String projectName, +265 @Param String repoName, +266 @Param String appId, +267 JsonPatch jsonPatch, +268 Author author) { +269 final ReplaceOperation operation = ensureSingleReplaceOperation(jsonPatch, "/permissions"); +270 final Collection<Permission> permissions = Jackson.convertValue(operation.value(), permissionsTypeRef); +271 return mds.findTokenByAppId(appId) +272 .thenCompose(token -> mds.updatePerTokenPermission( +273 author, projectName, repoName, appId, permissions)); +274 } +275 +276 /** +277 * DELETE /metadata/{projectName}/repos/{repoName}/perm/tokens/{appId} +278 * +279 * <p>Removes {@link Permission}s of the specified {@code appId} from the specified {@code repoName} +280 * in the specified {@code projectName}. +281 */ +282 @Delete("/metadata/{projectName}/repos/{repoName}/perm/tokens/{appId}") +283 public CompletableFuture<Revision> removeSpecificTokenPermission(@Param String projectName, +284 @Param String repoName, +285 @Param String appId, +286 Author author) { +287 return mds.findTokenByAppId(appId) +288 .thenCompose(token -> mds.removePerTokenPermission(author, +289 projectName, repoName, appId)); +290 } +291 +292 /** +293 * PATCH /metadata/{projectName}/repos/{repoName}/quota/write +294 * +295 * <p>Updates the {@linkplain QuotaConfig write quota} for the specified {@code repoName} +296 * in the specified {@code projectName}. +297 */ +298 @Patch("/metadata/{projectName}/repos/{repoName}/quota/write") +299 @Consumes("application/json-patch+json") +300 @RequiresAdministrator +301 public CompletableFuture<Revision> updateWriteQuota(@Param String projectName, +302 @Param String repoName, +303 QuotaConfig quota, +304 Author author) { +305 return mds.updateWriteQuota(author, projectName, repoName, quota); +306 } +307 +308 private static ReplaceOperation ensureSingleReplaceOperation(JsonPatch patch, String expectedPath) { +309 final List<JsonPatchOperation> operations = patch.operations(); +310 checkArgument(operations.size() == 1, +311 "Should be a single JSON patch operation in the list: " + operations.size()); +312 +313 final JsonPatchOperation operation = patch.operations().get(0); +314 checkArgument(operation instanceof ReplaceOperation, +315 "Should be a replace operation: " + operation); +316 +317 checkArgument(expectedPath.equals(operation.path().toString()), +318 "Invalid path value: " + operation.path()); +319 +320 return (ReplaceOperation) operation; +321 } +322 +323 private static String urlDecode(String input) { +324 try { +325 // TODO(hyangtack) Remove this after https://github.com/line/armeria/issues/756 is resolved. +326 return URLDecoder.decode(input, StandardCharsets.UTF_8.name()); +327 } catch (UnsupportedEncodingException e) { +328 return Exceptions.throwUnsafely(e); +329 } +330 } +331 +332 private static ProjectRole toProjectRole(String roleStr) { +333 final ProjectRole role = ProjectRole.valueOf(requireNonNull(roleStr, "roleStr")); +334 checkArgument(role == ProjectRole.OWNER || role == ProjectRole.MEMBER, +335 "Invalid role: " + role + +336 " (expected: '" + ProjectRole.OWNER + "' or '" + ProjectRole.MEMBER + "')"); +337 return role; +338 } +339 +340 // TODO(hyangtack) Move these classes to the common module later when our java client accesses to +341 // the metadata. +342 static final class IdentifierWithRole { +343 +344 private final String id; +345 private final String role; +346 +347 @JsonCreator +348 IdentifierWithRole(@JsonProperty("id") String id, +349 @JsonProperty("role") String role) { +350 this.id = requireNonNull(id, "id"); +351 this.role = requireNonNull(role, "role"); +352 } +353 +354 @JsonProperty +355 public String id() { +356 return id; +357 } +358 +359 @JsonProperty +360 public String role() { +361 return role; +362 } +363 +364 @Override +365 public String toString() { +366 return MoreObjects.toStringHelper(this) +367 .add("id", id()) +368 .add("role", role()) +369 .toString(); +370 } +371 } +372 +373 static final class IdentifierWithPermissions { +374 +375 private final String id; +376 private final Collection<Permission> permissions; +377 +378 @JsonCreator +379 IdentifierWithPermissions(@JsonProperty("id") String id, +380 @JsonProperty("permissions") Collection<Permission> permissions) { +381 this.id = requireNonNull(id, "id"); +382 this.permissions = requireNonNull(permissions, "permissions"); +383 } +384 +385 @JsonProperty +386 public String id() { +387 return id; +388 } +389 +390 @JsonProperty +391 public Collection<Permission> permissions() { +392 return permissions; +393 } +394 +395 @Override +396 public String toString() { +397 return MoreObjects.toStringHelper(this) +398 .add("id", id()) +399 .add("permissions", permissions()) +400 .toString(); +401 } +402 } +403 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/MirroringServiceV1.html b/xref/com/linecorp/centraldogma/server/internal/api/MirroringServiceV1.html index c3f2a17170..ebcaf2e998 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/MirroringServiceV1.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/MirroringServiceV1.html @@ -24,14 +24,14 @@ 16 17 package com.linecorp.centraldogma.server.internal.api; 18 -19 import static com.google.common.base.Preconditions.checkArgument; -20 import static com.google.common.collect.ImmutableList.toImmutableList; -21 -22 import java.net.URI; -23 import java.util.List; -24 import java.util.concurrent.CompletableFuture; -25 -26 import com.linecorp.armeria.server.annotation.ConsumesJson; +19 import static com.google.common.collect.ImmutableList.toImmutableList; +20 +21 import java.net.URI; +22 import java.util.List; +23 import java.util.concurrent.CompletableFuture; +24 +25 import com.linecorp.armeria.server.annotation.ConsumesJson; +26 import com.linecorp.armeria.server.annotation.ExceptionHandler; 27 import com.linecorp.armeria.server.annotation.Get; 28 import com.linecorp.armeria.server.annotation.Param; 29 import com.linecorp.armeria.server.annotation.Post; @@ -53,73 +53,73 @@ 45 * Annotated service object for managing mirroring service. 46 */ 47 @ProducesJson -48 public class MirroringServiceV1 extends AbstractService { -49 -50 // TODO(ikhoon): -51 // - Write documentation for the REST API specification -52 // - Add Java APIs to the CentralDogma client -53 -54 private final ProjectApiManager projectApiManager; -55 -56 public MirroringServiceV1(ProjectApiManager projectApiManager, CommandExecutor executor) { -57 super(executor); -58 this.projectApiManager = projectApiManager; -59 } -60 -61 /** -62 * GET /projects/{projectName}/mirrors -63 * -64 * <p>Returns the list of the mirrors in the project. -65 */ -66 @RequiresReadPermission(repository = Project.REPO_META) -67 @Get("/projects/{projectName}/mirrors") -68 public CompletableFuture<List<MirrorDto>> listMirrors(@Param String projectName) { -69 return metaRepo(projectName).mirrors(true).thenApply(mirrors -> { -70 return mirrors.stream() -71 .map(mirror -> convertToMirrorDto(projectName, mirror)) -72 .collect(toImmutableList()); -73 }); -74 } -75 -76 /** -77 * GET /projects/{projectName}/mirrors/{id} -78 * -79 * <p>Returns the mirror of the ID in the project mirror list. -80 */ -81 @RequiresReadPermission(repository = Project.REPO_META) -82 @Get("/projects/{projectName}/mirrors/{id}") -83 public CompletableFuture<MirrorDto> getMirror(@Param String projectName, @Param String id) { -84 -85 return metaRepo(projectName).mirror(id).thenApply(mirror -> { -86 return convertToMirrorDto(projectName, mirror); -87 }); -88 } -89 -90 /** -91 * POST /projects/{projectName}/mirrors -92 * -93 * <p>Creates a new mirror. -94 */ -95 @RequiresWritePermission(repository = Project.REPO_META) -96 @Post("/projects/{projectName}/mirrors") -97 @ConsumesJson -98 @StatusCode(201) -99 public CompletableFuture<PushResultDto> createMirror(@Param String projectName, MirrorDto newMirror, -100 Author author) { -101 return createOrUpdate(projectName, newMirror, author, false); -102 } -103 -104 /** -105 * PUT /projects/{projectName}/mirrors -106 * -107 * <p>Update the exising mirror. -108 */ -109 @RequiresWritePermission(repository = Project.REPO_META) -110 @Put("/projects/{projectName}/mirrors/{id}") -111 @ConsumesJson -112 public CompletableFuture<PushResultDto> updateMirror(@Param String projectName, MirrorDto mirror, -113 @Param String id, Author author) { -114 checkArgument(id.equals(mirror.id()), "The mirror ID (%s) can't be updated", id); +48 @ExceptionHandler(HttpApiExceptionHandler.class) +49 public class MirroringServiceV1 extends AbstractService { +50 +51 // TODO(ikhoon): +52 // - Write documentation for the REST API specification +53 // - Add Java APIs to the CentralDogma client +54 +55 private final ProjectApiManager projectApiManager; +56 +57 public MirroringServiceV1(ProjectApiManager projectApiManager, CommandExecutor executor) { +58 super(executor); +59 this.projectApiManager = projectApiManager; +60 } +61 +62 /** +63 * GET /projects/{projectName}/mirrors +64 * +65 * <p>Returns the list of the mirrors in the project. +66 */ +67 @RequiresReadPermission(repository = Project.REPO_META) +68 @Get("/projects/{projectName}/mirrors") +69 public CompletableFuture<List<MirrorDto>> listMirrors(@Param String projectName) { +70 return metaRepo(projectName).mirrors(true).thenApply(mirrors -> { +71 return mirrors.stream() +72 .map(mirror -> convertToMirrorDto(projectName, mirror)) +73 .collect(toImmutableList()); +74 }); +75 } +76 +77 /** +78 * GET /projects/{projectName}/mirrors/{id} +79 * +80 * <p>Returns the mirror of the ID in the project mirror list. +81 */ +82 @RequiresReadPermission(repository = Project.REPO_META) +83 @Get("/projects/{projectName}/mirrors/{id}") +84 public CompletableFuture<MirrorDto> getMirror(@Param String projectName, @Param String id) { +85 +86 return metaRepo(projectName).mirror(id).thenApply(mirror -> { +87 return convertToMirrorDto(projectName, mirror); +88 }); +89 } +90 +91 /** +92 * POST /projects/{projectName}/mirrors +93 * +94 * <p>Creates a new mirror. +95 */ +96 @RequiresWritePermission(repository = Project.REPO_META) +97 @Post("/projects/{projectName}/mirrors") +98 @ConsumesJson +99 @StatusCode(201) +100 public CompletableFuture<PushResultDto> createMirror(@Param String projectName, MirrorDto newMirror, +101 Author author) { +102 return createOrUpdate(projectName, newMirror, author, false); +103 } +104 +105 /** +106 * PUT /projects/{projectName}/mirrors +107 * +108 * <p>Update the exising mirror. +109 */ +110 @RequiresWritePermission(repository = Project.REPO_META) +111 @Put("/projects/{projectName}/mirrors") +112 @ConsumesJson +113 public CompletableFuture<PushResultDto> updateMirror(@Param String projectName, MirrorDto mirror, +114 Author author) { 115 return createOrUpdate(projectName, mirror, author, true); 116 } 117 diff --git a/xref/com/linecorp/centraldogma/server/internal/api/ProjectServiceV1.html b/xref/com/linecorp/centraldogma/server/internal/api/ProjectServiceV1.html index 5276a68c3c..343ff82121 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/ProjectServiceV1.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/ProjectServiceV1.html @@ -42,17 +42,17 @@ 34 import com.linecorp.armeria.server.annotation.Consumes; 35 import com.linecorp.armeria.server.annotation.Default; 36 import com.linecorp.armeria.server.annotation.Delete; -37 import com.linecorp.armeria.server.annotation.Get; -38 import com.linecorp.armeria.server.annotation.Param; -39 import com.linecorp.armeria.server.annotation.Patch; -40 import com.linecorp.armeria.server.annotation.Post; -41 import com.linecorp.armeria.server.annotation.ProducesJson; -42 import com.linecorp.armeria.server.annotation.ResponseConverter; -43 import com.linecorp.armeria.server.annotation.StatusCode; -44 import com.linecorp.centraldogma.common.Author; -45 import com.linecorp.centraldogma.internal.api.v1.CreateProjectRequest; -46 import com.linecorp.centraldogma.internal.api.v1.ProjectDto; -47 import com.linecorp.centraldogma.server.command.CommandExecutor; +37 import com.linecorp.armeria.server.annotation.ExceptionHandler; +38 import com.linecorp.armeria.server.annotation.Get; +39 import com.linecorp.armeria.server.annotation.Param; +40 import com.linecorp.armeria.server.annotation.Patch; +41 import com.linecorp.armeria.server.annotation.Post; +42 import com.linecorp.armeria.server.annotation.ProducesJson; +43 import com.linecorp.armeria.server.annotation.ResponseConverter; +44 import com.linecorp.armeria.server.annotation.StatusCode; +45 import com.linecorp.centraldogma.common.Author; +46 import com.linecorp.centraldogma.internal.api.v1.CreateProjectRequest; +47 import com.linecorp.centraldogma.internal.api.v1.ProjectDto; 48 import com.linecorp.centraldogma.server.internal.api.auth.RequiresAdministrator; 49 import com.linecorp.centraldogma.server.internal.api.auth.RequiresRole; 50 import com.linecorp.centraldogma.server.internal.api.converter.CreateApiResponseConverter; @@ -65,12 +65,12 @@ 57 * Annotated service object for managing projects. 58 */ 59 @ProducesJson -60 public class ProjectServiceV1 extends AbstractService { -61 -62 private final ProjectApiManager projectApiManager; -63 -64 public ProjectServiceV1(ProjectApiManager projectApiManager, CommandExecutor executor) { -65 super(executor); +60 @ExceptionHandler(HttpApiExceptionHandler.class) +61 public class ProjectServiceV1 { +62 +63 private final ProjectApiManager projectApiManager; +64 +65 public ProjectServiceV1(ProjectApiManager projectApiManager) { 66 this.projectApiManager = requireNonNull(projectApiManager, "projectApiManager"); 67 } 68 diff --git a/xref/com/linecorp/centraldogma/server/internal/api/RepositoryServiceV1.html b/xref/com/linecorp/centraldogma/server/internal/api/RepositoryServiceV1.html index f9d18758bb..33b0c0b54a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/RepositoryServiceV1.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/RepositoryServiceV1.html @@ -45,201 +45,203 @@ 37 import com.linecorp.armeria.server.ServiceRequestContext; 38 import com.linecorp.armeria.server.annotation.Consumes; 39 import com.linecorp.armeria.server.annotation.Delete; -40 import com.linecorp.armeria.server.annotation.Get; -41 import com.linecorp.armeria.server.annotation.Param; -42 import com.linecorp.armeria.server.annotation.Patch; -43 import com.linecorp.armeria.server.annotation.Post; -44 import com.linecorp.armeria.server.annotation.ProducesJson; -45 import com.linecorp.armeria.server.annotation.ResponseConverter; -46 import com.linecorp.armeria.server.annotation.StatusCode; -47 import com.linecorp.centraldogma.common.Author; -48 import com.linecorp.centraldogma.common.Revision; -49 import com.linecorp.centraldogma.internal.api.v1.CreateRepositoryRequest; -50 import com.linecorp.centraldogma.internal.api.v1.RepositoryDto; -51 import com.linecorp.centraldogma.server.command.Command; -52 import com.linecorp.centraldogma.server.command.CommandExecutor; -53 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; -54 import com.linecorp.centraldogma.server.internal.api.auth.RequiresRole; -55 import com.linecorp.centraldogma.server.internal.api.converter.CreateApiResponseConverter; -56 import com.linecorp.centraldogma.server.metadata.MetadataService; -57 import com.linecorp.centraldogma.server.metadata.ProjectRole; -58 import com.linecorp.centraldogma.server.metadata.User; -59 import com.linecorp.centraldogma.server.storage.project.Project; -60 import com.linecorp.centraldogma.server.storage.repository.Repository; -61 -62 import io.micrometer.core.instrument.Tag; -63 -64 /** -65 * Annotated service object for managing repositories. -66 */ -67 @ProducesJson -68 public class RepositoryServiceV1 extends AbstractService { -69 -70 private final MetadataService mds; +40 import com.linecorp.armeria.server.annotation.ExceptionHandler; +41 import com.linecorp.armeria.server.annotation.Get; +42 import com.linecorp.armeria.server.annotation.Param; +43 import com.linecorp.armeria.server.annotation.Patch; +44 import com.linecorp.armeria.server.annotation.Post; +45 import com.linecorp.armeria.server.annotation.ProducesJson; +46 import com.linecorp.armeria.server.annotation.ResponseConverter; +47 import com.linecorp.armeria.server.annotation.StatusCode; +48 import com.linecorp.centraldogma.common.Author; +49 import com.linecorp.centraldogma.common.Revision; +50 import com.linecorp.centraldogma.internal.api.v1.CreateRepositoryRequest; +51 import com.linecorp.centraldogma.internal.api.v1.RepositoryDto; +52 import com.linecorp.centraldogma.server.command.Command; +53 import com.linecorp.centraldogma.server.command.CommandExecutor; +54 import com.linecorp.centraldogma.server.internal.api.auth.RequiresReadPermission; +55 import com.linecorp.centraldogma.server.internal.api.auth.RequiresRole; +56 import com.linecorp.centraldogma.server.internal.api.converter.CreateApiResponseConverter; +57 import com.linecorp.centraldogma.server.metadata.MetadataService; +58 import com.linecorp.centraldogma.server.metadata.ProjectRole; +59 import com.linecorp.centraldogma.server.metadata.User; +60 import com.linecorp.centraldogma.server.storage.project.Project; +61 import com.linecorp.centraldogma.server.storage.repository.Repository; +62 +63 import io.micrometer.core.instrument.Tag; +64 +65 /** +66 * Annotated service object for managing repositories. +67 */ +68 @ProducesJson +69 @ExceptionHandler(HttpApiExceptionHandler.class) +70 public class RepositoryServiceV1 extends AbstractService { 71 -72 public RepositoryServiceV1(CommandExecutor executor, MetadataService mds) { -73 super(executor); -74 this.mds = requireNonNull(mds, "mds"); -75 } -76 -77 /** -78 * GET /projects/{projectName}/repos?status={status} -79 * -80 * <p>Returns the list of the repositories or removed repositories. -81 */ -82 @Get("/projects/{projectName}/repos") -83 public CompletableFuture<List<RepositoryDto>> listRepositories(ServiceRequestContext ctx, Project project, -84 @Param @Nullable String status, User user) { -85 if (status != null) { -86 HttpApiUtil.checkStatusArgument(status); -87 } -88 -89 return mds.findRole(project.name(), user).handle((role, throwable) -> { -90 final boolean hasOwnerRole = role == ProjectRole.OWNER; -91 if (status != null) { -92 if (hasOwnerRole) { -93 return project.repos().listRemoved().keySet().stream().map(RepositoryDto::new) -94 .collect(toImmutableList()); -95 } -96 return HttpApiUtil.throwResponse( -97 ctx, HttpStatus.FORBIDDEN, -98 "You must be an owner of project '%s' to retrieve removed repositories.", -99 project.name()); -100 } -101 -102 return project.repos().list().values().stream() -103 .filter(r -> user.isAdmin() || !Project.REPO_DOGMA.equals(r.name())) -104 .filter(r -> hasOwnerRole || !Project.REPO_META.equals(r.name())) -105 .map(DtoConverter::convert) -106 .collect(toImmutableList()); -107 }); -108 } -109 -110 /** -111 * POST /projects/{projectName}/repos -112 * -113 * <p>Creates a new repository. -114 */ -115 @Post("/projects/{projectName}/repos") -116 @StatusCode(201) -117 @ResponseConverter(CreateApiResponseConverter.class) -118 @RequiresRole(roles = ProjectRole.OWNER) -119 public CompletableFuture<RepositoryDto> createRepository(ServiceRequestContext ctx, Project project, -120 CreateRepositoryRequest request, -121 Author author) { -122 if (Project.isReservedRepoName(request.name())) { -123 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, -124 "A reserved repository cannot be created."); -125 } -126 return execute(Command.createRepository(author, project.name(), request.name())) -127 .thenCompose(unused -> mds.addRepo(author, project.name(), request.name())) -128 .handle(returnOrThrow(() -> DtoConverter.convert(project.repos().get(request.name())))); -129 } -130 -131 /** -132 * DELETE /projects/{projectName}/repos/{repoName} -133 * -134 * <p>Removes a repository. -135 */ -136 @Delete("/projects/{projectName}/repos/{repoName}") -137 @RequiresRole(roles = ProjectRole.OWNER) -138 public CompletableFuture<Void> removeRepository(ServiceRequestContext ctx, -139 @Param String repoName, -140 Repository repository, -141 Author author) { -142 if (Project.isReservedRepoName(repoName)) { -143 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, -144 "A reserved repository cannot be removed."); -145 } -146 return execute(Command.removeRepository(author, repository.parent().name(), repository.name())) -147 .thenCompose(unused -> mds.removeRepo(author, repository.parent().name(), repository.name())) -148 .handle(HttpApiUtil::throwUnsafelyIfNonNull); -149 } -150 -151 /** -152 * DELETE /projects/{projectName}/repos/{repoName}/removed -153 * -154 * <p>Purges a repository that was removed before. -155 */ -156 @Delete("/projects/{projectName}/repos/{repoName}/removed") -157 @RequiresRole(roles = ProjectRole.OWNER) -158 public CompletableFuture<Void> purgeRepository(@Param String repoName, -159 Project project, Author author) { -160 return execute(Command.purgeRepository(author, project.name(), repoName)) -161 .thenCompose(unused -> mds.purgeRepo(author, project.name(), repoName) -162 .handle(HttpApiUtil::throwUnsafelyIfNonNull)); -163 } -164 -165 /** -166 * PATCH /projects/{projectName}/repos/{repoName} -167 * -168 * <p>Patches a repository with the JSON_PATCH. Currently, only unremove repository operation is supported. -169 */ -170 @Consumes("application/json-patch+json") -171 @Patch("/projects/{projectName}/repos/{repoName}") -172 @RequiresRole(roles = ProjectRole.OWNER) -173 public CompletableFuture<RepositoryDto> patchRepository(@Param String repoName, -174 Project project, -175 JsonNode node, -176 Author author) { -177 checkUnremoveArgument(node); -178 return execute(Command.unremoveRepository(author, project.name(), repoName)) -179 .thenCompose(unused -> mds.restoreRepo(author, project.name(), repoName)) -180 .handle(returnOrThrow(() -> DtoConverter.convert(project.repos().get(repoName)))); -181 } -182 -183 /** -184 * GET /projects/{projectName}/repos/{repoName}/revision/{revision} -185 * -186 * <p>Normalizes the revision into an absolute revision. -187 */ -188 @Get("/projects/{projectName}/repos/{repoName}/revision/{revision}") -189 @RequiresReadPermission -190 public Map<String, Integer> normalizeRevision(ServiceRequestContext ctx, -191 Repository repository, @Param String revision) { -192 final Revision normalizedRevision = repository.normalizeNow(new Revision(revision)); -193 final Revision head = repository.normalizeNow(Revision.HEAD); -194 increaseCounterIfOldRevisionUsed(ctx, repository, normalizedRevision, head); -195 return ImmutableMap.of("revision", normalizedRevision.major()); -196 } -197 -198 static void increaseCounterIfOldRevisionUsed(ServiceRequestContext ctx, Repository repository, -199 Revision revision) { -200 final Revision normalized = repository.normalizeNow(revision); -201 final Revision head = repository.normalizeNow(Revision.HEAD); -202 increaseCounterIfOldRevisionUsed(ctx, repository, normalized, head); -203 } -204 -205 public static void increaseCounterIfOldRevisionUsed( -206 ServiceRequestContext ctx, Repository repository, Revision normalized, Revision head) { -207 final String projectName = repository.parent().name(); -208 final String repoName = repository.name(); -209 if (normalized.major() == 1) { -210 ctx.log().whenRequestComplete().thenAccept( -211 log -> ctx.meterRegistry() -212 .counter("revisions.init", generateTags(projectName, repoName, log).build()) -213 .increment()); -214 } -215 if (head.major() - normalized.major() >= 5000) { -216 ctx.log().whenRequestComplete().thenAccept( -217 log -> ctx.meterRegistry() -218 .summary("revisions.old", -219 generateTags(projectName, repoName, log) -220 .add(Tag.of("init", Boolean.toString(normalized.major() == 1))) -221 .build()) -222 .record(head.major() - normalized.major())); -223 } -224 } -225 -226 private static ImmutableList.Builder<Tag> generateTags( -227 String projectName, String repoName, RequestOnlyLog log) { -228 final ImmutableList.Builder<Tag> builder = ImmutableList.builder(); -229 return builder.add(Tag.of("project", projectName), -230 Tag.of("repo", repoName), -231 Tag.of("service", firstNonNull(log.serviceName(), "none")), -232 Tag.of("method", log.name())); -233 } -234 } +72 private final MetadataService mds; +73 +74 public RepositoryServiceV1(CommandExecutor executor, MetadataService mds) { +75 super(executor); +76 this.mds = requireNonNull(mds, "mds"); +77 } +78 +79 /** +80 * GET /projects/{projectName}/repos?status={status} +81 * +82 * <p>Returns the list of the repositories or removed repositories. +83 */ +84 @Get("/projects/{projectName}/repos") +85 public CompletableFuture<List<RepositoryDto>> listRepositories(ServiceRequestContext ctx, Project project, +86 @Param @Nullable String status, User user) { +87 if (status != null) { +88 HttpApiUtil.checkStatusArgument(status); +89 } +90 +91 return mds.findRole(project.name(), user).handle((role, throwable) -> { +92 final boolean hasOwnerRole = role == ProjectRole.OWNER; +93 if (status != null) { +94 if (hasOwnerRole) { +95 return project.repos().listRemoved().keySet().stream().map(RepositoryDto::new) +96 .collect(toImmutableList()); +97 } +98 return HttpApiUtil.throwResponse( +99 ctx, HttpStatus.FORBIDDEN, +100 "You must be an owner of project '%s' to retrieve removed repositories.", +101 project.name()); +102 } +103 +104 return project.repos().list().values().stream() +105 .filter(r -> user.isAdmin() || !Project.REPO_DOGMA.equals(r.name())) +106 .filter(r -> hasOwnerRole || !Project.REPO_META.equals(r.name())) +107 .map(DtoConverter::convert) +108 .collect(toImmutableList()); +109 }); +110 } +111 +112 /** +113 * POST /projects/{projectName}/repos +114 * +115 * <p>Creates a new repository. +116 */ +117 @Post("/projects/{projectName}/repos") +118 @StatusCode(201) +119 @ResponseConverter(CreateApiResponseConverter.class) +120 @RequiresRole(roles = ProjectRole.OWNER) +121 public CompletableFuture<RepositoryDto> createRepository(ServiceRequestContext ctx, Project project, +122 CreateRepositoryRequest request, +123 Author author) { +124 if (Project.isReservedRepoName(request.name())) { +125 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, +126 "A reserved repository cannot be created."); +127 } +128 return execute(Command.createRepository(author, project.name(), request.name())) +129 .thenCompose(unused -> mds.addRepo(author, project.name(), request.name())) +130 .handle(returnOrThrow(() -> DtoConverter.convert(project.repos().get(request.name())))); +131 } +132 +133 /** +134 * DELETE /projects/{projectName}/repos/{repoName} +135 * +136 * <p>Removes a repository. +137 */ +138 @Delete("/projects/{projectName}/repos/{repoName}") +139 @RequiresRole(roles = ProjectRole.OWNER) +140 public CompletableFuture<Void> removeRepository(ServiceRequestContext ctx, +141 @Param String repoName, +142 Repository repository, +143 Author author) { +144 if (Project.isReservedRepoName(repoName)) { +145 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, +146 "A reserved repository cannot be removed."); +147 } +148 return execute(Command.removeRepository(author, repository.parent().name(), repository.name())) +149 .thenCompose(unused -> mds.removeRepo(author, repository.parent().name(), repository.name())) +150 .handle(HttpApiUtil::throwUnsafelyIfNonNull); +151 } +152 +153 /** +154 * DELETE /projects/{projectName}/repos/{repoName}/removed +155 * +156 * <p>Purges a repository that was removed before. +157 */ +158 @Delete("/projects/{projectName}/repos/{repoName}/removed") +159 @RequiresRole(roles = ProjectRole.OWNER) +160 public CompletableFuture<Void> purgeRepository(@Param String repoName, +161 Project project, Author author) { +162 return execute(Command.purgeRepository(author, project.name(), repoName)) +163 .thenCompose(unused -> mds.purgeRepo(author, project.name(), repoName) +164 .handle(HttpApiUtil::throwUnsafelyIfNonNull)); +165 } +166 +167 /** +168 * PATCH /projects/{projectName}/repos/{repoName} +169 * +170 * <p>Patches a repository with the JSON_PATCH. Currently, only unremove repository operation is supported. +171 */ +172 @Consumes("application/json-patch+json") +173 @Patch("/projects/{projectName}/repos/{repoName}") +174 @RequiresRole(roles = ProjectRole.OWNER) +175 public CompletableFuture<RepositoryDto> patchRepository(@Param String repoName, +176 Project project, +177 JsonNode node, +178 Author author) { +179 checkUnremoveArgument(node); +180 return execute(Command.unremoveRepository(author, project.name(), repoName)) +181 .thenCompose(unused -> mds.restoreRepo(author, project.name(), repoName)) +182 .handle(returnOrThrow(() -> DtoConverter.convert(project.repos().get(repoName)))); +183 } +184 +185 /** +186 * GET /projects/{projectName}/repos/{repoName}/revision/{revision} +187 * +188 * <p>Normalizes the revision into an absolute revision. +189 */ +190 @Get("/projects/{projectName}/repos/{repoName}/revision/{revision}") +191 @RequiresReadPermission +192 public Map<String, Integer> normalizeRevision(ServiceRequestContext ctx, +193 Repository repository, @Param String revision) { +194 final Revision normalizedRevision = repository.normalizeNow(new Revision(revision)); +195 final Revision head = repository.normalizeNow(Revision.HEAD); +196 increaseCounterIfOldRevisionUsed(ctx, repository, normalizedRevision, head); +197 return ImmutableMap.of("revision", normalizedRevision.major()); +198 } +199 +200 static void increaseCounterIfOldRevisionUsed(ServiceRequestContext ctx, Repository repository, +201 Revision revision) { +202 final Revision normalized = repository.normalizeNow(revision); +203 final Revision head = repository.normalizeNow(Revision.HEAD); +204 increaseCounterIfOldRevisionUsed(ctx, repository, normalized, head); +205 } +206 +207 public static void increaseCounterIfOldRevisionUsed( +208 ServiceRequestContext ctx, Repository repository, Revision normalized, Revision head) { +209 final String projectName = repository.parent().name(); +210 final String repoName = repository.name(); +211 if (normalized.major() == 1) { +212 ctx.log().whenRequestComplete().thenAccept( +213 log -> ctx.meterRegistry() +214 .counter("revisions.init", generateTags(projectName, repoName, log).build()) +215 .increment()); +216 } +217 if (head.major() - normalized.major() >= 5000) { +218 ctx.log().whenRequestComplete().thenAccept( +219 log -> ctx.meterRegistry() +220 .summary("revisions.old", +221 generateTags(projectName, repoName, log) +222 .add(Tag.of("init", Boolean.toString(normalized.major() == 1))) +223 .build()) +224 .record(head.major() - normalized.major())); +225 } +226 } +227 +228 private static ImmutableList.Builder<Tag> generateTags( +229 String projectName, String repoName, RequestOnlyLog log) { +230 final ImmutableList.Builder<Tag> builder = ImmutableList.builder(); +231 return builder.add(Tag.of("project", projectName), +232 Tag.of("repo", repoName), +233 Tag.of("service", firstNonNull(log.serviceName(), "none")), +234 Tag.of("method", log.name())); +235 } +236 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/TokenService.html b/xref/com/linecorp/centraldogma/server/internal/api/TokenService.html index 35a58e7887..a2cda9b285 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/TokenService.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/TokenService.html @@ -42,175 +42,177 @@ 34 import com.linecorp.armeria.server.ServiceRequestContext; 35 import com.linecorp.armeria.server.annotation.Consumes; 36 import com.linecorp.armeria.server.annotation.Delete; -37 import com.linecorp.armeria.server.annotation.Get; -38 import com.linecorp.armeria.server.annotation.HttpResult; -39 import com.linecorp.armeria.server.annotation.Param; -40 import com.linecorp.armeria.server.annotation.Patch; -41 import com.linecorp.armeria.server.annotation.Post; -42 import com.linecorp.armeria.server.annotation.ProducesJson; -43 import com.linecorp.armeria.server.annotation.ResponseConverter; -44 import com.linecorp.armeria.server.annotation.StatusCode; -45 import com.linecorp.centraldogma.common.Author; -46 import com.linecorp.centraldogma.common.Revision; -47 import com.linecorp.centraldogma.internal.Jackson; -48 import com.linecorp.centraldogma.server.command.CommandExecutor; -49 import com.linecorp.centraldogma.server.internal.api.auth.RequiresAdministrator; -50 import com.linecorp.centraldogma.server.internal.api.converter.CreateApiResponseConverter; -51 import com.linecorp.centraldogma.server.metadata.MetadataService; -52 import com.linecorp.centraldogma.server.metadata.Token; -53 import com.linecorp.centraldogma.server.metadata.Tokens; -54 import com.linecorp.centraldogma.server.metadata.User; -55 -56 /** -57 * Annotated service object for managing {@link Token}s. -58 */ -59 @ProducesJson -60 public class TokenService extends AbstractService { -61 -62 private static final JsonNode activation = Jackson.valueToTree( -63 ImmutableList.of( -64 ImmutableMap.of("op", "replace", -65 "path", "/status", -66 "value", "active"))); -67 private static final JsonNode deactivation = Jackson.valueToTree( -68 ImmutableList.of( -69 ImmutableMap.of("op", "replace", -70 "path", "/status", -71 "value", "inactive"))); -72 -73 private final MetadataService mds; +37 import com.linecorp.armeria.server.annotation.ExceptionHandler; +38 import com.linecorp.armeria.server.annotation.Get; +39 import com.linecorp.armeria.server.annotation.HttpResult; +40 import com.linecorp.armeria.server.annotation.Param; +41 import com.linecorp.armeria.server.annotation.Patch; +42 import com.linecorp.armeria.server.annotation.Post; +43 import com.linecorp.armeria.server.annotation.ProducesJson; +44 import com.linecorp.armeria.server.annotation.ResponseConverter; +45 import com.linecorp.armeria.server.annotation.StatusCode; +46 import com.linecorp.centraldogma.common.Author; +47 import com.linecorp.centraldogma.common.Revision; +48 import com.linecorp.centraldogma.internal.Jackson; +49 import com.linecorp.centraldogma.server.command.CommandExecutor; +50 import com.linecorp.centraldogma.server.internal.api.auth.RequiresAdministrator; +51 import com.linecorp.centraldogma.server.internal.api.converter.CreateApiResponseConverter; +52 import com.linecorp.centraldogma.server.metadata.MetadataService; +53 import com.linecorp.centraldogma.server.metadata.Token; +54 import com.linecorp.centraldogma.server.metadata.Tokens; +55 import com.linecorp.centraldogma.server.metadata.User; +56 +57 /** +58 * Annotated service object for managing {@link Token}s. +59 */ +60 @ProducesJson +61 @ExceptionHandler(HttpApiExceptionHandler.class) +62 public class TokenService extends AbstractService { +63 +64 private static final JsonNode activation = Jackson.valueToTree( +65 ImmutableList.of( +66 ImmutableMap.of("op", "replace", +67 "path", "/status", +68 "value", "active"))); +69 private static final JsonNode deactivation = Jackson.valueToTree( +70 ImmutableList.of( +71 ImmutableMap.of("op", "replace", +72 "path", "/status", +73 "value", "inactive"))); 74 -75 public TokenService(CommandExecutor executor, MetadataService mds) { -76 super(executor); -77 this.mds = requireNonNull(mds, "mds"); -78 } -79 -80 /** -81 * GET /tokens -82 * -83 * <p>Returns the list of the tokens generated before. -84 */ -85 @Get("/tokens") -86 public CompletableFuture<Collection<Token>> listTokens(User loginUser) { -87 if (loginUser.isAdmin()) { -88 return mds.getTokens() -89 .thenApply(tokens -> tokens.appIds().values()); -90 } else { -91 return mds.getTokens() -92 .thenApply(Tokens::withoutSecret) -93 .thenApply(tokens -> tokens.appIds().values()); -94 } -95 } -96 -97 /** -98 * POST /tokens -99 * -100 * <p>Returns a newly-generated token belonging to the current login user. -101 */ -102 @Post("/tokens") -103 @StatusCode(201) -104 @ResponseConverter(CreateApiResponseConverter.class) -105 public CompletableFuture<HttpResult<Token>> createToken(@Param String appId, -106 @Param boolean isAdmin, -107 @Param @Nullable String secret, -108 Author author, User loginUser) { -109 checkArgument(!isAdmin || loginUser.isAdmin(), -110 "Only administrators are allowed to create an admin-level token."); -111 -112 checkArgument(secret == null || loginUser.isAdmin(), -113 "Only administrators are allowed to create a new token from the given secret string"); -114 -115 final CompletableFuture<Revision> tokenFuture; -116 if (secret != null) { -117 tokenFuture = mds.createToken(author, appId, secret, isAdmin); -118 } else { -119 tokenFuture = mds.createToken(author, appId, isAdmin); -120 } -121 return tokenFuture -122 .thenCompose(unused -> mds.findTokenByAppId(appId)) -123 .thenApply(token -> { -124 final ResponseHeaders headers = ResponseHeaders.of(HttpStatus.CREATED, -125 HttpHeaderNames.LOCATION, -126 "/tokens/" + appId); -127 return HttpResult.of(headers, token); -128 }); -129 } -130 -131 /** -132 * DELETE /tokens/{appId} -133 * -134 * <p>Deletes a token of the specified ID then returns it. -135 */ -136 @Delete("/tokens/{appId}") -137 public CompletableFuture<Token> deleteToken(ServiceRequestContext ctx, -138 @Param String appId, -139 Author author, User loginUser) { -140 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenCompose( -141 token -> mds.destroyToken(author, appId) -142 .thenApply(unused -> token.withoutSecret())); -143 } -144 -145 /** -146 * DELETE /tokens/{appId}/removed -147 * -148 * <p>Purges a token of the specified ID that was deleted before. -149 */ -150 @Delete("/tokens/{appId}/removed") -151 @RequiresAdministrator -152 public CompletableFuture<Token> purgeToken(ServiceRequestContext ctx, -153 @Param String appId, -154 Author author, User loginUser) { -155 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenApplyAsync( -156 token -> { -157 mds.purgeToken(author, appId); -158 return token.withoutSecret(); -159 }, ctx.blockingTaskExecutor()); -160 } -161 -162 /** -163 * PATCH /tokens/{appId} -164 * -165 * <p>Activates or deactivates the token of the specified {@code appId}. -166 */ -167 @Patch("/tokens/{appId}") -168 @Consumes("application/json-patch+json") -169 public CompletableFuture<Token> updateToken(ServiceRequestContext ctx, -170 @Param String appId, -171 JsonNode node, Author author, User loginUser) { -172 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenCompose( -173 token -> { -174 if (token.isDeleted()) { -175 throw new IllegalArgumentException( -176 "You can't update the status of the token scheduled for deletion."); -177 } -178 if (node.equals(activation)) { -179 return mds.activateToken(author, appId) -180 .thenApply(unused -> token.withoutSecret()); -181 } -182 if (node.equals(deactivation)) { -183 return mds.deactivateToken(author, appId) -184 .thenApply(unused -> token.withoutSecret()); -185 } -186 throw new IllegalArgumentException("Unsupported JSON patch: " + node + -187 " (expected: " + activation + " or " + deactivation + -188 ')'); -189 } -190 ); -191 } -192 -193 private CompletableFuture<Token> getTokenOrRespondForbidden(ServiceRequestContext ctx, -194 String appId, User loginUser) { -195 return mds.findTokenByAppId(appId).thenApply(token -> { -196 // Give permission to the administrators. -197 if (!loginUser.isAdmin() && -198 !token.creation().user().equals(loginUser.id())) { -199 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, -200 "Unauthorized token: %s", token); -201 } -202 return token; -203 }); -204 } -205 } +75 private final MetadataService mds; +76 +77 public TokenService(CommandExecutor executor, MetadataService mds) { +78 super(executor); +79 this.mds = requireNonNull(mds, "mds"); +80 } +81 +82 /** +83 * GET /tokens +84 * +85 * <p>Returns the list of the tokens generated before. +86 */ +87 @Get("/tokens") +88 public CompletableFuture<Collection<Token>> listTokens(User loginUser) { +89 if (loginUser.isAdmin()) { +90 return mds.getTokens() +91 .thenApply(tokens -> tokens.appIds().values()); +92 } else { +93 return mds.getTokens() +94 .thenApply(Tokens::withoutSecret) +95 .thenApply(tokens -> tokens.appIds().values()); +96 } +97 } +98 +99 /** +100 * POST /tokens +101 * +102 * <p>Returns a newly-generated token belonging to the current login user. +103 */ +104 @Post("/tokens") +105 @StatusCode(201) +106 @ResponseConverter(CreateApiResponseConverter.class) +107 public CompletableFuture<HttpResult<Token>> createToken(@Param String appId, +108 @Param boolean isAdmin, +109 @Param @Nullable String secret, +110 Author author, User loginUser) { +111 checkArgument(!isAdmin || loginUser.isAdmin(), +112 "Only administrators are allowed to create an admin-level token."); +113 +114 checkArgument(secret == null || loginUser.isAdmin(), +115 "Only administrators are allowed to create a new token from the given secret string"); +116 +117 final CompletableFuture<Revision> tokenFuture; +118 if (secret != null) { +119 tokenFuture = mds.createToken(author, appId, secret, isAdmin); +120 } else { +121 tokenFuture = mds.createToken(author, appId, isAdmin); +122 } +123 return tokenFuture +124 .thenCompose(unused -> mds.findTokenByAppId(appId)) +125 .thenApply(token -> { +126 final ResponseHeaders headers = ResponseHeaders.of(HttpStatus.CREATED, +127 HttpHeaderNames.LOCATION, +128 "/tokens/" + appId); +129 return HttpResult.of(headers, token); +130 }); +131 } +132 +133 /** +134 * DELETE /tokens/{appId} +135 * +136 * <p>Deletes a token of the specified ID then returns it. +137 */ +138 @Delete("/tokens/{appId}") +139 public CompletableFuture<Token> deleteToken(ServiceRequestContext ctx, +140 @Param String appId, +141 Author author, User loginUser) { +142 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenCompose( +143 token -> mds.destroyToken(author, appId) +144 .thenApply(unused -> token.withoutSecret())); +145 } +146 +147 /** +148 * DELETE /tokens/{appId}/removed +149 * +150 * <p>Purges a token of the specified ID that was deleted before. +151 */ +152 @Delete("/tokens/{appId}/removed") +153 @RequiresAdministrator +154 public CompletableFuture<Token> purgeToken(ServiceRequestContext ctx, +155 @Param String appId, +156 Author author, User loginUser) { +157 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenApplyAsync( +158 token -> { +159 mds.purgeToken(author, appId); +160 return token.withoutSecret(); +161 }, ctx.blockingTaskExecutor()); +162 } +163 +164 /** +165 * PATCH /tokens/{appId} +166 * +167 * <p>Activates or deactivates the token of the specified {@code appId}. +168 */ +169 @Patch("/tokens/{appId}") +170 @Consumes("application/json-patch+json") +171 public CompletableFuture<Token> updateToken(ServiceRequestContext ctx, +172 @Param String appId, +173 JsonNode node, Author author, User loginUser) { +174 return getTokenOrRespondForbidden(ctx, appId, loginUser).thenCompose( +175 token -> { +176 if (token.isDeleted()) { +177 throw new IllegalArgumentException( +178 "You can't update the status of the token scheduled for deletion."); +179 } +180 if (node.equals(activation)) { +181 return mds.activateToken(author, appId) +182 .thenApply(unused -> token.withoutSecret()); +183 } +184 if (node.equals(deactivation)) { +185 return mds.deactivateToken(author, appId) +186 .thenApply(unused -> token.withoutSecret()); +187 } +188 throw new IllegalArgumentException("Unsupported JSON patch: " + node + +189 " (expected: " + activation + " or " + deactivation + +190 ')'); +191 } +192 ); +193 } +194 +195 private CompletableFuture<Token> getTokenOrRespondForbidden(ServiceRequestContext ctx, +196 String appId, User loginUser) { +197 return mds.findTokenByAppId(appId).thenApply(token -> { +198 // Give permission to the administrators. +199 if (!loginUser.isAdmin() && +200 !token.creation().user().equals(loginUser.id())) { +201 return HttpApiUtil.throwResponse(ctx, HttpStatus.FORBIDDEN, +202 "Unauthorized token: %s", token); +203 } +204 return token; +205 }); +206 } +207 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/api/auth/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/api/auth/package-frame.html index d23c1041eb..622783983f 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/auth/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/auth/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api.auth diff --git a/xref/com/linecorp/centraldogma/server/internal/api/auth/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/api/auth/package-summary.html index f600a28eeb..c7b96ef43a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/auth/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/auth/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api.auth + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api.auth diff --git a/xref/com/linecorp/centraldogma/server/internal/api/converter/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/api/converter/package-frame.html index 99ec880601..8583e9361a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/converter/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/converter/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api.converter + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api.converter diff --git a/xref/com/linecorp/centraldogma/server/internal/api/converter/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/api/converter/package-summary.html index 00c2bb77a8..c72e1d358b 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/converter/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/converter/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api.converter + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api.converter diff --git a/xref/com/linecorp/centraldogma/server/internal/api/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/api/package-frame.html index 78f7343445..ebe77f2249 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api diff --git a/xref/com/linecorp/centraldogma/server/internal/api/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/api/package-summary.html index 9a7d3b3998..e16e831642 100644 --- a/xref/com/linecorp/centraldogma/server/internal/api/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/api/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.api + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.api diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/MirroringMigrationService.html b/xref/com/linecorp/centraldogma/server/internal/mirror/MirroringMigrationService.html index f6035b8295..e1a319a224 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/MirroringMigrationService.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/MirroringMigrationService.html @@ -140,23 +140,23 @@ 132 } 133 } 134 logMigrationJob(numMigratedProjects); -135 } catch (Exception ex) { -136 final MirrorMigrationException mirrorException = new MirrorMigrationException( -137 "Failed to migrate mirrors and credentials. Rollback to the legacy configurations", ex); -138 try { -139 rollbackMigration(); -140 } catch (Exception ex0) { -141 ex0.addSuppressed(mirrorException); -142 throw new MirrorMigrationException("Failed to rollback the mirror migration:", ex0); -143 } -144 throw mirrorException; -145 } -146 -147 // Exit read-only mode. -148 commandExecutor.execute(Command.updateServerStatus(ServerStatus.WRITABLE)) -149 .get(1, TimeUnit.MINUTES); -150 logger.info("Mirrors and credentials migration has been completed. (took: {} ms.)", -151 stopwatch.elapsed().toMillis()); +135 logger.info("Mirrors and credentials migration has been completed. (took: {} ms.)", +136 stopwatch.elapsed().toMillis()); +137 } catch (Exception ex) { +138 final MirrorMigrationException mirrorException = new MirrorMigrationException( +139 "Failed to migrate mirrors and credentials. Rollback to the legacy configurations", ex); +140 try { +141 rollbackMigration(); +142 } catch (Exception ex0) { +143 ex0.addSuppressed(mirrorException); +144 throw new MirrorMigrationException("Failed to rollback the mirror migration:", ex0); +145 } +146 throw mirrorException; +147 } finally { +148 // Exit read-only mode. +149 commandExecutor.execute(Command.updateServerStatus(ServerStatus.WRITABLE)) +150 .get(1, TimeUnit.MINUTES); +151 } 152 153 shortWords = null; 154 } @@ -216,9 +216,9 @@ 208 try { 209 migrateMirror(repository, (ObjectNode) mirror, mirrorIds, credentials); 210 } catch (Exception e) { -211 logger.warn("Failed to migrate a mirror config: {} (project: {})", mirror, -212 repository.parent().name(), e); -213 throw e; +211 // Log the error and continue to migrate the next mirror. +212 logger.warn("Failed to migrate a mirror config: {} (project: {})", mirror, +213 repository.parent().name(), e); 214 } 215 } 216 // Back up the old mirrors.json file and don't use it anymore. @@ -273,204 +273,208 @@ 265 // Delete all files in the target directory 266 final Map<String, Entry<?>> entries = repository.find(Revision.HEAD, targetDirectory + "**") 267 .get(); -268 final List<Change<?>> changes = entries.keySet().stream().map(Change::ofRemoval) -269 .collect(toImmutableList()); -270 final Command<CommitResult> command = -271 Command.push(Author.SYSTEM, repository.parent().name(), -272 repository.name(), Revision.HEAD, -273 "Rollback the migration of " + targetDirectory, "", -274 Markup.PLAINTEXT, changes); -275 try { -276 executeCommand(command); -277 } catch (InterruptedException | ExecutionException | TimeoutException e) { -278 throw new MirrorMigrationException("Failed to rollback the migration of " + targetDirectory, e); -279 } -280 // Revert the backup file to the original file if exists. -281 final Entry<?> backup = repository.getOrNull(Revision.HEAD, backupFile).get(); -282 if (backup != null) { -283 rename(repository, backupFile, originalFile, true); -284 } -285 } -286 -287 private CommitResult executeCommand(Command<CommitResult> command) -288 throws InterruptedException, ExecutionException, TimeoutException { -289 return commandExecutor.execute(Command.forcePush(command)).get(1, TimeUnit.MINUTES); -290 } -291 -292 private static void fillCredentialId(MetaRepository repository, ObjectNode mirror, -293 List<MirrorCredential> credentials) { -294 final JsonNode credentialId = mirror.get("credentialId"); -295 if (credentialId != null) { -296 return; -297 } -298 final JsonNode remoteUri = mirror.get("remoteUri"); -299 if (remoteUri == null) { -300 // An invalid mirror config. -301 return; -302 } -303 -304 final String remoteUriText = remoteUri.asText(); -305 final MirrorCredential credential = MirrorConfig.findCredential(credentials, URI.create(remoteUriText), -306 null); -307 if (credential == MirrorCredential.FALLBACK) { -308 logger.warn("Failed to find a credential for the mirror: {}, project: {}. " + -309 "Using the fallback credential.", mirror, repository.parent().name()); -310 } -311 mirror.put("credentialId", credential.id()); -312 } -313 -314 /** -315 * Migrate the legacy {@code credentials.json} file into the {@code /credentials/<id>.json} directory. -316 * While migrating, the {@code id} field of each credential is filled with a random value if absent. -317 */ -318 private boolean migrateCredentials(MetaRepository repository) throws Exception { -319 final ArrayNode credentials = getLegacyMetaData(repository, PATH_LEGACY_CREDENTIALS); -320 if (credentials == null) { -321 return false; -322 } -323 -324 final Set<String> credentialIds = new HashSet<>(); -325 int index = 0; -326 for (JsonNode credential : credentials) { -327 if (!credential.isObject()) { -328 logger.warn("A credential config at {} must be an object: {} (project: {})", index, -329 credential.getNodeType(), -330 repository.parent().name()); -331 } else { -332 try { -333 migrateCredential(repository, (ObjectNode) credential, credentialIds); -334 } catch (Exception e) { -335 logger.warn("Failed to migrate the credential config in project {}", -336 repository.parent().name(), e); -337 throw e; -338 } -339 } -340 index++; -341 } -342 -343 // Back up the old credentials.json file and don't use it anymore. -344 rename(repository, PATH_LEGACY_CREDENTIALS, PATH_LEGACY_CREDENTIALS_BACKUP, false); -345 return true; -346 } -347 -348 private void migrateCredential(MetaRepository repository, ObjectNode credential, Set<String> credentialIds) -349 throws Exception { -350 String id; -351 final JsonNode idNode = credential.get("id"); -352 final String projectName = repository.parent().name(); -353 if (idNode == null) { -354 final JsonNode typeNode = credential.get("type"); -355 final String type = typeNode.isTextual() ? typeNode.asText() : ""; -356 // Fill the 'id' field with a random value if not exists. -357 id = generateIdForCredential(projectName, type); -358 } else { -359 id = idNode.asText(); -360 } -361 id = uniquify(id, credentialIds); -362 credential.put("id", id); -363 credentialIds.add(id); -364 -365 final String jsonFile = credentialFile(id); -366 final Command<CommitResult> command = -367 Command.push(Author.SYSTEM, projectName, repository.name(), Revision.HEAD, -368 "Migrate the credential '" + id + "' in '" + PATH_LEGACY_CREDENTIALS + -369 "' into '" + jsonFile + "'.", "", Markup.PLAINTEXT, -370 Change.ofJsonUpsert(jsonFile, credential)); -371 executeCommand(command); -372 } -373 -374 @Nullable -375 private static ArrayNode getLegacyMetaData(MetaRepository repository, String path) -376 throws InterruptedException, ExecutionException { -377 final Map<String, Entry<?>> entries = repository.find(Revision.HEAD, path, ImmutableMap.of()) -378 .get(); -379 final Entry<?> entry = entries.get(path); -380 if (entry == null) { -381 return null; -382 } -383 -384 final JsonNode content = (JsonNode) entry.content(); -385 if (!content.isArray()) { -386 throw new RepositoryMetadataException( -387 path + " must be an array: " + content.getNodeType()); -388 } -389 return (ArrayNode) content; -390 } -391 -392 private CommitResult rename(MetaRepository repository, String oldPath, String newPath, boolean rollback) -393 throws Exception { -394 final String summary; -395 if (rollback) { -396 summary = "Rollback the migration of " + newPath; -397 } else { -398 summary = "Back up the legacy " + oldPath + " into " + newPath; -399 } -400 final Command<CommitResult> command = Command.push(Author.SYSTEM, repository.parent().name(), -401 repository.name(), Revision.HEAD, -402 summary, -403 "", -404 Markup.PLAINTEXT, -405 Change.ofRename(oldPath, newPath)); -406 return executeCommand(command); -407 } -408 -409 /** -410 * Generates a reproducible ID for the given mirror. -411 * Pattern: {@code mirror-<projectName>-<localRepo>}. -412 */ -413 private static String generateIdForMirror(String projectName, ObjectNode mirror) { -414 return "mirror-" + projectName + '-' + mirror.get("localRepo").asText(); -415 } -416 -417 private String getShortWord(String id) { -418 if (shortWords == null) { -419 shortWords = buildShortWords(); -420 } -421 final int index = Math.abs(id.hashCode()) % shortWords.size(); -422 return shortWords.get(index); -423 } -424 -425 /** -426 * Generates a reproducible ID for the given credential. -427 * Pattern: {@code credential-<projectName>-<type>}. -428 */ -429 private static String generateIdForCredential(String projectName, String type) { -430 String id = "credential-" + projectName; -431 if (!type.isEmpty()) { -432 id += '-' + type; -433 } -434 return id; -435 } -436 -437 private String uniquify(String id, Set<String> existingIds) { -438 String maybeUnique = id; -439 while (existingIds.contains(maybeUnique)) { -440 maybeUnique = id + '-' + getShortWord(maybeUnique); -441 } -442 return maybeUnique; -443 } -444 -445 @VisibleForTesting -446 static List<String> buildShortWords() { -447 // TODO(ikhoon) Remove 'short_wordlist.txt' if Central Dogma version has been updated enough and -448 // we can assume that all users have already migrated. -449 final InputStream is = MirroringMigrationService.class.getResourceAsStream("short_wordlist.txt"); -450 try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { -451 return reader.lines().collect(toImmutableList()); -452 } catch (IOException e) { -453 throw new UncheckedIOException(e); -454 } -455 } -456 -457 private static class MirrorMigrationException extends RuntimeException { -458 -459 private static final long serialVersionUID = -3924318204193024460L; +268 if (!entries.isEmpty()) { +269 final List<Change<?>> changes = entries.keySet().stream().map(Change::ofRemoval) +270 .collect(toImmutableList()); +271 +272 final Command<CommitResult> command = +273 Command.push(Author.SYSTEM, repository.parent().name(), +274 repository.name(), Revision.HEAD, +275 "Rollback the migration of " + targetDirectory, "", +276 Markup.PLAINTEXT, changes); +277 try { +278 executeCommand(command); +279 } catch (InterruptedException | ExecutionException | TimeoutException e) { +280 throw new MirrorMigrationException("Failed to rollback the migration of " + targetDirectory, e); +281 } +282 } +283 +284 // Revert the backup file to the original file if exists. +285 final Entry<?> backup = repository.getOrNull(Revision.HEAD, backupFile).get(); +286 if (backup != null) { +287 rename(repository, backupFile, originalFile, true); +288 } +289 } +290 +291 private CommitResult executeCommand(Command<CommitResult> command) +292 throws InterruptedException, ExecutionException, TimeoutException { +293 return commandExecutor.execute(Command.forcePush(command)).get(1, TimeUnit.MINUTES); +294 } +295 +296 private static void fillCredentialId(MetaRepository repository, ObjectNode mirror, +297 List<MirrorCredential> credentials) { +298 final JsonNode credentialId = mirror.get("credentialId"); +299 if (credentialId != null) { +300 return; +301 } +302 final JsonNode remoteUri = mirror.get("remoteUri"); +303 if (remoteUri == null) { +304 // An invalid mirror config. +305 return; +306 } +307 +308 final String remoteUriText = remoteUri.asText(); +309 final MirrorCredential credential = MirrorConfig.findCredential(credentials, URI.create(remoteUriText), +310 null); +311 if (credential == MirrorCredential.FALLBACK) { +312 logger.warn("Failed to find a credential for the mirror: {}, project: {}. " + +313 "Using the fallback credential.", mirror, repository.parent().name()); +314 } +315 mirror.put("credentialId", credential.id()); +316 } +317 +318 /** +319 * Migrate the legacy {@code credentials.json} file into the {@code /credentials/<id>.json} directory. +320 * While migrating, the {@code id} field of each credential is filled with a random value if absent. +321 */ +322 private boolean migrateCredentials(MetaRepository repository) throws Exception { +323 final ArrayNode credentials = getLegacyMetaData(repository, PATH_LEGACY_CREDENTIALS); +324 if (credentials == null) { +325 return false; +326 } +327 +328 final Set<String> credentialIds = new HashSet<>(); +329 int index = 0; +330 for (JsonNode credential : credentials) { +331 if (!credential.isObject()) { +332 logger.warn("A credential config at {} must be an object: {} (project: {})", index, +333 credential.getNodeType(), +334 repository.parent().name()); +335 } else { +336 try { +337 migrateCredential(repository, (ObjectNode) credential, credentialIds); +338 } catch (Exception e) { +339 // Log the error and continue to migrate the next credential. +340 logger.warn("Failed to migrate the credential config in project {}", +341 repository.parent().name(), e); +342 } +343 } +344 index++; +345 } +346 +347 // Back up the old credentials.json file and don't use it anymore. +348 rename(repository, PATH_LEGACY_CREDENTIALS, PATH_LEGACY_CREDENTIALS_BACKUP, false); +349 return true; +350 } +351 +352 private void migrateCredential(MetaRepository repository, ObjectNode credential, Set<String> credentialIds) +353 throws Exception { +354 String id; +355 final JsonNode idNode = credential.get("id"); +356 final String projectName = repository.parent().name(); +357 if (idNode == null) { +358 final JsonNode typeNode = credential.get("type"); +359 final String type = typeNode.isTextual() ? typeNode.asText() : ""; +360 // Fill the 'id' field with a random value if not exists. +361 id = generateIdForCredential(projectName, type); +362 } else { +363 id = idNode.asText(); +364 } +365 id = uniquify(id, credentialIds); +366 credential.put("id", id); +367 credentialIds.add(id); +368 +369 final String jsonFile = credentialFile(id); +370 final Command<CommitResult> command = +371 Command.push(Author.SYSTEM, projectName, repository.name(), Revision.HEAD, +372 "Migrate the credential '" + id + "' in '" + PATH_LEGACY_CREDENTIALS + +373 "' into '" + jsonFile + "'.", "", Markup.PLAINTEXT, +374 Change.ofJsonUpsert(jsonFile, credential)); +375 executeCommand(command); +376 } +377 +378 @Nullable +379 private static ArrayNode getLegacyMetaData(MetaRepository repository, String path) +380 throws InterruptedException, ExecutionException { +381 final Map<String, Entry<?>> entries = repository.find(Revision.HEAD, path, ImmutableMap.of()) +382 .get(); +383 final Entry<?> entry = entries.get(path); +384 if (entry == null) { +385 return null; +386 } +387 +388 final JsonNode content = (JsonNode) entry.content(); +389 if (!content.isArray()) { +390 throw new RepositoryMetadataException( +391 path + " must be an array: " + content.getNodeType()); +392 } +393 return (ArrayNode) content; +394 } +395 +396 private CommitResult rename(MetaRepository repository, String oldPath, String newPath, boolean rollback) +397 throws Exception { +398 final String summary; +399 if (rollback) { +400 summary = "Rollback the migration of " + newPath; +401 } else { +402 summary = "Back up the legacy " + oldPath + " into " + newPath; +403 } +404 final Command<CommitResult> command = Command.push(Author.SYSTEM, repository.parent().name(), +405 repository.name(), Revision.HEAD, +406 summary, +407 "", +408 Markup.PLAINTEXT, +409 Change.ofRename(oldPath, newPath)); +410 return executeCommand(command); +411 } +412 +413 /** +414 * Generates a reproducible ID for the given mirror. +415 * Pattern: {@code mirror-<projectName>-<localRepo>}. +416 */ +417 private static String generateIdForMirror(String projectName, ObjectNode mirror) { +418 return "mirror-" + projectName + '-' + mirror.get("localRepo").asText(); +419 } +420 +421 private String getShortWord(String id) { +422 if (shortWords == null) { +423 shortWords = buildShortWords(); +424 } +425 final int index = Math.abs(id.hashCode()) % shortWords.size(); +426 return shortWords.get(index); +427 } +428 +429 /** +430 * Generates a reproducible ID for the given credential. +431 * Pattern: {@code credential-<projectName>-<type>}. +432 */ +433 private static String generateIdForCredential(String projectName, String type) { +434 String id = "credential-" + projectName; +435 if (!type.isEmpty()) { +436 id += '-' + type; +437 } +438 return id; +439 } +440 +441 private String uniquify(String id, Set<String> existingIds) { +442 String maybeUnique = id; +443 while (existingIds.contains(maybeUnique)) { +444 maybeUnique = id + '-' + getShortWord(maybeUnique); +445 } +446 return maybeUnique; +447 } +448 +449 @VisibleForTesting +450 static List<String> buildShortWords() { +451 // TODO(ikhoon) Remove 'short_wordlist.txt' if Central Dogma version has been updated enough and +452 // we can assume that all users have already migrated. +453 final InputStream is = MirroringMigrationService.class.getResourceAsStream("short_wordlist.txt"); +454 try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { +455 return reader.lines().collect(toImmutableList()); +456 } catch (IOException e) { +457 throw new UncheckedIOException(e); +458 } +459 } 460 -461 MirrorMigrationException(String message, Throwable cause) { -462 super(message, cause); -463 } -464 } -465 } +461 private static class MirrorMigrationException extends RuntimeException { +462 +463 private static final long serialVersionUID = -3924318204193024460L; +464 +465 MirrorMigrationException(String message, Throwable cause) { +466 super(message, cause); +467 } +468 } +469 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/AccessTokenMirrorCredential.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/AccessTokenMirrorCredential.html index 90db129866..b8c1ad6b34 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/AccessTokenMirrorCredential.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/AccessTokenMirrorCredential.html @@ -39,76 +39,69 @@ 31 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 32 import com.google.common.base.MoreObjects.ToStringHelper; 33 -34 import com.linecorp.centraldogma.server.mirror.MirrorCredential; +34 public final class AccessTokenMirrorCredential extends AbstractMirrorCredential { 35 -36 public final class AccessTokenMirrorCredential extends AbstractMirrorCredential { +36 private static final Logger logger = LoggerFactory.getLogger(AccessTokenMirrorCredential.class); 37 -38 private static final Logger logger = LoggerFactory.getLogger(AccessTokenMirrorCredential.class); +38 private final String accessToken; 39 -40 private final String accessToken; -41 -42 @JsonCreator -43 public AccessTokenMirrorCredential(@JsonProperty("id") String id, -44 @JsonProperty("enabled") @Nullable Boolean enabled, -45 @JsonProperty("hostnamePatterns") @Nullable -46 @JsonDeserialize(contentAs = Pattern.class) -47 Iterable<Pattern> hostnamePatterns, -48 @JsonProperty("accessToken") String accessToken) { -49 super(id, enabled, "access_token", hostnamePatterns); -50 -51 this.accessToken = requireNonEmpty(accessToken, "accessToken"); -52 } -53 -54 public String accessToken() { -55 try { -56 return convertValue(accessToken, "credentials.accessToken"); -57 } catch (Throwable t) { -58 // The accessToken probably has `:` without prefix. Just return it as is for backward compatibility. -59 logger.debug("Failed to convert the access token of the credential: {}", id(), t); -60 return accessToken; -61 } -62 } -63 -64 @JsonProperty("accessToken") -65 public String rawAccessToken() { -66 return accessToken; -67 } -68 -69 @Override -70 public int hashCode() { -71 int result = super.hashCode(); -72 result = 31 * result + accessToken.hashCode(); -73 return result; -74 } -75 -76 @Override -77 public boolean equals(Object o) { -78 if (this == o) { -79 return true; -80 } -81 -82 if (!(o instanceof AccessTokenMirrorCredential)) { -83 return false; -84 } -85 -86 if (!super.equals(o)) { -87 return false; -88 } -89 -90 final AccessTokenMirrorCredential that = (AccessTokenMirrorCredential) o; -91 return accessToken.equals(that.accessToken); -92 } -93 -94 @Override -95 void addProperties(ToStringHelper helper) { -96 // Access token must be kept secret. -97 } -98 -99 @Override -100 public MirrorCredential withoutSecret() { -101 return new AccessTokenMirrorCredential(id(), enabled(), hostnamePatterns(), "****"); -102 } -103 } +40 @JsonCreator +41 public AccessTokenMirrorCredential(@JsonProperty("id") String id, +42 @JsonProperty("enabled") @Nullable Boolean enabled, +43 @JsonProperty("hostnamePatterns") @Nullable +44 @JsonDeserialize(contentAs = Pattern.class) +45 Iterable<Pattern> hostnamePatterns, +46 @JsonProperty("accessToken") String accessToken) { +47 super(id, enabled, "access_token", hostnamePatterns); +48 +49 this.accessToken = requireNonEmpty(accessToken, "accessToken"); +50 } +51 +52 public String accessToken() { +53 try { +54 return convertValue(accessToken, "credentials.accessToken"); +55 } catch (Throwable t) { +56 // The accessToken probably has `:` without prefix. Just return it as is for backward compatibility. +57 logger.debug("Failed to convert the access token of the credential: {}", id(), t); +58 return accessToken; +59 } +60 } +61 +62 @JsonProperty("accessToken") +63 public String rawAccessToken() { +64 return accessToken; +65 } +66 +67 @Override +68 public int hashCode() { +69 int result = super.hashCode(); +70 result = 31 * result + accessToken.hashCode(); +71 return result; +72 } +73 +74 @Override +75 public boolean equals(Object o) { +76 if (this == o) { +77 return true; +78 } +79 +80 if (!(o instanceof AccessTokenMirrorCredential)) { +81 return false; +82 } +83 +84 if (!super.equals(o)) { +85 return false; +86 } +87 +88 final AccessTokenMirrorCredential that = (AccessTokenMirrorCredential) o; +89 return accessToken.equals(that.accessToken); +90 } +91 +92 @Override +93 void addProperties(ToStringHelper helper) { +94 // Access token must be kept secret. +95 } +96 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/NoneMirrorCredential.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/NoneMirrorCredential.html index a8113a4cf7..452b8b8d4f 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/NoneMirrorCredential.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/NoneMirrorCredential.html @@ -33,29 +33,22 @@ 25 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 26 import com.google.common.base.MoreObjects.ToStringHelper; 27 -28 import com.linecorp.centraldogma.server.mirror.MirrorCredential; +28 public final class NoneMirrorCredential extends AbstractMirrorCredential { 29 -30 public final class NoneMirrorCredential extends AbstractMirrorCredential { -31 -32 @JsonCreator -33 public NoneMirrorCredential(@JsonProperty("id") String id, -34 @JsonProperty("enabled") @Nullable Boolean enabled, -35 @JsonProperty("hostnamePatterns") @Nullable -36 @JsonDeserialize(contentAs = Pattern.class) -37 Iterable<Pattern> hostnamePatterns) { -38 super(id, enabled, "none", hostnamePatterns); -39 } -40 -41 @Override -42 void addProperties(ToStringHelper helper) { -43 // No properties to add -44 } -45 -46 @Override -47 public MirrorCredential withoutSecret() { -48 return this; -49 } -50 } +30 @JsonCreator +31 public NoneMirrorCredential(@JsonProperty("id") String id, +32 @JsonProperty("enabled") @Nullable Boolean enabled, +33 @JsonProperty("hostnamePatterns") @Nullable +34 @JsonDeserialize(contentAs = Pattern.class) +35 Iterable<Pattern> hostnamePatterns) { +36 super(id, enabled, "none", hostnamePatterns); +37 } +38 +39 @Override +40 void addProperties(ToStringHelper helper) { +41 // No properties to add +42 } +43 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PasswordMirrorCredential.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PasswordMirrorCredential.html index 8427034da4..d04b4c114e 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PasswordMirrorCredential.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PasswordMirrorCredential.html @@ -40,86 +40,79 @@ 32 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 33 import com.google.common.base.MoreObjects.ToStringHelper; 34 -35 import com.linecorp.centraldogma.server.mirror.MirrorCredential; +35 public final class PasswordMirrorCredential extends AbstractMirrorCredential { 36 -37 public final class PasswordMirrorCredential extends AbstractMirrorCredential { +37 private static final Logger logger = LoggerFactory.getLogger(PasswordMirrorCredential.class); 38 -39 private static final Logger logger = LoggerFactory.getLogger(PasswordMirrorCredential.class); -40 -41 private final String username; -42 private final String password; -43 -44 @JsonCreator -45 public PasswordMirrorCredential(@JsonProperty("id") String id, -46 @JsonProperty("enabled") @Nullable Boolean enabled, -47 @JsonProperty("hostnamePatterns") @Nullable -48 @JsonDeserialize(contentAs = Pattern.class) -49 Iterable<Pattern> hostnamePatterns, -50 @JsonProperty("username") String username, -51 @JsonProperty("password") String password) { -52 super(id, enabled, "password", hostnamePatterns); -53 -54 this.username = requireNonEmpty(username, "username"); -55 this.password = requireNonNull(password, "password"); -56 } -57 -58 @JsonProperty("username") -59 public String username() { -60 return username; -61 } -62 -63 public String password() { -64 try { -65 return convertValue(password, "credentials.password"); -66 } catch (Throwable t) { -67 // The password probably has `:` without prefix. Just return it as is for backward compatibility. -68 logger.debug("Failed to convert the password of the credential. username: {}, id: {}", -69 username, id(), t); -70 return password; -71 } -72 } -73 -74 @JsonProperty("password") -75 public String rawPassword() { -76 return password; -77 } -78 -79 @Override -80 public int hashCode() { -81 int result = super.hashCode(); -82 result = 31 * result + username.hashCode(); -83 result = 31 * result + password.hashCode(); -84 return result; -85 } -86 -87 @Override -88 public boolean equals(Object o) { -89 if (this == o) { -90 return true; -91 } -92 -93 if (!(o instanceof PasswordMirrorCredential)) { -94 return false; -95 } -96 -97 if (!super.equals(o)) { -98 return false; -99 } -100 -101 final PasswordMirrorCredential that = (PasswordMirrorCredential) o; -102 return username.equals(that.username) && password.equals(that.password); -103 } -104 -105 @Override -106 void addProperties(ToStringHelper helper) { -107 helper.add("username", username); -108 } -109 -110 @Override -111 public MirrorCredential withoutSecret() { -112 return new PasswordMirrorCredential(id(), enabled(), hostnamePatterns(), username(), "****"); -113 } -114 } +39 private final String username; +40 private final String password; +41 +42 @JsonCreator +43 public PasswordMirrorCredential(@JsonProperty("id") String id, +44 @JsonProperty("enabled") @Nullable Boolean enabled, +45 @JsonProperty("hostnamePatterns") @Nullable +46 @JsonDeserialize(contentAs = Pattern.class) +47 Iterable<Pattern> hostnamePatterns, +48 @JsonProperty("username") String username, +49 @JsonProperty("password") String password) { +50 super(id, enabled, "password", hostnamePatterns); +51 +52 this.username = requireNonEmpty(username, "username"); +53 this.password = requireNonNull(password, "password"); +54 } +55 +56 @JsonProperty("username") +57 public String username() { +58 return username; +59 } +60 +61 public String password() { +62 try { +63 return convertValue(password, "credentials.password"); +64 } catch (Throwable t) { +65 // The password probably has `:` without prefix. Just return it as is for backward compatibility. +66 logger.debug("Failed to convert the password of the credential. username: {}, id: {}", +67 username, id(), t); +68 return password; +69 } +70 } +71 +72 @JsonProperty("password") +73 public String rawPassword() { +74 return password; +75 } +76 +77 @Override +78 public int hashCode() { +79 int result = super.hashCode(); +80 result = 31 * result + username.hashCode(); +81 result = 31 * result + password.hashCode(); +82 return result; +83 } +84 +85 @Override +86 public boolean equals(Object o) { +87 if (this == o) { +88 return true; +89 } +90 +91 if (!(o instanceof PasswordMirrorCredential)) { +92 return false; +93 } +94 +95 if (!super.equals(o)) { +96 return false; +97 } +98 +99 final PasswordMirrorCredential that = (PasswordMirrorCredential) o; +100 return username.equals(that.username) && password.equals(that.password); +101 } +102 +103 @Override +104 void addProperties(ToStringHelper helper) { +105 helper.add("username", username); +106 } +107 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PublicKeyMirrorCredential.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PublicKeyMirrorCredential.html index 81b6473f0d..07474c63a3 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PublicKeyMirrorCredential.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/PublicKeyMirrorCredential.html @@ -44,138 +44,130 @@ 36 import com.google.common.base.Splitter; 37 import com.google.common.collect.ImmutableList; 38 -39 import com.linecorp.centraldogma.server.mirror.MirrorCredential; +39 public final class PublicKeyMirrorCredential extends AbstractMirrorCredential { 40 -41 public final class PublicKeyMirrorCredential extends AbstractMirrorCredential { +41 private static final Logger logger = LoggerFactory.getLogger(PublicKeyMirrorCredential.class); 42 -43 private static final Logger logger = LoggerFactory.getLogger(PublicKeyMirrorCredential.class); -44 -45 private static final Splitter NEWLINE_SPLITTER = Splitter.on(CharMatcher.anyOf("\n\r")) -46 .omitEmptyStrings() -47 .trimResults(); +43 private static final Splitter NEWLINE_SPLITTER = Splitter.on(CharMatcher.anyOf("\n\r")) +44 .omitEmptyStrings() +45 .trimResults(); +46 +47 private static final int PUBLIC_KEY_PREVIEW_LEN = 40; 48 -49 private static final int PUBLIC_KEY_PREVIEW_LEN = 40; -50 -51 private final String username; -52 private final String publicKey; -53 private final String privateKey; -54 @Nullable -55 private final String passphrase; -56 -57 @JsonCreator -58 public PublicKeyMirrorCredential(@JsonProperty("id") String id, -59 @JsonProperty("enabled") @Nullable Boolean enabled, -60 @JsonProperty("hostnamePatterns") @Nullable -61 @JsonDeserialize(contentAs = Pattern.class) -62 Iterable<Pattern> hostnamePatterns, -63 @JsonProperty("username") String username, -64 @JsonProperty("publicKey") String publicKey, -65 @JsonProperty("privateKey") String privateKey, -66 @JsonProperty("passphrase") @Nullable String passphrase) { +49 private final String username; +50 private final String publicKey; +51 private final String privateKey; +52 @Nullable +53 private final String passphrase; +54 +55 @JsonCreator +56 public PublicKeyMirrorCredential(@JsonProperty("id") String id, +57 @JsonProperty("enabled") @Nullable Boolean enabled, +58 @JsonProperty("hostnamePatterns") @Nullable +59 @JsonDeserialize(contentAs = Pattern.class) +60 Iterable<Pattern> hostnamePatterns, +61 @JsonProperty("username") String username, +62 @JsonProperty("publicKey") String publicKey, +63 @JsonProperty("privateKey") String privateKey, +64 @JsonProperty("passphrase") @Nullable String passphrase) { +65 +66 super(id, enabled, "public_key", hostnamePatterns); 67 -68 super(id, enabled, "public_key", hostnamePatterns); -69 -70 this.username = requireNonEmpty(username, "username"); -71 this.publicKey = requireNonEmpty(publicKey, "publicKey"); -72 this.privateKey = requireNonEmpty(privateKey, "privateKey"); -73 this.passphrase = passphrase; -74 } -75 -76 @JsonProperty("username") -77 public String username() { -78 return username; -79 } -80 -81 @JsonProperty("publicKey") -82 public String publicKey() { -83 return publicKey; -84 } -85 -86 public List<String> privateKey() { -87 String converted; -88 try { -89 converted = convertValue(privateKey, "credentials.privateKey"); -90 } catch (Throwable t) { -91 // Just use it as is for backward compatibility. -92 logger.debug("Failed to convert the key of the credential. username: {}, id: {}", -93 username, id(), t); -94 converted = privateKey; -95 } -96 assert converted != null; -97 // privateKey is converted into a list of Strings that will be used as an input of -98 // KeyPairResourceLoader.loadKeyPairs(...) -99 return ImmutableList.copyOf(NEWLINE_SPLITTER.splitToList(converted)); -100 } -101 -102 @JsonProperty("privateKey") -103 public String rawPrivateKey() { -104 return privateKey; -105 } -106 -107 @Nullable -108 public String passphrase() { -109 try { -110 return convertValue(passphrase, "credentials.passphrase"); -111 } catch (Throwable t) { -112 // The passphrase probably has `:` without prefix. Just return it as is for backward compatibility. -113 logger.debug("Failed to convert the passphrase of the credential. username: {}, id: {}", -114 username, id(), t); -115 return passphrase; -116 } -117 } -118 -119 @JsonProperty("passphrase") -120 @Nullable -121 public String rawPassphrase() { -122 return passphrase; -123 } -124 -125 @Override -126 public boolean equals(Object o) { -127 if (this == o) { -128 return true; -129 } -130 -131 if (!(o instanceof PublicKeyMirrorCredential)) { -132 return false; -133 } -134 -135 if (!super.equals(o)) { -136 return false; -137 } +68 this.username = requireNonEmpty(username, "username"); +69 this.publicKey = requireNonEmpty(publicKey, "publicKey"); +70 this.privateKey = requireNonEmpty(privateKey, "privateKey"); +71 this.passphrase = passphrase; +72 } +73 +74 @JsonProperty("username") +75 public String username() { +76 return username; +77 } +78 +79 @JsonProperty("publicKey") +80 public String publicKey() { +81 return publicKey; +82 } +83 +84 public List<String> privateKey() { +85 String converted; +86 try { +87 converted = convertValue(privateKey, "credentials.privateKey"); +88 } catch (Throwable t) { +89 // Just use it as is for backward compatibility. +90 logger.debug("Failed to convert the key of the credential. username: {}, id: {}", +91 username, id(), t); +92 converted = privateKey; +93 } +94 assert converted != null; +95 // privateKey is converted into a list of Strings that will be used as an input of +96 // KeyPairResourceLoader.loadKeyPairs(...) +97 return ImmutableList.copyOf(NEWLINE_SPLITTER.splitToList(converted)); +98 } +99 +100 @JsonProperty("privateKey") +101 public String rawPrivateKey() { +102 return privateKey; +103 } +104 +105 @Nullable +106 public String passphrase() { +107 try { +108 return convertValue(passphrase, "credentials.passphrase"); +109 } catch (Throwable t) { +110 // The passphrase probably has `:` without prefix. Just return it as is for backward compatibility. +111 logger.debug("Failed to convert the passphrase of the credential. username: {}, id: {}", +112 username, id(), t); +113 return passphrase; +114 } +115 } +116 +117 @JsonProperty("passphrase") +118 @Nullable +119 public String rawPassphrase() { +120 return passphrase; +121 } +122 +123 @Override +124 public boolean equals(Object o) { +125 if (this == o) { +126 return true; +127 } +128 +129 if (!(o instanceof PublicKeyMirrorCredential)) { +130 return false; +131 } +132 +133 if (!super.equals(o)) { +134 return false; +135 } +136 +137 final PublicKeyMirrorCredential that = (PublicKeyMirrorCredential) o; 138 -139 final PublicKeyMirrorCredential that = (PublicKeyMirrorCredential) o; -140 -141 return username.equals(that.username) && -142 Objects.equals(publicKey, that.publicKey) && -143 Objects.equals(privateKey, that.privateKey) && -144 Objects.equals(passphrase, that.passphrase); -145 } -146 -147 @Override -148 public int hashCode() { -149 return Objects.hash(super.hashCode(), username, publicKey, privateKey, passphrase); -150 } -151 -152 @Override -153 void addProperties(ToStringHelper helper) { -154 helper.add("username", username) -155 .add("publicKey", publicKeyPreview(publicKey)); -156 } -157 -158 public static String publicKeyPreview(String publicKey) { -159 if (publicKey.length() > PUBLIC_KEY_PREVIEW_LEN) { -160 return publicKey.substring(0, PUBLIC_KEY_PREVIEW_LEN) + ".."; -161 } -162 return publicKey; -163 } -164 -165 @Override -166 public MirrorCredential withoutSecret() { -167 return new PublicKeyMirrorCredential(id(), enabled(), hostnamePatterns(), username(), publicKey(), -168 "****", "****"); -169 } -170 } +139 return username.equals(that.username) && +140 Objects.equals(publicKey, that.publicKey) && +141 Objects.equals(privateKey, that.privateKey) && +142 Objects.equals(passphrase, that.passphrase); +143 } +144 +145 @Override +146 public int hashCode() { +147 return Objects.hash(super.hashCode(), username, publicKey, privateKey, passphrase); +148 } +149 +150 @Override +151 void addProperties(ToStringHelper helper) { +152 helper.add("username", username) +153 .add("publicKey", publicKeyPreview(publicKey)); +154 } +155 +156 public static String publicKeyPreview(String publicKey) { +157 if (publicKey.length() > PUBLIC_KEY_PREVIEW_LEN) { +158 return publicKey.substring(0, PUBLIC_KEY_PREVIEW_LEN) + ".."; +159 } +160 return publicKey; +161 } +162 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-frame.html index 5e8ecee484..d46fad2574 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.mirror.credential + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.mirror.credential diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-summary.html index 04f379456a..d5eb9e8dd6 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/credential/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.mirror.credential + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.mirror.credential diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/mirror/package-frame.html index fe251c2167..fc33aed353 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.mirror + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.mirror diff --git a/xref/com/linecorp/centraldogma/server/internal/mirror/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/mirror/package-summary.html index 7072839327..7acdaef732 100644 --- a/xref/com/linecorp/centraldogma/server/internal/mirror/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/mirror/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.mirror + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.mirror diff --git a/xref/com/linecorp/centraldogma/server/internal/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/package-frame.html index 155387f3ee..c8b1424baa 100644 --- a/xref/com/linecorp/centraldogma/server/internal/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal diff --git a/xref/com/linecorp/centraldogma/server/internal/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/package-summary.html index d7b66be7ea..d6ea270ee0 100644 --- a/xref/com/linecorp/centraldogma/server/internal/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal diff --git a/xref/com/linecorp/centraldogma/server/internal/replication/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/replication/package-frame.html index f8871c7be9..61fb544c6a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/replication/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/replication/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.replication + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.replication diff --git a/xref/com/linecorp/centraldogma/server/internal/replication/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/replication/package-summary.html index 1069e5be9f..0ddb840e0a 100644 --- a/xref/com/linecorp/centraldogma/server/internal/replication/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/replication/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.replication + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.replication diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/storage/package-frame.html index edc6e13cb4..a638d4ed77 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/storage/package-summary.html index 504089acd8..361621ed09 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/project/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/storage/project/package-frame.html index 0469c84d24..975db4cca8 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/project/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/project/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.project + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.project diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/project/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/storage/project/package-summary.html index 8df928182a..b77401b902 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/project/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/project/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.project + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.project diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/RepositoryWrapper.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/RepositoryWrapper.html index 0d8f10f76c..9f82cd1bb8 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/RepositoryWrapper.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/RepositoryWrapper.html @@ -43,182 +43,180 @@ 35 import com.linecorp.centraldogma.internal.Util; 36 import com.linecorp.centraldogma.server.command.CommitResult; 37 import com.linecorp.centraldogma.server.storage.project.Project; -38 import com.linecorp.centraldogma.server.storage.repository.DiffResultType; -39 import com.linecorp.centraldogma.server.storage.repository.FindOption; -40 import com.linecorp.centraldogma.server.storage.repository.Repository; -41 -42 public class RepositoryWrapper implements Repository { -43 -44 private final Repository repo; -45 -46 protected RepositoryWrapper(Repository repo) { -47 this.repo = requireNonNull(repo, "repo"); -48 } -49 -50 @SuppressWarnings("unchecked") -51 public final <T extends Repository> T unwrap() { -52 return (T) repo; -53 } -54 -55 @Override -56 public org.eclipse.jgit.lib.Repository jGitRepository() { -57 return unwrap().jGitRepository(); -58 } -59 -60 @Override -61 public Project parent() { -62 return unwrap().parent(); -63 } -64 -65 @Override -66 public String name() { -67 return unwrap().name(); -68 } -69 -70 @Override -71 public long creationTimeMillis() { -72 return unwrap().creationTimeMillis(); -73 } -74 -75 @Override -76 public Author author() { -77 return unwrap().author(); -78 } -79 -80 @Override -81 public Revision normalizeNow(Revision revision) { -82 return unwrap().normalizeNow(revision); -83 } -84 -85 @Override -86 public RevisionRange normalizeNow(Revision from, Revision to) { -87 return unwrap().normalizeNow(from, to); -88 } -89 -90 @Override -91 public CompletableFuture<Boolean> exists(Revision revision, String path) { -92 return unwrap().exists(revision, path); -93 } -94 -95 @Override -96 public CompletableFuture<Entry<?>> get(Revision revision, String path) { -97 return unwrap().get(revision, path); -98 } -99 -100 @Override -101 public <T> CompletableFuture<Entry<T>> get(Revision revision, Query<T> query) { -102 return unwrap().get(revision, query); -103 } -104 -105 @Override -106 public CompletableFuture<Entry<?>> getOrNull(Revision revision, String path) { -107 return unwrap().getOrNull(revision, path); -108 } -109 -110 @Override -111 public <T> CompletableFuture<Entry<T>> getOrNull(Revision revision, Query<T> query) { -112 return unwrap().getOrNull(revision, query); -113 } -114 -115 @Override -116 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern) { -117 return unwrap().find(revision, pathPattern); -118 } -119 -120 @Override -121 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern, -122 Map<FindOption<?>, ?> options) { -123 return unwrap().find(revision, pathPattern, options); -124 } -125 -126 @Override -127 public CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern) { -128 return unwrap().history(from, to, pathPattern); -129 } -130 -131 @Override -132 public CompletableFuture<List<Commit>> history(Revision from, Revision to, -133 String pathPattern, int maxCommits) { -134 return unwrap().history(from, to, pathPattern, maxCommits); -135 } -136 -137 @Override -138 public CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query) { -139 return unwrap().diff(from, to, query); -140 } -141 -142 @Override -143 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern, -144 DiffResultType diffResultType) { -145 return unwrap().diff(from, to, pathPattern, diffResultType); -146 } -147 -148 @Override -149 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, -150 Iterable<Change<?>> changes) { -151 return unwrap().previewDiff(baseRevision, changes); -152 } -153 -154 @Override -155 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Change<?>... changes) { -156 return unwrap().previewDiff(baseRevision, changes); -157 } -158 -159 @Override -160 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -161 Author author, String summary, Iterable<Change<?>> changes) { -162 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, changes); -163 } -164 -165 @Override -166 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -167 Author author, String summary, Change<?>... changes) { -168 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, changes); -169 } -170 -171 @Override -172 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -173 Author author, String summary, String detail, Markup markup, -174 Iterable<Change<?>> changes, boolean normalizing) { -175 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes, -176 normalizing); -177 } -178 -179 @Override -180 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -181 Author author, String summary, String detail, Markup markup, -182 Change<?>... changes) { -183 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes); -184 } -185 -186 @Override -187 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, -188 boolean errorOnEntryNotFound) { -189 return unwrap().findLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); -190 } -191 -192 @Override -193 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, -194 boolean errorOnEntryNotFound) { -195 return unwrap().watch(lastKnownRevision, pathPattern, errorOnEntryNotFound); -196 } -197 -198 @Override -199 public <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query, -200 boolean errorOnEntryNotFound) { -201 return unwrap().watch(lastKnownRevision, query, errorOnEntryNotFound); -202 } -203 -204 @Override -205 public <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { -206 return unwrap().mergeFiles(revision, query); -207 } -208 -209 @Override -210 public String toString() { -211 return Util.simpleTypeName(this) + '(' + unwrap() + ')'; -212 } -213 } +38 import com.linecorp.centraldogma.server.storage.repository.FindOption; +39 import com.linecorp.centraldogma.server.storage.repository.Repository; +40 +41 public class RepositoryWrapper implements Repository { +42 +43 private final Repository repo; +44 +45 protected RepositoryWrapper(Repository repo) { +46 this.repo = requireNonNull(repo, "repo"); +47 } +48 +49 @SuppressWarnings("unchecked") +50 public final <T extends Repository> T unwrap() { +51 return (T) repo; +52 } +53 +54 @Override +55 public org.eclipse.jgit.lib.Repository jGitRepository() { +56 return unwrap().jGitRepository(); +57 } +58 +59 @Override +60 public Project parent() { +61 return unwrap().parent(); +62 } +63 +64 @Override +65 public String name() { +66 return unwrap().name(); +67 } +68 +69 @Override +70 public long creationTimeMillis() { +71 return unwrap().creationTimeMillis(); +72 } +73 +74 @Override +75 public Author author() { +76 return unwrap().author(); +77 } +78 +79 @Override +80 public Revision normalizeNow(Revision revision) { +81 return unwrap().normalizeNow(revision); +82 } +83 +84 @Override +85 public RevisionRange normalizeNow(Revision from, Revision to) { +86 return unwrap().normalizeNow(from, to); +87 } +88 +89 @Override +90 public CompletableFuture<Boolean> exists(Revision revision, String path) { +91 return unwrap().exists(revision, path); +92 } +93 +94 @Override +95 public CompletableFuture<Entry<?>> get(Revision revision, String path) { +96 return unwrap().get(revision, path); +97 } +98 +99 @Override +100 public <T> CompletableFuture<Entry<T>> get(Revision revision, Query<T> query) { +101 return unwrap().get(revision, query); +102 } +103 +104 @Override +105 public CompletableFuture<Entry<?>> getOrNull(Revision revision, String path) { +106 return unwrap().getOrNull(revision, path); +107 } +108 +109 @Override +110 public <T> CompletableFuture<Entry<T>> getOrNull(Revision revision, Query<T> query) { +111 return unwrap().getOrNull(revision, query); +112 } +113 +114 @Override +115 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern) { +116 return unwrap().find(revision, pathPattern); +117 } +118 +119 @Override +120 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern, +121 Map<FindOption<?>, ?> options) { +122 return unwrap().find(revision, pathPattern, options); +123 } +124 +125 @Override +126 public CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern) { +127 return unwrap().history(from, to, pathPattern); +128 } +129 +130 @Override +131 public CompletableFuture<List<Commit>> history(Revision from, Revision to, +132 String pathPattern, int maxCommits) { +133 return unwrap().history(from, to, pathPattern, maxCommits); +134 } +135 +136 @Override +137 public CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query) { +138 return unwrap().diff(from, to, query); +139 } +140 +141 @Override +142 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern) { +143 return unwrap().diff(from, to, pathPattern); +144 } +145 +146 @Override +147 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, +148 Iterable<Change<?>> changes) { +149 return unwrap().previewDiff(baseRevision, changes); +150 } +151 +152 @Override +153 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Change<?>... changes) { +154 return unwrap().previewDiff(baseRevision, changes); +155 } +156 +157 @Override +158 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +159 Author author, String summary, Iterable<Change<?>> changes) { +160 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, changes); +161 } +162 +163 @Override +164 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +165 Author author, String summary, Change<?>... changes) { +166 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, changes); +167 } +168 +169 @Override +170 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +171 Author author, String summary, String detail, Markup markup, +172 Iterable<Change<?>> changes, boolean normalizing) { +173 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes, +174 normalizing); +175 } +176 +177 @Override +178 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +179 Author author, String summary, String detail, Markup markup, +180 Change<?>... changes) { +181 return unwrap().commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes); +182 } +183 +184 @Override +185 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, +186 boolean errorOnEntryNotFound) { +187 return unwrap().findLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); +188 } +189 +190 @Override +191 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, +192 boolean errorOnEntryNotFound) { +193 return unwrap().watch(lastKnownRevision, pathPattern, errorOnEntryNotFound); +194 } +195 +196 @Override +197 public <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query, +198 boolean errorOnEntryNotFound) { +199 return unwrap().watch(lastKnownRevision, query, errorOnEntryNotFound); +200 } +201 +202 @Override +203 public <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { +204 return unwrap().mergeFiles(revision, query); +205 } +206 +207 @Override +208 public String toString() { +209 return Util.simpleTypeName(this) + '(' + unwrap() + ')'; +210 } +211 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CacheableMultiDiffCall.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CacheableMultiDiffCall.html index d00d999d3c..cfdce16d9d 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CacheableMultiDiffCall.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CacheableMultiDiffCall.html @@ -35,77 +35,71 @@ 27 import com.linecorp.centraldogma.common.Change; 28 import com.linecorp.centraldogma.common.Revision; 29 import com.linecorp.centraldogma.server.internal.storage.repository.CacheableCall; -30 import com.linecorp.centraldogma.server.storage.repository.DiffResultType; -31 import com.linecorp.centraldogma.server.storage.repository.Repository; -32 -33 final class CacheableMultiDiffCall extends CacheableCall<Map<String, Change<?>>> { -34 -35 private final Revision from; -36 private final Revision to; -37 private final String pathPattern; -38 private final DiffResultType diffResultType; -39 private final int hashCode; -40 -41 CacheableMultiDiffCall(Repository repo, Revision from, Revision to, String pathPattern, -42 DiffResultType diffResultType) { -43 super(repo); -44 -45 this.from = requireNonNull(from, "from"); -46 this.to = requireNonNull(to, "to"); -47 this.pathPattern = requireNonNull(pathPattern, "pathPattern"); -48 this.diffResultType = requireNonNull(diffResultType, "diffResultType"); -49 -50 hashCode = Objects.hash(from, to, pathPattern, diffResultType) * 31 + System.identityHashCode(repo); +30 import com.linecorp.centraldogma.server.storage.repository.Repository; +31 +32 final class CacheableMultiDiffCall extends CacheableCall<Map<String, Change<?>>> { +33 +34 final Revision from; +35 final Revision to; +36 final String pathPattern; +37 final int hashCode; +38 +39 CacheableMultiDiffCall(Repository repo, Revision from, Revision to, String pathPattern) { +40 super(repo); +41 +42 this.from = requireNonNull(from, "from"); +43 this.to = requireNonNull(to, "to"); +44 this.pathPattern = requireNonNull(pathPattern, "pathPattern"); +45 +46 hashCode = Objects.hash(from, to, pathPattern) * 31 + System.identityHashCode(repo); +47 +48 assert !from.isRelative(); +49 assert !to.isRelative(); +50 } 51 -52 assert !from.isRelative(); -53 assert !to.isRelative(); -54 } -55 -56 @Override -57 protected int weigh(Map<String, Change<?>> value) { -58 int weight = 0; -59 weight += pathPattern.length(); -60 for (Change<?> e : value.values()) { -61 weight += e.path().length(); -62 final String content = e.contentAsText(); -63 if (content != null) { -64 weight += content.length(); -65 } -66 } -67 return weight; -68 } -69 -70 @Override -71 public CompletableFuture<Map<String, Change<?>>> execute() { -72 return repo().diff(from, to, pathPattern, diffResultType); -73 } -74 -75 @Override -76 public int hashCode() { -77 return hashCode; -78 } -79 -80 @Override -81 public boolean equals(Object o) { -82 if (!super.equals(o)) { -83 return false; -84 } -85 -86 final CacheableMultiDiffCall that = (CacheableMultiDiffCall) o; -87 return from.equals(that.from) && -88 to.equals(that.to) && -89 pathPattern.equals(that.pathPattern) && -90 diffResultType == that.diffResultType; -91 } -92 -93 @Override -94 protected void toString(ToStringHelper helper) { -95 helper.add("from", from) -96 .add("to", to) -97 .add("pathPattern", pathPattern) -98 .add("diffResultType", diffResultType); -99 } -100 } +52 @Override +53 protected int weigh(Map<String, Change<?>> value) { +54 int weight = 0; +55 weight += pathPattern.length(); +56 for (Change<?> e : value.values()) { +57 weight += e.path().length(); +58 final String content = e.contentAsText(); +59 if (content != null) { +60 weight += content.length(); +61 } +62 } +63 return weight; +64 } +65 +66 @Override +67 public CompletableFuture<Map<String, Change<?>>> execute() { +68 return repo().diff(from, to, pathPattern); +69 } +70 +71 @Override +72 public int hashCode() { +73 return hashCode; +74 } +75 +76 @Override +77 public boolean equals(Object o) { +78 if (!super.equals(o)) { +79 return false; +80 } +81 +82 final CacheableMultiDiffCall that = (CacheableMultiDiffCall) o; +83 return from.equals(that.from) && +84 to.equals(that.to) && +85 pathPattern.equals(that.pathPattern); +86 } +87 +88 @Override +89 protected void toString(ToStringHelper helper) { +90 helper.add("from", from) +91 .add("to", to) +92 .add("pathPattern", pathPattern); +93 } +94 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CachingRepository.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CachingRepository.html index 7859352187..b157453435 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CachingRepository.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/CachingRepository.html @@ -54,283 +54,279 @@ 46 import com.linecorp.centraldogma.server.command.CommitResult; 47 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryCache; 48 import com.linecorp.centraldogma.server.storage.project.Project; -49 import com.linecorp.centraldogma.server.storage.repository.DiffResultType; -50 import com.linecorp.centraldogma.server.storage.repository.FindOption; -51 import com.linecorp.centraldogma.server.storage.repository.Repository; -52 -53 final class CachingRepository implements Repository { -54 -55 private static final CancellationException CANCELLATION_EXCEPTION = -56 Exceptions.clearTrace(new CancellationException("watch cancelled by caller")); -57 -58 private final Repository repo; -59 private final RepositoryCache cache; -60 -61 CachingRepository(Repository repo, RepositoryCache cache) { -62 this.repo = requireNonNull(repo, "repo"); -63 this.cache = requireNonNull(cache, "cache"); -64 } -65 -66 @Override -67 public org.eclipse.jgit.lib.Repository jGitRepository() { -68 return repo.jGitRepository(); -69 } -70 -71 @Override -72 public long creationTimeMillis() { -73 return repo.creationTimeMillis(); -74 } -75 -76 @Override -77 public Author author() { -78 return repo.author(); -79 } -80 -81 @Override -82 public <T> CompletableFuture<Entry<T>> getOrNull(Revision revision, Query<T> query) { -83 requireNonNull(revision, "revision"); -84 requireNonNull(query, "query"); -85 -86 final Revision normalizedRevision = normalizeNow(revision); -87 if (query.type() == QueryType.IDENTITY || query.type() == QueryType.IDENTITY_TEXT || -88 query.type() == QueryType.IDENTITY_JSON) { -89 // If the query is an IDENTITY type, call find() so that the caches are reused in one place when -90 // calls getOrNull(), find() and mergeFiles(). -91 final String path = query.path(); -92 final CompletableFuture<Entry<?>> future = -93 find(revision, path, FIND_ONE_WITH_CONTENT).thenApply(findResult -> findResult.get(path)); -94 return unsafeCast(future); -95 } -96 -97 final CompletableFuture<Object> future = -98 cache.get(new CacheableQueryCall(repo, normalizedRevision, query)) -99 .handleAsync((result, cause) -> { -100 throwUnsafelyIfNonNull(cause); -101 return result != CacheableQueryCall.EMPTY ? result : null; -102 }, executor()); -103 return unsafeCast(future); -104 } -105 -106 @Override -107 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern, -108 Map<FindOption<?>, ?> options) { -109 requireNonNull(revision, "revision"); -110 requireNonNull(pathPattern, "pathPattern"); -111 requireNonNull(options, "options"); -112 -113 final Revision normalizedRevision = normalizeNow(revision); -114 return cache.get(new CacheableFindCall(repo, normalizedRevision, pathPattern, options)) -115 .handleAsync((unused, cause) -> { -116 throwUnsafelyIfNonNull(cause); -117 return unused; -118 }, executor()); -119 } -120 -121 @Override -122 public CompletableFuture<List<Commit>> history(Revision from, Revision to, -123 String pathPattern, int maxCommits) { -124 requireNonNull(from, "from"); -125 requireNonNull(to, "to"); -126 requireNonNull(pathPattern, "pathPattern"); -127 if (maxCommits <= 0) { -128 throw new IllegalArgumentException("maxCommits: " + maxCommits + " (expected: > 0)"); -129 } -130 -131 final RevisionRange range = normalizeNow(from, to); -132 -133 // Make sure maxCommits do not exceed its theoretical limit to increase the chance of cache hit. -134 // e.g. when from = 2 and to = 4, the same result should be yielded when maxCommits >= 3. -135 final int actualMaxCommits = Math.min( -136 maxCommits, Math.abs(range.from().major() - range.to().major()) + 1); -137 return cache.get(new CacheableHistoryCall(repo, range.from(), range.to(), -138 pathPattern, actualMaxCommits)) -139 .handleAsync((unused, cause) -> { -140 throwUnsafelyIfNonNull(cause); -141 return unused; -142 }, executor()); -143 } -144 -145 @Override -146 public CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query) { -147 requireNonNull(from, "from"); -148 requireNonNull(to, "to"); -149 requireNonNull(query, "query"); -150 -151 final RevisionRange range = normalizeNow(from, to).toAscending(); -152 return cache.get(new CacheableSingleDiffCall(repo, range.from(), range.to(), query)) -153 .handleAsync((unused, cause) -> { -154 throwUnsafelyIfNonNull(cause); -155 return unused; -156 }, executor()); -157 } -158 -159 @Override -160 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern, -161 DiffResultType diffResultType) { -162 requireNonNull(from, "from"); -163 requireNonNull(to, "to"); -164 requireNonNull(pathPattern, "pathPattern"); -165 requireNonNull(diffResultType, "diffResultType"); -166 -167 final RevisionRange range = normalizeNow(from, to).toAscending(); -168 return cache.get(new CacheableMultiDiffCall(repo, range.from(), range.to(), -169 pathPattern, diffResultType)) -170 .handleAsync((unused, cause) -> { -171 throwUnsafelyIfNonNull(cause); -172 return unused; -173 }, executor()); -174 } -175 -176 @Override -177 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, -178 boolean errorOnEntryNotFound) { -179 requireNonNull(lastKnownRevision, "lastKnownRevision"); -180 requireNonNull(pathPattern, "pathPattern"); -181 -182 final RevisionRange range = normalizeNow(lastKnownRevision, Revision.HEAD); -183 if (range.from().equals(range.to())) { -184 // Empty range. -185 return CompletableFuture.completedFuture(null); -186 } -187 -188 return cache.get(new CacheableFindLatestRevCall(repo, range.from(), range.to(), -189 pathPattern, errorOnEntryNotFound)) -190 .handleAsync((result, cause) -> { -191 throwUnsafelyIfNonNull(cause); -192 if (result == CacheableFindLatestRevCall.ENTRY_NOT_FOUND) { -193 throw new EntryNotFoundException(range.from(), pathPattern); -194 } -195 if (result == CacheableFindLatestRevCall.EMPTY) { -196 return null; -197 } -198 return result; -199 }, executor()); -200 } -201 -202 @Override -203 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, -204 boolean errorOnEntryNotFound) { -205 requireNonNull(lastKnownRevision, "lastKnownRevision"); -206 requireNonNull(pathPattern, "pathPattern"); -207 -208 final CompletableFuture<Revision> latestRevFuture = -209 findLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); -210 if (latestRevFuture.isCompletedExceptionally() || latestRevFuture.getNow(null) != null) { -211 return latestRevFuture; -212 } -213 -214 final CompletableFuture<Revision> future = new CompletableFuture<>(); -215 latestRevFuture.whenComplete((latestRevision, cause) -> { -216 if (cause != null) { -217 future.completeExceptionally(cause); -218 return; -219 } -220 -221 if (latestRevision != null) { -222 future.complete(latestRevision); -223 return; -224 } -225 -226 // Propagate the state of 'watchFuture' to 'future'. -227 final CompletableFuture<Revision> watchFuture = -228 repo.watch(lastKnownRevision, pathPattern, errorOnEntryNotFound); -229 watchFuture.whenComplete((watchResult, watchCause) -> { -230 if (watchCause == null) { -231 future.complete(watchResult); -232 } else { -233 future.completeExceptionally(watchCause); -234 } -235 }); -236 -237 // Cancel the 'watchFuture' if 'future' is complete. 'future' is complete on the following cases: +49 import com.linecorp.centraldogma.server.storage.repository.FindOption; +50 import com.linecorp.centraldogma.server.storage.repository.Repository; +51 +52 final class CachingRepository implements Repository { +53 +54 private static final CancellationException CANCELLATION_EXCEPTION = +55 Exceptions.clearTrace(new CancellationException("watch cancelled by caller")); +56 +57 private final Repository repo; +58 private final RepositoryCache cache; +59 +60 CachingRepository(Repository repo, RepositoryCache cache) { +61 this.repo = requireNonNull(repo, "repo"); +62 this.cache = requireNonNull(cache, "cache"); +63 } +64 +65 @Override +66 public org.eclipse.jgit.lib.Repository jGitRepository() { +67 return repo.jGitRepository(); +68 } +69 +70 @Override +71 public long creationTimeMillis() { +72 return repo.creationTimeMillis(); +73 } +74 +75 @Override +76 public Author author() { +77 return repo.author(); +78 } +79 +80 @Override +81 public <T> CompletableFuture<Entry<T>> getOrNull(Revision revision, Query<T> query) { +82 requireNonNull(revision, "revision"); +83 requireNonNull(query, "query"); +84 +85 final Revision normalizedRevision = normalizeNow(revision); +86 if (query.type() == QueryType.IDENTITY || query.type() == QueryType.IDENTITY_TEXT || +87 query.type() == QueryType.IDENTITY_JSON) { +88 // If the query is an IDENTITY type, call find() so that the caches are reused in one place when +89 // calls getOrNull(), find() and mergeFiles(). +90 final String path = query.path(); +91 final CompletableFuture<Entry<?>> future = +92 find(revision, path, FIND_ONE_WITH_CONTENT).thenApply(findResult -> findResult.get(path)); +93 return unsafeCast(future); +94 } +95 +96 final CompletableFuture<Object> future = +97 cache.get(new CacheableQueryCall(repo, normalizedRevision, query)) +98 .handleAsync((result, cause) -> { +99 throwUnsafelyIfNonNull(cause); +100 return result != CacheableQueryCall.EMPTY ? result : null; +101 }, executor()); +102 return unsafeCast(future); +103 } +104 +105 @Override +106 public CompletableFuture<Map<String, Entry<?>>> find(Revision revision, String pathPattern, +107 Map<FindOption<?>, ?> options) { +108 requireNonNull(revision, "revision"); +109 requireNonNull(pathPattern, "pathPattern"); +110 requireNonNull(options, "options"); +111 +112 final Revision normalizedRevision = normalizeNow(revision); +113 return cache.get(new CacheableFindCall(repo, normalizedRevision, pathPattern, options)) +114 .handleAsync((unused, cause) -> { +115 throwUnsafelyIfNonNull(cause); +116 return unused; +117 }, executor()); +118 } +119 +120 @Override +121 public CompletableFuture<List<Commit>> history(Revision from, Revision to, +122 String pathPattern, int maxCommits) { +123 requireNonNull(from, "from"); +124 requireNonNull(to, "to"); +125 requireNonNull(pathPattern, "pathPattern"); +126 if (maxCommits <= 0) { +127 throw new IllegalArgumentException("maxCommits: " + maxCommits + " (expected: > 0)"); +128 } +129 +130 final RevisionRange range = normalizeNow(from, to); +131 +132 // Make sure maxCommits do not exceed its theoretical limit to increase the chance of cache hit. +133 // e.g. when from = 2 and to = 4, the same result should be yielded when maxCommits >= 3. +134 final int actualMaxCommits = Math.min( +135 maxCommits, Math.abs(range.from().major() - range.to().major()) + 1); +136 return cache.get(new CacheableHistoryCall(repo, range.from(), range.to(), +137 pathPattern, actualMaxCommits)) +138 .handleAsync((unused, cause) -> { +139 throwUnsafelyIfNonNull(cause); +140 return unused; +141 }, executor()); +142 } +143 +144 @Override +145 public CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query) { +146 requireNonNull(from, "from"); +147 requireNonNull(to, "to"); +148 requireNonNull(query, "query"); +149 +150 final RevisionRange range = normalizeNow(from, to).toAscending(); +151 return cache.get(new CacheableSingleDiffCall(repo, range.from(), range.to(), query)) +152 .handleAsync((unused, cause) -> { +153 throwUnsafelyIfNonNull(cause); +154 return unused; +155 }, executor()); +156 } +157 +158 @Override +159 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern) { +160 requireNonNull(from, "from"); +161 requireNonNull(to, "to"); +162 requireNonNull(pathPattern, "pathPattern"); +163 +164 final RevisionRange range = normalizeNow(from, to).toAscending(); +165 return cache.get(new CacheableMultiDiffCall(repo, range.from(), range.to(), pathPattern)) +166 .handleAsync((unused, cause) -> { +167 throwUnsafelyIfNonNull(cause); +168 return unused; +169 }, executor()); +170 } +171 +172 @Override +173 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, +174 boolean errorOnEntryNotFound) { +175 requireNonNull(lastKnownRevision, "lastKnownRevision"); +176 requireNonNull(pathPattern, "pathPattern"); +177 +178 final RevisionRange range = normalizeNow(lastKnownRevision, Revision.HEAD); +179 if (range.from().equals(range.to())) { +180 // Empty range. +181 return CompletableFuture.completedFuture(null); +182 } +183 +184 return cache.get(new CacheableFindLatestRevCall(repo, range.from(), range.to(), +185 pathPattern, errorOnEntryNotFound)) +186 .handleAsync((result, cause) -> { +187 throwUnsafelyIfNonNull(cause); +188 if (result == CacheableFindLatestRevCall.ENTRY_NOT_FOUND) { +189 throw new EntryNotFoundException(range.from(), pathPattern); +190 } +191 if (result == CacheableFindLatestRevCall.EMPTY) { +192 return null; +193 } +194 return result; +195 }, executor()); +196 } +197 +198 @Override +199 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, +200 boolean errorOnEntryNotFound) { +201 requireNonNull(lastKnownRevision, "lastKnownRevision"); +202 requireNonNull(pathPattern, "pathPattern"); +203 +204 final CompletableFuture<Revision> latestRevFuture = +205 findLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); +206 if (latestRevFuture.isCompletedExceptionally() || latestRevFuture.getNow(null) != null) { +207 return latestRevFuture; +208 } +209 +210 final CompletableFuture<Revision> future = new CompletableFuture<>(); +211 latestRevFuture.whenComplete((latestRevision, cause) -> { +212 if (cause != null) { +213 future.completeExceptionally(cause); +214 return; +215 } +216 +217 if (latestRevision != null) { +218 future.complete(latestRevision); +219 return; +220 } +221 +222 // Propagate the state of 'watchFuture' to 'future'. +223 final CompletableFuture<Revision> watchFuture = +224 repo.watch(lastKnownRevision, pathPattern, errorOnEntryNotFound); +225 watchFuture.whenComplete((watchResult, watchCause) -> { +226 if (watchCause == null) { +227 future.complete(watchResult); +228 } else { +229 future.completeExceptionally(watchCause); +230 } +231 }); +232 +233 // Cancel the 'watchFuture' if 'future' is complete. 'future' is complete on the following cases: +234 // +235 // 1) The state of 'watchFuture' has been propagated to 'future' by the callback we registered +236 // above. In this case, 'watchFuture.completeExceptionally()' call below has no effect because +237 // 'watchFuture' is complete already. 238 // -239 // 1) The state of 'watchFuture' has been propagated to 'future' by the callback we registered -240 // above. In this case, 'watchFuture.completeExceptionally()' call below has no effect because -241 // 'watchFuture' is complete already. -242 // -243 // 2) A user completed 'future' by his or her own, most often for cancellation. -244 // 'watchFuture' will be completed by 'watchFuture.completeExceptionally()' below. -245 // The callback we registered to 'watchFuture' above will have no effect because 'future' is -246 // complete already. +239 // 2) A user completed 'future' by his or her own, most often for cancellation. +240 // 'watchFuture' will be completed by 'watchFuture.completeExceptionally()' below. +241 // The callback we registered to 'watchFuture' above will have no effect because 'future' is +242 // complete already. +243 +244 future.whenComplete( +245 (unused1, unused2) -> watchFuture.completeExceptionally(CANCELLATION_EXCEPTION)); +246 }); 247 -248 future.whenComplete( -249 (unused1, unused2) -> watchFuture.completeExceptionally(CANCELLATION_EXCEPTION)); -250 }); -251 -252 return future; -253 } -254 -255 @Override -256 public <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { -257 requireNonNull(revision, "revision"); -258 requireNonNull(query, "query"); -259 -260 final Revision normalizedRevision = normalizeNow(revision); -261 final CacheableMergeQueryCall key = new CacheableMergeQueryCall(repo, normalizedRevision, query); -262 final CompletableFuture<MergedEntry<?>> value = cache.getIfPresent(key); -263 if (value != null) { -264 return unsafeCast(value.handleAsync((unused, cause) -> { -265 throwUnsafelyIfNonNull(cause); -266 return unused; -267 }, executor())); -268 } -269 -270 return Repository.super.mergeFiles(normalizedRevision, query).thenApply(mergedEntry -> { -271 key.computedValue(mergedEntry); -272 cache.get(key); -273 return mergedEntry; -274 }); +248 return future; +249 } +250 +251 @Override +252 public <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { +253 requireNonNull(revision, "revision"); +254 requireNonNull(query, "query"); +255 +256 final Revision normalizedRevision = normalizeNow(revision); +257 final CacheableMergeQueryCall key = new CacheableMergeQueryCall(repo, normalizedRevision, query); +258 final CompletableFuture<MergedEntry<?>> value = cache.getIfPresent(key); +259 if (value != null) { +260 return unsafeCast(value.handleAsync((unused, cause) -> { +261 throwUnsafelyIfNonNull(cause); +262 return unused; +263 }, executor())); +264 } +265 +266 return Repository.super.mergeFiles(normalizedRevision, query).thenApply(mergedEntry -> { +267 key.computedValue(mergedEntry); +268 cache.get(key); +269 return mergedEntry; +270 }); +271 } +272 +273 private static Executor executor() { +274 return RequestContext.mapCurrent(RequestContext::eventLoop, CommonPools.workerGroup()::next); 275 } 276 -277 private static Executor executor() { -278 return RequestContext.mapCurrent(RequestContext::eventLoop, CommonPools.workerGroup()::next); -279 } -280 -281 // Simple delegations -282 -283 @Override -284 public Project parent() { -285 return repo.parent(); -286 } -287 -288 @Override -289 public String name() { -290 return repo.name(); -291 } -292 -293 @Override -294 public Revision normalizeNow(Revision revision) { -295 return repo.normalizeNow(revision); -296 } -297 -298 @Override -299 public RevisionRange normalizeNow(Revision from, Revision to) { -300 return repo.normalizeNow(from, to); -301 } -302 -303 @Override -304 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, -305 Iterable<Change<?>> changes) { -306 requireNonNull(baseRevision, "baseRevision"); -307 return repo.previewDiff(baseRevision, changes); -308 } -309 -310 @Override -311 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -312 Author author, String summary, String detail, Markup markup, -313 Iterable<Change<?>> changes, boolean normalizing) { +277 // Simple delegations +278 +279 @Override +280 public Project parent() { +281 return repo.parent(); +282 } +283 +284 @Override +285 public String name() { +286 return repo.name(); +287 } +288 +289 @Override +290 public Revision normalizeNow(Revision revision) { +291 return repo.normalizeNow(revision); +292 } +293 +294 @Override +295 public RevisionRange normalizeNow(Revision from, Revision to) { +296 return repo.normalizeNow(from, to); +297 } +298 +299 @Override +300 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, +301 Iterable<Change<?>> changes) { +302 requireNonNull(baseRevision, "baseRevision"); +303 return repo.previewDiff(baseRevision, changes); +304 } +305 +306 @Override +307 public CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +308 Author author, String summary, String detail, Markup markup, +309 Iterable<Change<?>> changes, boolean normalizing) { +310 +311 return repo.commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes, +312 normalizing); +313 } 314 -315 return repo.commit(baseRevision, commitTimeMillis, author, summary, detail, markup, changes, -316 normalizing); -317 } -318 -319 @Override -320 public String toString() { -321 return toStringHelper(this) -322 .add("repo", repo) -323 .toString(); -324 } -325 } +315 @Override +316 public String toString() { +317 return toStringHelper(this) +318 .add("repo", repo) +319 .toString(); +320 } +321 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-frame.html index b4596630a0..c99222861b 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.cache + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.cache diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-summary.html index 3e26c5839a..daa27367d8 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/cache/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.cache + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.cache diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepository.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepository.html index de545b0b0f..7a58863635 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepository.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepository.html @@ -125,1619 +125,1617 @@ 117 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryCache; 118 import com.linecorp.centraldogma.server.storage.StorageException; 119 import com.linecorp.centraldogma.server.storage.project.Project; -120 import com.linecorp.centraldogma.server.storage.repository.DiffResultType; -121 import com.linecorp.centraldogma.server.storage.repository.FindOption; -122 import com.linecorp.centraldogma.server.storage.repository.FindOptions; -123 import com.linecorp.centraldogma.server.storage.repository.Repository; -124 -125 import difflib.DiffUtils; -126 import difflib.Patch; -127 -128 /** -129 * A {@link Repository} based on Git. -130 */ -131 class GitRepository implements Repository { -132 -133 private static final Logger logger = LoggerFactory.getLogger(GitRepository.class); -134 -135 static final String R_HEADS_MASTER = Constants.R_HEADS + Constants.MASTER; -136 -137 private static final byte[] EMPTY_BYTE = new byte[0]; -138 private static final Pattern CR = Pattern.compile("\r", Pattern.LITERAL); -139 -140 private static final Field revWalkObjectsField; -141 -142 static { -143 final String jgitPomProperties = "META-INF/maven/org.eclipse.jgit/org.eclipse.jgit/pom.properties"; -144 try (InputStream is = SystemReader.class.getClassLoader().getResourceAsStream(jgitPomProperties)) { -145 final Properties props = new Properties(); -146 props.load(is); -147 final Object jgitVersion = props.get("version"); -148 if (jgitVersion != null) { -149 logger.info("Using JGit: {}", jgitVersion); -150 } -151 } catch (IOException e) { -152 logger.debug("Failed to read JGit version", e); -153 } -154 -155 IsolatedSystemReader.install(); -156 -157 Field field = null; -158 try { -159 field = RevWalk.class.getDeclaredField("objects"); -160 if (field.getType() != ObjectIdOwnerMap.class) { -161 throw new IllegalStateException( -162 RevWalk.class.getSimpleName() + ".objects is not an " + -163 ObjectIdOwnerMap.class.getSimpleName() + '.'); -164 } -165 field.setAccessible(true); -166 } catch (NoSuchFieldException e) { -167 throw new IllegalStateException( -168 RevWalk.class.getSimpleName() + ".objects does not exist."); -169 } -170 -171 revWalkObjectsField = field; -172 } -173 -174 private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); -175 private final Project parent; -176 private final Executor repositoryWorker; -177 private final long creationTimeMillis; -178 private final Author author; -179 @VisibleForTesting -180 @Nullable -181 final RepositoryCache cache; -182 private final String name; -183 private final org.eclipse.jgit.lib.Repository jGitRepository; -184 private final CommitIdDatabase commitIdDatabase; -185 @VisibleForTesting -186 final CommitWatchers commitWatchers = new CommitWatchers(); -187 private final AtomicReference<Supplier<CentralDogmaException>> closePending = new AtomicReference<>(); -188 private final CompletableFuture<Void> closeFuture = new CompletableFuture<>(); -189 -190 /** -191 * The current head revision. Initialized by the constructor and updated by commit(). -192 */ -193 private volatile Revision headRevision; -194 -195 /** -196 * Creates a new Git-backed repository. -197 * -198 * @param repoDir the location of this repository -199 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations -200 * @param creationTimeMillis the creation time -201 * @param author the user who initiated the creation of this repository -202 * -203 * @throws StorageException if failed to create a new repository -204 */ -205 @VisibleForTesting -206 GitRepository(Project parent, File repoDir, Executor repositoryWorker, -207 long creationTimeMillis, Author author) { -208 this(parent, repoDir, repositoryWorker, creationTimeMillis, author, null); -209 } -210 -211 /** -212 * Creates a new Git-backed repository. -213 * -214 * @param repoDir the location of this repository -215 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations -216 * @param creationTimeMillis the creation time -217 * @param author the user who initiated the creation of this repository -218 * -219 * @throws StorageException if failed to create a new repository -220 */ -221 GitRepository(Project parent, File repoDir, Executor repositoryWorker, -222 long creationTimeMillis, Author author, @Nullable RepositoryCache cache) { -223 -224 this.parent = requireNonNull(parent, "parent"); -225 name = requireNonNull(repoDir, "repoDir").getName(); -226 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); -227 this.creationTimeMillis = creationTimeMillis; -228 this.author = requireNonNull(author, "author"); -229 this.cache = cache; -230 -231 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir).setBare(); -232 boolean success = false; -233 try { -234 // Create an empty repository with format version 0 first. -235 try (org.eclipse.jgit.lib.Repository initRepo = repositoryBuilder.build()) { -236 if (exist(repoDir)) { -237 throw new StorageException( -238 "failed to create a repository at: " + repoDir + " (exists already)"); -239 } -240 initRepo.create(true); -241 -242 // Save the initial default settings. -243 JGitUtil.applyDefaultsAndSave(initRepo.getConfig()); -244 } -245 -246 // Re-open the repository with the updated settings. -247 jGitRepository = new RepositoryBuilder().setGitDir(repoDir).build(); -248 -249 // Initialize the master branch. -250 final RefUpdate head = jGitRepository.updateRef(Constants.HEAD); -251 head.disableRefLog(); -252 head.link(Constants.R_HEADS + Constants.MASTER); -253 -254 // Initialize the commit ID database. -255 commitIdDatabase = new CommitIdDatabase(jGitRepository); -256 -257 // Insert the initial commit into the master branch. -258 commit0(null, Revision.INIT, creationTimeMillis, author, -259 "Create a new repository", "", Markup.PLAINTEXT, -260 Collections.emptyList(), true); -261 -262 headRevision = Revision.INIT; -263 success = true; -264 } catch (IOException e) { -265 throw new StorageException("failed to create a repository at: " + repoDir, e); -266 } finally { -267 if (!success) { -268 internalClose(); -269 // Failed to create a repository. Remove any cruft so that it is not loaded on the next run. -270 deleteCruft(repoDir); -271 } -272 } -273 } -274 -275 /** -276 * Opens an existing Git-backed repository. -277 * -278 * @param repoDir the location of this repository -279 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations -280 * -281 * @throws StorageException if failed to open the repository at the specified location -282 */ -283 GitRepository(Project parent, File repoDir, Executor repositoryWorker, @Nullable RepositoryCache cache) { -284 this.parent = requireNonNull(parent, "parent"); -285 name = requireNonNull(repoDir, "repoDir").getName(); -286 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); -287 this.cache = cache; -288 -289 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir).setBare(); -290 try { -291 jGitRepository = repositoryBuilder.build(); -292 if (!exist(repoDir)) { -293 throw new RepositoryNotFoundException(repoDir.toString()); -294 } -295 -296 // Retrieve the repository format. -297 final int formatVersion = jGitRepository.getConfig().getInt( -298 CONFIG_CORE_SECTION, null, CONFIG_KEY_REPO_FORMAT_VERSION, 0); -299 if (formatVersion != JGitUtil.REPO_FORMAT_VERSION) { -300 throw new StorageException("unsupported repository format version: " + formatVersion + -301 " (expected: " + JGitUtil.REPO_FORMAT_VERSION + ')'); -302 } -303 -304 // Update the default settings if necessary. -305 JGitUtil.applyDefaultsAndSave(jGitRepository.getConfig()); -306 } catch (IOException e) { -307 throw new StorageException("failed to open a repository at: " + repoDir, e); -308 } -309 -310 boolean success = false; -311 try { -312 headRevision = uncachedHeadRevision(); -313 commitIdDatabase = new CommitIdDatabase(jGitRepository); -314 if (!headRevision.equals(commitIdDatabase.headRevision())) { -315 commitIdDatabase.rebuild(jGitRepository); -316 assert headRevision.equals(commitIdDatabase.headRevision()); -317 } -318 final Commit initialCommit = blockingHistory(Revision.INIT, Revision.INIT, ALL_PATH, 1).get(0); -319 creationTimeMillis = initialCommit.when(); -320 author = initialCommit.author(); -321 success = true; -322 } finally { -323 if (!success) { -324 internalClose(); -325 } -326 } -327 } -328 -329 private static boolean exist(File repoDir) { -330 try { -331 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir); -332 final org.eclipse.jgit.lib.Repository repository = repositoryBuilder.build(); -333 if (repository.getConfig() instanceof FileBasedConfig) { -334 return ((FileBasedConfig) repository.getConfig()).getFile().exists(); -335 } -336 return repository.getDirectory().exists(); -337 } catch (IOException e) { -338 throw new StorageException("failed to check if repository exists at " + repoDir, e); -339 } -340 } -341 -342 /** -343 * Waits until all pending operations are complete and closes this repository. -344 * -345 * @param failureCauseSupplier the {@link Supplier} that creates a new {@link CentralDogmaException} -346 * which will be used to fail the operations issued after this method is called -347 */ -348 void close(Supplier<CentralDogmaException> failureCauseSupplier) { -349 requireNonNull(failureCauseSupplier, "failureCauseSupplier"); -350 if (closePending.compareAndSet(null, failureCauseSupplier)) { -351 repositoryWorker.execute(() -> { -352 // MUST acquire gcLock first to prevent a dead lock -353 rwLock.writeLock().lock(); -354 try { -355 if (commitIdDatabase != null) { -356 try { -357 commitIdDatabase.close(); -358 } catch (Exception e) { -359 logger.warn("Failed to close a commitId database:", e); -360 } -361 } -362 -363 if (jGitRepository != null) { -364 try { -365 jGitRepository.close(); -366 } catch (Exception e) { -367 logger.warn("Failed to close a Git repository: {}", -368 jGitRepository.getDirectory(), e); -369 } -370 } -371 } finally { -372 try { -373 rwLock.writeLock().unlock(); -374 } finally { -375 commitWatchers.close(failureCauseSupplier); -376 closeFuture.complete(null); -377 } -378 } -379 }); -380 } -381 -382 closeFuture.join(); -383 } -384 -385 void internalClose() { -386 close(() -> new CentralDogmaException("should never reach here")); -387 } -388 -389 @Override -390 public org.eclipse.jgit.lib.Repository jGitRepository() { -391 return jGitRepository; -392 } -393 -394 @Override -395 public Project parent() { -396 return parent; -397 } -398 -399 @Override -400 public String name() { -401 return name; -402 } -403 -404 @Override -405 public long creationTimeMillis() { -406 return creationTimeMillis; -407 } -408 -409 @Override -410 public Author author() { -411 return author; -412 } -413 -414 @Override -415 public Revision normalizeNow(Revision revision) { -416 return normalizeNow(revision, cachedHeadRevision().major()); -417 } -418 -419 private static Revision normalizeNow(Revision revision, int baseMajor) { -420 requireNonNull(revision, "revision"); -421 -422 int major = revision.major(); -423 -424 if (major >= 0) { -425 if (major > baseMajor) { -426 throw new RevisionNotFoundException(revision); -427 } -428 } else { -429 major = baseMajor + major + 1; -430 if (major <= 0) { -431 throw new RevisionNotFoundException(revision); -432 } -433 } -434 -435 // Create a new instance only when necessary. -436 if (revision.major() == major) { -437 return revision; -438 } else { -439 return new Revision(major); -440 } -441 } -442 -443 @Override -444 public RevisionRange normalizeNow(Revision from, Revision to) { -445 final int baseMajor = cachedHeadRevision().major(); -446 return new RevisionRange(normalizeNow(from, baseMajor), normalizeNow(to, baseMajor)); -447 } -448 -449 @Override -450 public CompletableFuture<Map<String, Entry<?>>> find( -451 Revision revision, String pathPattern, Map<FindOption<?>, ?> options) { -452 final ServiceRequestContext ctx = context(); -453 return CompletableFuture.supplyAsync(() -> { -454 failFastIfTimedOut(this, logger, ctx, "find", revision, pathPattern, options); -455 return blockingFind(revision, pathPattern, options); -456 }, repositoryWorker); -457 } -458 -459 private Map<String, Entry<?>> blockingFind( -460 Revision revision, String pathPattern, Map<FindOption<?>, ?> options) { -461 -462 requireNonNull(pathPattern, "pathPattern"); -463 requireNonNull(revision, "revision"); -464 requireNonNull(options, "options"); -465 -466 final Revision normRevision = normalizeNow(revision); -467 final boolean fetchContent = FindOption.FETCH_CONTENT.get(options); -468 final int maxEntries = FindOption.MAX_ENTRIES.get(options); -469 -470 readLock(); -471 try (ObjectReader reader = jGitRepository.newObjectReader(); -472 TreeWalk treeWalk = new TreeWalk(reader); -473 RevWalk revWalk = newRevWalk(reader)) { -474 -475 // Query on a non-exist revision will return empty result. -476 final Revision headRevision = cachedHeadRevision(); -477 if (normRevision.compareTo(headRevision) > 0) { -478 return Collections.emptyMap(); -479 } -480 -481 if ("/".equals(pathPattern)) { -482 return Collections.singletonMap(pathPattern, Entry.ofDirectory(normRevision, "/")); -483 } -484 -485 final Map<String, Entry<?>> result = new LinkedHashMap<>(); -486 final ObjectId commitId = commitIdDatabase.get(normRevision); -487 final RevCommit revCommit = revWalk.parseCommit(commitId); -488 final PathPatternFilter filter = PathPatternFilter.of(pathPattern); -489 -490 final RevTree revTree = revCommit.getTree(); -491 treeWalk.addTree(revTree.getId()); -492 while (treeWalk.next() && result.size() < maxEntries) { -493 final boolean matches = filter.matches(treeWalk); -494 final String path = '/' + treeWalk.getPathString(); -495 -496 // Recurse into a directory if necessary. -497 if (treeWalk.isSubtree()) { -498 if (matches) { -499 // Add the directory itself to the result set if its path matches the pattern. -500 result.put(path, Entry.ofDirectory(normRevision, path)); -501 } -502 -503 treeWalk.enterSubtree(); -504 continue; -505 } -506 -507 if (!matches) { -508 continue; -509 } -510 -511 // Build an entry as requested. -512 final Entry<?> entry; -513 final EntryType entryType = EntryType.guessFromPath(path); -514 if (fetchContent) { -515 final byte[] content = reader.open(treeWalk.getObjectId(0)).getBytes(); -516 switch (entryType) { -517 case JSON: -518 final JsonNode jsonNode = Jackson.readTree(content); -519 entry = Entry.ofJson(normRevision, path, jsonNode); -520 break; -521 case TEXT: -522 final String strVal = sanitizeText(new String(content, UTF_8)); -523 entry = Entry.ofText(normRevision, path, strVal); -524 break; -525 default: -526 throw new Error("unexpected entry type: " + entryType); -527 } -528 } else { -529 switch (entryType) { -530 case JSON: -531 entry = Entry.ofJson(normRevision, path, Jackson.nullNode); -532 break; -533 case TEXT: -534 entry = Entry.ofText(normRevision, path, ""); -535 break; -536 default: -537 throw new Error("unexpected entry type: " + entryType); -538 } -539 } -540 -541 result.put(path, entry); -542 } -543 -544 return Util.unsafeCast(result); -545 } catch (CentralDogmaException | IllegalArgumentException e) { -546 throw e; -547 } catch (Exception e) { -548 throw new StorageException( -549 "failed to get data from '" + parent.name() + '/' + name + "' at " + pathPattern + -550 " for " + revision, e); -551 } finally { -552 readUnlock(); -553 } -554 } -555 -556 @Override -557 public CompletableFuture<List<Commit>> history( -558 Revision from, Revision to, String pathPattern, int maxCommits) { -559 -560 final ServiceRequestContext ctx = context(); -561 return CompletableFuture.supplyAsync(() -> { -562 failFastIfTimedOut(this, logger, ctx, "history", from, to, pathPattern, maxCommits); -563 return blockingHistory(from, to, pathPattern, maxCommits); -564 }, repositoryWorker); -565 } -566 -567 private List<Commit> blockingHistory(Revision from, Revision to, String pathPattern, int maxCommits) { -568 requireNonNull(pathPattern, "pathPattern"); -569 requireNonNull(from, "from"); -570 requireNonNull(to, "to"); -571 if (maxCommits <= 0) { -572 throw new IllegalArgumentException("maxCommits: " + maxCommits + " (expected: > 0)"); -573 } -574 -575 maxCommits = Math.min(maxCommits, MAX_MAX_COMMITS); -576 -577 final RevisionRange range = normalizeNow(from, to); -578 final RevisionRange descendingRange = range.toDescending(); -579 -580 // At this point, we are sure: from.major >= to.major -581 readLock(); -582 try (RevWalk revWalk = newRevWalk()) { -583 final ObjectIdOwnerMap<?> revWalkInternalMap = -584 (ObjectIdOwnerMap<?>) revWalkObjectsField.get(revWalk); -585 -586 final ObjectId fromCommitId = commitIdDatabase.get(descendingRange.from()); -587 final ObjectId toCommitId = commitIdDatabase.get(descendingRange.to()); -588 -589 revWalk.markStart(revWalk.parseCommit(fromCommitId)); -590 revWalk.setRetainBody(false); -591 -592 // Instead of relying on RevWalk to filter the commits, -593 // we let RevWalk yield all commits so we can: -594 // - Have more control on when iteration should be stopped. -595 // (A single Iterator.next() doesn't take long.) -596 // - Clean up the internal map as early as possible. -597 final RevFilter filter = new TreeRevFilter(revWalk, AndTreeFilter.create( -598 TreeFilter.ANY_DIFF, PathPatternFilter.of(pathPattern))); -599 -600 // Search up to 1000 commits when maxCommits <= 100. -601 // Search up to (maxCommits * 10) commits when 100 < maxCommits <= 1000. -602 final int maxNumProcessedCommits = Math.max(maxCommits * 10, MAX_MAX_COMMITS); -603 -604 final List<Commit> commitList = new ArrayList<>(); -605 int numProcessedCommits = 0; -606 for (RevCommit revCommit : revWalk) { -607 numProcessedCommits++; -608 -609 if (filter.include(revWalk, revCommit)) { -610 revWalk.parseBody(revCommit); -611 commitList.add(toCommit(revCommit)); -612 revCommit.disposeBody(); -613 } -614 -615 if (revCommit.getId().equals(toCommitId) || -616 commitList.size() >= maxCommits || -617 // Prevent from iterating for too long. -618 numProcessedCommits >= maxNumProcessedCommits) { -619 break; -620 } -621 -622 // Clear the internal lookup table of RevWalk to reduce the memory usage. -623 // This is safe because we have linear history and traverse in one direction. -624 if (numProcessedCommits % 16 == 0) { -625 revWalkInternalMap.clear(); -626 } -627 } -628 -629 // Include the initial empty commit only when the caller specified -630 // the initial revision (1) in the range and the pathPattern contains '/**'. -631 if (commitList.size() < maxCommits && -632 descendingRange.to().major() == 1 && -633 pathPattern.contains(ALL_PATH)) { -634 try (RevWalk tmpRevWalk = newRevWalk()) { -635 final RevCommit lastRevCommit = tmpRevWalk.parseCommit(toCommitId); -636 commitList.add(toCommit(lastRevCommit)); -637 } -638 } -639 -640 if (!descendingRange.equals(range)) { // from and to is swapped so reverse the list. -641 Collections.reverse(commitList); -642 } -643 -644 return commitList; -645 } catch (CentralDogmaException e) { -646 throw e; -647 } catch (Exception e) { -648 throw new StorageException( -649 "failed to retrieve the history: " + parent.name() + '/' + name + -650 " (" + pathPattern + ", " + from + ".." + to + ')', e); -651 } finally { -652 readUnlock(); -653 } -654 } -655 -656 private static Commit toCommit(RevCommit revCommit) { -657 final Author author; -658 final PersonIdent committerIdent = revCommit.getCommitterIdent(); -659 final long when; -660 if (committerIdent == null) { -661 author = Author.UNKNOWN; -662 when = 0; -663 } else { -664 author = new Author(committerIdent.getName(), committerIdent.getEmailAddress()); -665 when = committerIdent.getWhen().getTime(); -666 } -667 -668 try { -669 return CommitUtil.newCommit(author, when, revCommit.getFullMessage()); -670 } catch (Exception e) { -671 throw new StorageException("failed to create a Commit", e); -672 } -673 } -674 -675 @Override -676 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern, -677 DiffResultType diffResultType) { -678 final ServiceRequestContext ctx = context(); -679 return CompletableFuture.supplyAsync(() -> { -680 requireNonNull(from, "from"); -681 requireNonNull(to, "to"); -682 requireNonNull(pathPattern, "pathPattern"); -683 -684 failFastIfTimedOut(this, logger, ctx, "diff", from, to, pathPattern); -685 -686 final RevisionRange range = normalizeNow(from, to).toAscending(); -687 readLock(); -688 try (RevWalk rw = newRevWalk()) { -689 final RevTree treeA = rw.parseTree(commitIdDatabase.get(range.from())); -690 final RevTree treeB = rw.parseTree(commitIdDatabase.get(range.to())); -691 -692 // Compare the two Git trees. -693 // Note that we do not cache here because CachingRepository caches the final result already. -694 return toChangeMap(blockingCompareTreesUncached( -695 treeA, treeB, pathPatternFilterOrTreeFilter(pathPattern)), diffResultType); -696 } catch (StorageException e) { -697 throw e; -698 } catch (Exception e) { -699 throw new StorageException("failed to parse two trees: range=" + range, e); -700 } finally { -701 readUnlock(); -702 } -703 }, repositoryWorker); -704 } -705 -706 private static TreeFilter pathPatternFilterOrTreeFilter(@Nullable String pathPattern) { -707 if (pathPattern == null) { -708 return TreeFilter.ALL; -709 } -710 -711 final PathPatternFilter pathPatternFilter = PathPatternFilter.of(pathPattern); -712 return pathPatternFilter.matchesAll() ? TreeFilter.ALL : pathPatternFilter; -713 } -714 -715 @Override -716 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, -717 Iterable<Change<?>> changes) { -718 final ServiceRequestContext ctx = context(); -719 return CompletableFuture.supplyAsync(() -> { -720 failFastIfTimedOut(this, logger, ctx, "previewDiff", baseRevision); -721 return blockingPreviewDiff(baseRevision, changes); -722 }, repositoryWorker); -723 } -724 -725 private Map<String, Change<?>> blockingPreviewDiff(Revision baseRevision, Iterable<Change<?>> changes) { -726 requireNonNull(baseRevision, "baseRevision"); -727 requireNonNull(changes, "changes"); -728 baseRevision = normalizeNow(baseRevision); -729 -730 readLock(); -731 try (ObjectReader reader = jGitRepository.newObjectReader(); -732 RevWalk revWalk = newRevWalk(reader); -733 DiffFormatter diffFormatter = new DiffFormatter(null)) { -734 -735 final ObjectId baseTreeId = toTree(revWalk, baseRevision); -736 final DirCache dirCache = DirCache.newInCore(); -737 final int numEdits = applyChanges(baseRevision, baseTreeId, dirCache, changes); -738 if (numEdits == 0) { -739 return Collections.emptyMap(); -740 } +120 import com.linecorp.centraldogma.server.storage.repository.FindOption; +121 import com.linecorp.centraldogma.server.storage.repository.FindOptions; +122 import com.linecorp.centraldogma.server.storage.repository.Repository; +123 +124 import difflib.DiffUtils; +125 import difflib.Patch; +126 +127 /** +128 * A {@link Repository} based on Git. +129 */ +130 class GitRepository implements Repository { +131 +132 private static final Logger logger = LoggerFactory.getLogger(GitRepository.class); +133 +134 static final String R_HEADS_MASTER = Constants.R_HEADS + Constants.MASTER; +135 +136 private static final byte[] EMPTY_BYTE = new byte[0]; +137 private static final Pattern CR = Pattern.compile("\r", Pattern.LITERAL); +138 +139 private static final Field revWalkObjectsField; +140 +141 static { +142 final String jgitPomProperties = "META-INF/maven/org.eclipse.jgit/org.eclipse.jgit/pom.properties"; +143 try (InputStream is = SystemReader.class.getClassLoader().getResourceAsStream(jgitPomProperties)) { +144 final Properties props = new Properties(); +145 props.load(is); +146 final Object jgitVersion = props.get("version"); +147 if (jgitVersion != null) { +148 logger.info("Using JGit: {}", jgitVersion); +149 } +150 } catch (IOException e) { +151 logger.debug("Failed to read JGit version", e); +152 } +153 +154 IsolatedSystemReader.install(); +155 +156 Field field = null; +157 try { +158 field = RevWalk.class.getDeclaredField("objects"); +159 if (field.getType() != ObjectIdOwnerMap.class) { +160 throw new IllegalStateException( +161 RevWalk.class.getSimpleName() + ".objects is not an " + +162 ObjectIdOwnerMap.class.getSimpleName() + '.'); +163 } +164 field.setAccessible(true); +165 } catch (NoSuchFieldException e) { +166 throw new IllegalStateException( +167 RevWalk.class.getSimpleName() + ".objects does not exist."); +168 } +169 +170 revWalkObjectsField = field; +171 } +172 +173 private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); +174 private final Project parent; +175 private final Executor repositoryWorker; +176 private final long creationTimeMillis; +177 private final Author author; +178 @VisibleForTesting +179 @Nullable +180 final RepositoryCache cache; +181 private final String name; +182 private final org.eclipse.jgit.lib.Repository jGitRepository; +183 private final CommitIdDatabase commitIdDatabase; +184 @VisibleForTesting +185 final CommitWatchers commitWatchers = new CommitWatchers(); +186 private final AtomicReference<Supplier<CentralDogmaException>> closePending = new AtomicReference<>(); +187 private final CompletableFuture<Void> closeFuture = new CompletableFuture<>(); +188 +189 /** +190 * The current head revision. Initialized by the constructor and updated by commit(). +191 */ +192 private volatile Revision headRevision; +193 +194 /** +195 * Creates a new Git-backed repository. +196 * +197 * @param repoDir the location of this repository +198 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations +199 * @param creationTimeMillis the creation time +200 * @param author the user who initiated the creation of this repository +201 * +202 * @throws StorageException if failed to create a new repository +203 */ +204 @VisibleForTesting +205 GitRepository(Project parent, File repoDir, Executor repositoryWorker, +206 long creationTimeMillis, Author author) { +207 this(parent, repoDir, repositoryWorker, creationTimeMillis, author, null); +208 } +209 +210 /** +211 * Creates a new Git-backed repository. +212 * +213 * @param repoDir the location of this repository +214 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations +215 * @param creationTimeMillis the creation time +216 * @param author the user who initiated the creation of this repository +217 * +218 * @throws StorageException if failed to create a new repository +219 */ +220 GitRepository(Project parent, File repoDir, Executor repositoryWorker, +221 long creationTimeMillis, Author author, @Nullable RepositoryCache cache) { +222 +223 this.parent = requireNonNull(parent, "parent"); +224 name = requireNonNull(repoDir, "repoDir").getName(); +225 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); +226 this.creationTimeMillis = creationTimeMillis; +227 this.author = requireNonNull(author, "author"); +228 this.cache = cache; +229 +230 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir).setBare(); +231 boolean success = false; +232 try { +233 // Create an empty repository with format version 0 first. +234 try (org.eclipse.jgit.lib.Repository initRepo = repositoryBuilder.build()) { +235 if (exist(repoDir)) { +236 throw new StorageException( +237 "failed to create a repository at: " + repoDir + " (exists already)"); +238 } +239 initRepo.create(true); +240 +241 // Save the initial default settings. +242 JGitUtil.applyDefaultsAndSave(initRepo.getConfig()); +243 } +244 +245 // Re-open the repository with the updated settings. +246 jGitRepository = new RepositoryBuilder().setGitDir(repoDir).build(); +247 +248 // Initialize the master branch. +249 final RefUpdate head = jGitRepository.updateRef(Constants.HEAD); +250 head.disableRefLog(); +251 head.link(Constants.R_HEADS + Constants.MASTER); +252 +253 // Initialize the commit ID database. +254 commitIdDatabase = new CommitIdDatabase(jGitRepository); +255 +256 // Insert the initial commit into the master branch. +257 commit0(null, Revision.INIT, creationTimeMillis, author, +258 "Create a new repository", "", Markup.PLAINTEXT, +259 Collections.emptyList(), true); +260 +261 headRevision = Revision.INIT; +262 success = true; +263 } catch (IOException e) { +264 throw new StorageException("failed to create a repository at: " + repoDir, e); +265 } finally { +266 if (!success) { +267 internalClose(); +268 // Failed to create a repository. Remove any cruft so that it is not loaded on the next run. +269 deleteCruft(repoDir); +270 } +271 } +272 } +273 +274 /** +275 * Opens an existing Git-backed repository. +276 * +277 * @param repoDir the location of this repository +278 * @param repositoryWorker the {@link Executor} which will perform the blocking repository operations +279 * +280 * @throws StorageException if failed to open the repository at the specified location +281 */ +282 GitRepository(Project parent, File repoDir, Executor repositoryWorker, @Nullable RepositoryCache cache) { +283 this.parent = requireNonNull(parent, "parent"); +284 name = requireNonNull(repoDir, "repoDir").getName(); +285 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); +286 this.cache = cache; +287 +288 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir).setBare(); +289 try { +290 jGitRepository = repositoryBuilder.build(); +291 if (!exist(repoDir)) { +292 throw new RepositoryNotFoundException(repoDir.toString()); +293 } +294 +295 // Retrieve the repository format. +296 final int formatVersion = jGitRepository.getConfig().getInt( +297 CONFIG_CORE_SECTION, null, CONFIG_KEY_REPO_FORMAT_VERSION, 0); +298 if (formatVersion != JGitUtil.REPO_FORMAT_VERSION) { +299 throw new StorageException("unsupported repository format version: " + formatVersion + +300 " (expected: " + JGitUtil.REPO_FORMAT_VERSION + ')'); +301 } +302 +303 // Update the default settings if necessary. +304 JGitUtil.applyDefaultsAndSave(jGitRepository.getConfig()); +305 } catch (IOException e) { +306 throw new StorageException("failed to open a repository at: " + repoDir, e); +307 } +308 +309 boolean success = false; +310 try { +311 headRevision = uncachedHeadRevision(); +312 commitIdDatabase = new CommitIdDatabase(jGitRepository); +313 if (!headRevision.equals(commitIdDatabase.headRevision())) { +314 commitIdDatabase.rebuild(jGitRepository); +315 assert headRevision.equals(commitIdDatabase.headRevision()); +316 } +317 final Commit initialCommit = blockingHistory(Revision.INIT, Revision.INIT, ALL_PATH, 1).get(0); +318 creationTimeMillis = initialCommit.when(); +319 author = initialCommit.author(); +320 success = true; +321 } finally { +322 if (!success) { +323 internalClose(); +324 } +325 } +326 } +327 +328 private static boolean exist(File repoDir) { +329 try { +330 final RepositoryBuilder repositoryBuilder = new RepositoryBuilder().setGitDir(repoDir); +331 final org.eclipse.jgit.lib.Repository repository = repositoryBuilder.build(); +332 if (repository.getConfig() instanceof FileBasedConfig) { +333 return ((FileBasedConfig) repository.getConfig()).getFile().exists(); +334 } +335 return repository.getDirectory().exists(); +336 } catch (IOException e) { +337 throw new StorageException("failed to check if repository exists at " + repoDir, e); +338 } +339 } +340 +341 /** +342 * Waits until all pending operations are complete and closes this repository. +343 * +344 * @param failureCauseSupplier the {@link Supplier} that creates a new {@link CentralDogmaException} +345 * which will be used to fail the operations issued after this method is called +346 */ +347 void close(Supplier<CentralDogmaException> failureCauseSupplier) { +348 requireNonNull(failureCauseSupplier, "failureCauseSupplier"); +349 if (closePending.compareAndSet(null, failureCauseSupplier)) { +350 repositoryWorker.execute(() -> { +351 // MUST acquire gcLock first to prevent a dead lock +352 rwLock.writeLock().lock(); +353 try { +354 if (commitIdDatabase != null) { +355 try { +356 commitIdDatabase.close(); +357 } catch (Exception e) { +358 logger.warn("Failed to close a commitId database:", e); +359 } +360 } +361 +362 if (jGitRepository != null) { +363 try { +364 jGitRepository.close(); +365 } catch (Exception e) { +366 logger.warn("Failed to close a Git repository: {}", +367 jGitRepository.getDirectory(), e); +368 } +369 } +370 } finally { +371 try { +372 rwLock.writeLock().unlock(); +373 } finally { +374 commitWatchers.close(failureCauseSupplier); +375 closeFuture.complete(null); +376 } +377 } +378 }); +379 } +380 +381 closeFuture.join(); +382 } +383 +384 void internalClose() { +385 close(() -> new CentralDogmaException("should never reach here")); +386 } +387 +388 @Override +389 public org.eclipse.jgit.lib.Repository jGitRepository() { +390 return jGitRepository; +391 } +392 +393 @Override +394 public Project parent() { +395 return parent; +396 } +397 +398 @Override +399 public String name() { +400 return name; +401 } +402 +403 @Override +404 public long creationTimeMillis() { +405 return creationTimeMillis; +406 } +407 +408 @Override +409 public Author author() { +410 return author; +411 } +412 +413 @Override +414 public Revision normalizeNow(Revision revision) { +415 return normalizeNow(revision, cachedHeadRevision().major()); +416 } +417 +418 private static Revision normalizeNow(Revision revision, int baseMajor) { +419 requireNonNull(revision, "revision"); +420 +421 int major = revision.major(); +422 +423 if (major >= 0) { +424 if (major > baseMajor) { +425 throw new RevisionNotFoundException(revision); +426 } +427 } else { +428 major = baseMajor + major + 1; +429 if (major <= 0) { +430 throw new RevisionNotFoundException(revision); +431 } +432 } +433 +434 // Create a new instance only when necessary. +435 if (revision.major() == major) { +436 return revision; +437 } else { +438 return new Revision(major); +439 } +440 } +441 +442 @Override +443 public RevisionRange normalizeNow(Revision from, Revision to) { +444 final int baseMajor = cachedHeadRevision().major(); +445 return new RevisionRange(normalizeNow(from, baseMajor), normalizeNow(to, baseMajor)); +446 } +447 +448 @Override +449 public CompletableFuture<Map<String, Entry<?>>> find( +450 Revision revision, String pathPattern, Map<FindOption<?>, ?> options) { +451 final ServiceRequestContext ctx = context(); +452 return CompletableFuture.supplyAsync(() -> { +453 failFastIfTimedOut(this, logger, ctx, "find", revision, pathPattern, options); +454 return blockingFind(revision, pathPattern, options); +455 }, repositoryWorker); +456 } +457 +458 private Map<String, Entry<?>> blockingFind( +459 Revision revision, String pathPattern, Map<FindOption<?>, ?> options) { +460 +461 requireNonNull(pathPattern, "pathPattern"); +462 requireNonNull(revision, "revision"); +463 requireNonNull(options, "options"); +464 +465 final Revision normRevision = normalizeNow(revision); +466 final boolean fetchContent = FindOption.FETCH_CONTENT.get(options); +467 final int maxEntries = FindOption.MAX_ENTRIES.get(options); +468 +469 readLock(); +470 try (ObjectReader reader = jGitRepository.newObjectReader(); +471 TreeWalk treeWalk = new TreeWalk(reader); +472 RevWalk revWalk = newRevWalk(reader)) { +473 +474 // Query on a non-exist revision will return empty result. +475 final Revision headRevision = cachedHeadRevision(); +476 if (normRevision.compareTo(headRevision) > 0) { +477 return Collections.emptyMap(); +478 } +479 +480 if ("/".equals(pathPattern)) { +481 return Collections.singletonMap(pathPattern, Entry.ofDirectory(normRevision, "/")); +482 } +483 +484 final Map<String, Entry<?>> result = new LinkedHashMap<>(); +485 final ObjectId commitId = commitIdDatabase.get(normRevision); +486 final RevCommit revCommit = revWalk.parseCommit(commitId); +487 final PathPatternFilter filter = PathPatternFilter.of(pathPattern); +488 +489 final RevTree revTree = revCommit.getTree(); +490 treeWalk.addTree(revTree.getId()); +491 while (treeWalk.next() && result.size() < maxEntries) { +492 final boolean matches = filter.matches(treeWalk); +493 final String path = '/' + treeWalk.getPathString(); +494 +495 // Recurse into a directory if necessary. +496 if (treeWalk.isSubtree()) { +497 if (matches) { +498 // Add the directory itself to the result set if its path matches the pattern. +499 result.put(path, Entry.ofDirectory(normRevision, path)); +500 } +501 +502 treeWalk.enterSubtree(); +503 continue; +504 } +505 +506 if (!matches) { +507 continue; +508 } +509 +510 // Build an entry as requested. +511 final Entry<?> entry; +512 final EntryType entryType = EntryType.guessFromPath(path); +513 if (fetchContent) { +514 final byte[] content = reader.open(treeWalk.getObjectId(0)).getBytes(); +515 switch (entryType) { +516 case JSON: +517 final JsonNode jsonNode = Jackson.readTree(content); +518 entry = Entry.ofJson(normRevision, path, jsonNode); +519 break; +520 case TEXT: +521 final String strVal = sanitizeText(new String(content, UTF_8)); +522 entry = Entry.ofText(normRevision, path, strVal); +523 break; +524 default: +525 throw new Error("unexpected entry type: " + entryType); +526 } +527 } else { +528 switch (entryType) { +529 case JSON: +530 entry = Entry.ofJson(normRevision, path, Jackson.nullNode); +531 break; +532 case TEXT: +533 entry = Entry.ofText(normRevision, path, ""); +534 break; +535 default: +536 throw new Error("unexpected entry type: " + entryType); +537 } +538 } +539 +540 result.put(path, entry); +541 } +542 +543 return Util.unsafeCast(result); +544 } catch (CentralDogmaException | IllegalArgumentException e) { +545 throw e; +546 } catch (Exception e) { +547 throw new StorageException( +548 "failed to get data from '" + parent.name() + '/' + name + "' at " + pathPattern + +549 " for " + revision, e); +550 } finally { +551 readUnlock(); +552 } +553 } +554 +555 @Override +556 public CompletableFuture<List<Commit>> history( +557 Revision from, Revision to, String pathPattern, int maxCommits) { +558 +559 final ServiceRequestContext ctx = context(); +560 return CompletableFuture.supplyAsync(() -> { +561 failFastIfTimedOut(this, logger, ctx, "history", from, to, pathPattern, maxCommits); +562 return blockingHistory(from, to, pathPattern, maxCommits); +563 }, repositoryWorker); +564 } +565 +566 private List<Commit> blockingHistory(Revision from, Revision to, String pathPattern, int maxCommits) { +567 requireNonNull(pathPattern, "pathPattern"); +568 requireNonNull(from, "from"); +569 requireNonNull(to, "to"); +570 if (maxCommits <= 0) { +571 throw new IllegalArgumentException("maxCommits: " + maxCommits + " (expected: > 0)"); +572 } +573 +574 maxCommits = Math.min(maxCommits, MAX_MAX_COMMITS); +575 +576 final RevisionRange range = normalizeNow(from, to); +577 final RevisionRange descendingRange = range.toDescending(); +578 +579 // At this point, we are sure: from.major >= to.major +580 readLock(); +581 try (RevWalk revWalk = newRevWalk()) { +582 final ObjectIdOwnerMap<?> revWalkInternalMap = +583 (ObjectIdOwnerMap<?>) revWalkObjectsField.get(revWalk); +584 +585 final ObjectId fromCommitId = commitIdDatabase.get(descendingRange.from()); +586 final ObjectId toCommitId = commitIdDatabase.get(descendingRange.to()); +587 +588 revWalk.markStart(revWalk.parseCommit(fromCommitId)); +589 revWalk.setRetainBody(false); +590 +591 // Instead of relying on RevWalk to filter the commits, +592 // we let RevWalk yield all commits so we can: +593 // - Have more control on when iteration should be stopped. +594 // (A single Iterator.next() doesn't take long.) +595 // - Clean up the internal map as early as possible. +596 final RevFilter filter = new TreeRevFilter(revWalk, AndTreeFilter.create( +597 TreeFilter.ANY_DIFF, PathPatternFilter.of(pathPattern))); +598 +599 // Search up to 1000 commits when maxCommits <= 100. +600 // Search up to (maxCommits * 10) commits when 100 < maxCommits <= 1000. +601 final int maxNumProcessedCommits = Math.max(maxCommits * 10, MAX_MAX_COMMITS); +602 +603 final List<Commit> commitList = new ArrayList<>(); +604 int numProcessedCommits = 0; +605 for (RevCommit revCommit : revWalk) { +606 numProcessedCommits++; +607 +608 if (filter.include(revWalk, revCommit)) { +609 revWalk.parseBody(revCommit); +610 commitList.add(toCommit(revCommit)); +611 revCommit.disposeBody(); +612 } +613 +614 if (revCommit.getId().equals(toCommitId) || +615 commitList.size() >= maxCommits || +616 // Prevent from iterating for too long. +617 numProcessedCommits >= maxNumProcessedCommits) { +618 break; +619 } +620 +621 // Clear the internal lookup table of RevWalk to reduce the memory usage. +622 // This is safe because we have linear history and traverse in one direction. +623 if (numProcessedCommits % 16 == 0) { +624 revWalkInternalMap.clear(); +625 } +626 } +627 +628 // Include the initial empty commit only when the caller specified +629 // the initial revision (1) in the range and the pathPattern contains '/**'. +630 if (commitList.size() < maxCommits && +631 descendingRange.to().major() == 1 && +632 pathPattern.contains(ALL_PATH)) { +633 try (RevWalk tmpRevWalk = newRevWalk()) { +634 final RevCommit lastRevCommit = tmpRevWalk.parseCommit(toCommitId); +635 commitList.add(toCommit(lastRevCommit)); +636 } +637 } +638 +639 if (!descendingRange.equals(range)) { // from and to is swapped so reverse the list. +640 Collections.reverse(commitList); +641 } +642 +643 return commitList; +644 } catch (CentralDogmaException e) { +645 throw e; +646 } catch (Exception e) { +647 throw new StorageException( +648 "failed to retrieve the history: " + parent.name() + '/' + name + +649 " (" + pathPattern + ", " + from + ".." + to + ')', e); +650 } finally { +651 readUnlock(); +652 } +653 } +654 +655 private static Commit toCommit(RevCommit revCommit) { +656 final Author author; +657 final PersonIdent committerIdent = revCommit.getCommitterIdent(); +658 final long when; +659 if (committerIdent == null) { +660 author = Author.UNKNOWN; +661 when = 0; +662 } else { +663 author = new Author(committerIdent.getName(), committerIdent.getEmailAddress()); +664 when = committerIdent.getWhen().getTime(); +665 } +666 +667 try { +668 return CommitUtil.newCommit(author, when, revCommit.getFullMessage()); +669 } catch (Exception e) { +670 throw new StorageException("failed to create a Commit", e); +671 } +672 } +673 +674 /** +675 * Get the diff between any two valid revisions. +676 * +677 * @param from revision from +678 * @param to revision to +679 * @param pathPattern target path pattern +680 * @return the map of changes mapped by path +681 * @throws StorageException if {@code from} or {@code to} does not exist. +682 */ +683 @Override +684 public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern) { +685 final ServiceRequestContext ctx = context(); +686 return CompletableFuture.supplyAsync(() -> { +687 requireNonNull(from, "from"); +688 requireNonNull(to, "to"); +689 requireNonNull(pathPattern, "pathPattern"); +690 +691 failFastIfTimedOut(this, logger, ctx, "diff", from, to, pathPattern); +692 +693 final RevisionRange range = normalizeNow(from, to).toAscending(); +694 readLock(); +695 try (RevWalk rw = newRevWalk()) { +696 final RevTree treeA = rw.parseTree(commitIdDatabase.get(range.from())); +697 final RevTree treeB = rw.parseTree(commitIdDatabase.get(range.to())); +698 +699 // Compare the two Git trees. +700 // Note that we do not cache here because CachingRepository caches the final result already. +701 return toChangeMap(blockingCompareTreesUncached(treeA, treeB, +702 pathPatternFilterOrTreeFilter(pathPattern))); +703 } catch (StorageException e) { +704 throw e; +705 } catch (Exception e) { +706 throw new StorageException("failed to parse two trees: range=" + range, e); +707 } finally { +708 readUnlock(); +709 } +710 }, repositoryWorker); +711 } +712 +713 private static TreeFilter pathPatternFilterOrTreeFilter(@Nullable String pathPattern) { +714 if (pathPattern == null) { +715 return TreeFilter.ALL; +716 } +717 +718 final PathPatternFilter pathPatternFilter = PathPatternFilter.of(pathPattern); +719 return pathPatternFilter.matchesAll() ? TreeFilter.ALL : pathPatternFilter; +720 } +721 +722 @Override +723 public CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, +724 Iterable<Change<?>> changes) { +725 final ServiceRequestContext ctx = context(); +726 return CompletableFuture.supplyAsync(() -> { +727 failFastIfTimedOut(this, logger, ctx, "previewDiff", baseRevision); +728 return blockingPreviewDiff(baseRevision, changes); +729 }, repositoryWorker); +730 } +731 +732 private Map<String, Change<?>> blockingPreviewDiff(Revision baseRevision, Iterable<Change<?>> changes) { +733 requireNonNull(baseRevision, "baseRevision"); +734 requireNonNull(changes, "changes"); +735 baseRevision = normalizeNow(baseRevision); +736 +737 readLock(); +738 try (ObjectReader reader = jGitRepository.newObjectReader(); +739 RevWalk revWalk = newRevWalk(reader); +740 DiffFormatter diffFormatter = new DiffFormatter(null)) { 741 -742 final CanonicalTreeParser p = new CanonicalTreeParser(); -743 p.reset(reader, baseTreeId); -744 diffFormatter.setRepository(jGitRepository); -745 final List<DiffEntry> result = diffFormatter.scan(p, new DirCacheIterator(dirCache)); -746 return toChangeMap(result, DiffResultType.NORMAL); -747 } catch (IOException e) { -748 throw new StorageException("failed to perform a dry-run diff", e); -749 } finally { -750 readUnlock(); -751 } -752 } -753 -754 private Map<String, Change<?>> toChangeMap(List<DiffEntry> diffEntryList, DiffResultType diffResultType) { -755 try (ObjectReader reader = jGitRepository.newObjectReader()) { -756 final Map<String, Change<?>> changeMap = new LinkedHashMap<>(); -757 -758 for (DiffEntry diffEntry : diffEntryList) { -759 final String oldPath = '/' + diffEntry.getOldPath(); -760 final String newPath = '/' + diffEntry.getNewPath(); -761 -762 switch (diffEntry.getChangeType()) { -763 case MODIFY: -764 final EntryType oldEntryType = EntryType.guessFromPath(oldPath); -765 switch (oldEntryType) { -766 case JSON: -767 if (!oldPath.equals(newPath)) { -768 putChange(changeMap, oldPath, Change.ofRename(oldPath, newPath)); -769 } -770 -771 final JsonNode oldJsonNode = -772 Jackson.readTree( -773 reader.open(diffEntry.getOldId().toObjectId()).getBytes()); -774 final JsonNode newJsonNode = -775 Jackson.readTree( -776 reader.open(diffEntry.getNewId().toObjectId()).getBytes()); -777 final JsonPatch patch = -778 JsonPatch.generate(oldJsonNode, newJsonNode, ReplaceMode.SAFE); -779 -780 if (!patch.isEmpty()) { -781 if (diffResultType == DiffResultType.PATCH_TO_UPSERT) { -782 putChange(changeMap, newPath, -783 Change.ofJsonUpsert(newPath, newJsonNode)); -784 } else { -785 putChange(changeMap, newPath, -786 Change.ofJsonPatch(newPath, Jackson.valueToTree(patch))); -787 } -788 } -789 break; -790 case TEXT: -791 final String oldText = sanitizeText(new String( -792 reader.open(diffEntry.getOldId().toObjectId()).getBytes(), UTF_8)); -793 -794 final String newText = sanitizeText(new String( -795 reader.open(diffEntry.getNewId().toObjectId()).getBytes(), UTF_8)); -796 -797 if (!oldPath.equals(newPath)) { -798 putChange(changeMap, oldPath, Change.ofRename(oldPath, newPath)); -799 } -800 -801 if (!oldText.equals(newText)) { -802 if (diffResultType == DiffResultType.PATCH_TO_UPSERT) { -803 putChange(changeMap, newPath, Change.ofTextUpsert(newPath, newText)); -804 } else { -805 putChange(changeMap, newPath, -806 Change.ofTextPatch(newPath, oldText, newText)); -807 } -808 } -809 break; -810 default: -811 throw new Error("unexpected old entry type: " + oldEntryType); -812 } -813 break; -814 case ADD: -815 final EntryType newEntryType = EntryType.guessFromPath(newPath); -816 switch (newEntryType) { -817 case JSON: { -818 final JsonNode jsonNode = Jackson.readTree( -819 reader.open(diffEntry.getNewId().toObjectId()).getBytes()); -820 -821 putChange(changeMap, newPath, Change.ofJsonUpsert(newPath, jsonNode)); -822 break; -823 } -824 case TEXT: { -825 final String text = sanitizeText(new String( -826 reader.open(diffEntry.getNewId().toObjectId()).getBytes(), UTF_8)); -827 -828 putChange(changeMap, newPath, Change.ofTextUpsert(newPath, text)); -829 break; -830 } -831 default: -832 throw new Error("unexpected new entry type: " + newEntryType); -833 } -834 break; -835 case DELETE: -836 putChange(changeMap, oldPath, Change.ofRemoval(oldPath)); -837 break; -838 default: -839 throw new Error(); -840 } -841 } -842 return changeMap; -843 } catch (Exception e) { -844 throw new StorageException("failed to convert list of DiffEntry to Changes map", e); -845 } -846 } -847 -848 private static void putChange(Map<String, Change<?>> changeMap, String path, Change<?> change) { -849 final Change<?> oldChange = changeMap.put(path, change); -850 assert oldChange == null; -851 } -852 -853 @Override -854 public CompletableFuture<CommitResult> commit( -855 Revision baseRevision, long commitTimeMillis, Author author, String summary, -856 String detail, Markup markup, Iterable<Change<?>> changes, boolean directExecution) { -857 requireNonNull(baseRevision, "baseRevision"); -858 requireNonNull(author, "author"); -859 requireNonNull(summary, "summary"); -860 requireNonNull(detail, "detail"); -861 requireNonNull(markup, "markup"); -862 requireNonNull(changes, "changes"); -863 -864 final ServiceRequestContext ctx = context(); -865 return CompletableFuture.supplyAsync(() -> { -866 failFastIfTimedOut(this, logger, ctx, "commit", baseRevision, author, summary); -867 return blockingCommit(baseRevision, commitTimeMillis, -868 author, summary, detail, markup, changes, false, directExecution); -869 }, repositoryWorker); -870 } -871 -872 private CommitResult blockingCommit( -873 Revision baseRevision, long commitTimeMillis, Author author, String summary, -874 String detail, Markup markup, Iterable<Change<?>> changes, boolean allowEmptyCommit, -875 boolean directExecution) { +742 final ObjectId baseTreeId = toTree(revWalk, baseRevision); +743 final DirCache dirCache = DirCache.newInCore(); +744 final int numEdits = applyChanges(baseRevision, baseTreeId, dirCache, changes); +745 if (numEdits == 0) { +746 return Collections.emptyMap(); +747 } +748 +749 final CanonicalTreeParser p = new CanonicalTreeParser(); +750 p.reset(reader, baseTreeId); +751 diffFormatter.setRepository(jGitRepository); +752 final List<DiffEntry> result = diffFormatter.scan(p, new DirCacheIterator(dirCache)); +753 return toChangeMap(result); +754 } catch (IOException e) { +755 throw new StorageException("failed to perform a dry-run diff", e); +756 } finally { +757 readUnlock(); +758 } +759 } +760 +761 private Map<String, Change<?>> toChangeMap(List<DiffEntry> diffEntryList) { +762 try (ObjectReader reader = jGitRepository.newObjectReader()) { +763 final Map<String, Change<?>> changeMap = new LinkedHashMap<>(); +764 +765 for (DiffEntry diffEntry : diffEntryList) { +766 final String oldPath = '/' + diffEntry.getOldPath(); +767 final String newPath = '/' + diffEntry.getNewPath(); +768 +769 switch (diffEntry.getChangeType()) { +770 case MODIFY: +771 final EntryType oldEntryType = EntryType.guessFromPath(oldPath); +772 switch (oldEntryType) { +773 case JSON: +774 if (!oldPath.equals(newPath)) { +775 putChange(changeMap, oldPath, Change.ofRename(oldPath, newPath)); +776 } +777 +778 final JsonNode oldJsonNode = +779 Jackson.readTree( +780 reader.open(diffEntry.getOldId().toObjectId()).getBytes()); +781 final JsonNode newJsonNode = +782 Jackson.readTree( +783 reader.open(diffEntry.getNewId().toObjectId()).getBytes()); +784 final JsonPatch patch = +785 JsonPatch.generate(oldJsonNode, newJsonNode, ReplaceMode.SAFE); +786 +787 if (!patch.isEmpty()) { +788 putChange(changeMap, newPath, +789 Change.ofJsonPatch(newPath, Jackson.valueToTree(patch))); +790 } +791 break; +792 case TEXT: +793 final String oldText = sanitizeText(new String( +794 reader.open(diffEntry.getOldId().toObjectId()).getBytes(), UTF_8)); +795 +796 final String newText = sanitizeText(new String( +797 reader.open(diffEntry.getNewId().toObjectId()).getBytes(), UTF_8)); +798 +799 if (!oldPath.equals(newPath)) { +800 putChange(changeMap, oldPath, Change.ofRename(oldPath, newPath)); +801 } +802 +803 if (!oldText.equals(newText)) { +804 putChange(changeMap, newPath, +805 Change.ofTextPatch(newPath, oldText, newText)); +806 } +807 break; +808 default: +809 throw new Error("unexpected old entry type: " + oldEntryType); +810 } +811 break; +812 case ADD: +813 final EntryType newEntryType = EntryType.guessFromPath(newPath); +814 switch (newEntryType) { +815 case JSON: { +816 final JsonNode jsonNode = Jackson.readTree( +817 reader.open(diffEntry.getNewId().toObjectId()).getBytes()); +818 +819 putChange(changeMap, newPath, Change.ofJsonUpsert(newPath, jsonNode)); +820 break; +821 } +822 case TEXT: { +823 final String text = sanitizeText(new String( +824 reader.open(diffEntry.getNewId().toObjectId()).getBytes(), UTF_8)); +825 +826 putChange(changeMap, newPath, Change.ofTextUpsert(newPath, text)); +827 break; +828 } +829 default: +830 throw new Error("unexpected new entry type: " + newEntryType); +831 } +832 break; +833 case DELETE: +834 putChange(changeMap, oldPath, Change.ofRemoval(oldPath)); +835 break; +836 default: +837 throw new Error(); +838 } +839 } +840 return changeMap; +841 } catch (Exception e) { +842 throw new StorageException("failed to convert list of DiffEntry to Changes map", e); +843 } +844 } +845 +846 private static void putChange(Map<String, Change<?>> changeMap, String path, Change<?> change) { +847 final Change<?> oldChange = changeMap.put(path, change); +848 assert oldChange == null; +849 } +850 +851 @Override +852 public CompletableFuture<CommitResult> commit( +853 Revision baseRevision, long commitTimeMillis, Author author, String summary, +854 String detail, Markup markup, Iterable<Change<?>> changes, boolean directExecution) { +855 requireNonNull(baseRevision, "baseRevision"); +856 requireNonNull(author, "author"); +857 requireNonNull(summary, "summary"); +858 requireNonNull(detail, "detail"); +859 requireNonNull(markup, "markup"); +860 requireNonNull(changes, "changes"); +861 +862 final ServiceRequestContext ctx = context(); +863 return CompletableFuture.supplyAsync(() -> { +864 failFastIfTimedOut(this, logger, ctx, "commit", baseRevision, author, summary); +865 return blockingCommit(baseRevision, commitTimeMillis, +866 author, summary, detail, markup, changes, false, directExecution); +867 }, repositoryWorker); +868 } +869 +870 private CommitResult blockingCommit( +871 Revision baseRevision, long commitTimeMillis, Author author, String summary, +872 String detail, Markup markup, Iterable<Change<?>> changes, boolean allowEmptyCommit, +873 boolean directExecution) { +874 +875 requireNonNull(baseRevision, "baseRevision"); 876 -877 requireNonNull(baseRevision, "baseRevision"); -878 -879 final RevisionAndEntries res; -880 final Iterable<Change<?>> applyingChanges; -881 writeLock(); -882 try { -883 final Revision normBaseRevision = normalizeNow(baseRevision); -884 final Revision headRevision = cachedHeadRevision(); -885 if (headRevision.major() != normBaseRevision.major()) { -886 throw new ChangeConflictException( -887 "invalid baseRevision: " + baseRevision + " (expected: " + headRevision + -888 " or equivalent)"); -889 } -890 -891 if (directExecution) { -892 applyingChanges = blockingPreviewDiff(normBaseRevision, changes).values(); -893 } else { -894 applyingChanges = changes; -895 } -896 res = commit0(headRevision, headRevision.forward(1), commitTimeMillis, -897 author, summary, detail, markup, applyingChanges, allowEmptyCommit); -898 -899 this.headRevision = res.revision; -900 } finally { -901 writeUnLock(); -902 } -903 -904 // Note that the notification is made while no lock is held to avoid the risk of a dead lock. -905 notifyWatchers(res.revision, res.diffEntries); -906 return CommitResult.of(res.revision, applyingChanges); -907 } -908 -909 private RevisionAndEntries commit0(@Nullable Revision prevRevision, Revision nextRevision, -910 long commitTimeMillis, Author author, String summary, -911 String detail, Markup markup, -912 Iterable<Change<?>> changes, boolean allowEmpty) { -913 -914 requireNonNull(author, "author"); -915 requireNonNull(summary, "summary"); -916 requireNonNull(changes, "changes"); -917 requireNonNull(detail, "detail"); -918 requireNonNull(markup, "markup"); -919 -920 assert prevRevision == null || prevRevision.major() > 0; -921 assert nextRevision.major() > 0; -922 -923 try (ObjectInserter inserter = jGitRepository.newObjectInserter(); -924 ObjectReader reader = jGitRepository.newObjectReader(); -925 RevWalk revWalk = newRevWalk(reader)) { +877 final RevisionAndEntries res; +878 final Iterable<Change<?>> applyingChanges; +879 writeLock(); +880 try { +881 final Revision normBaseRevision = normalizeNow(baseRevision); +882 final Revision headRevision = cachedHeadRevision(); +883 if (headRevision.major() != normBaseRevision.major()) { +884 throw new ChangeConflictException( +885 "invalid baseRevision: " + baseRevision + " (expected: " + headRevision + +886 " or equivalent)"); +887 } +888 +889 if (directExecution) { +890 applyingChanges = blockingPreviewDiff(normBaseRevision, changes).values(); +891 } else { +892 applyingChanges = changes; +893 } +894 res = commit0(headRevision, headRevision.forward(1), commitTimeMillis, +895 author, summary, detail, markup, applyingChanges, allowEmptyCommit); +896 +897 this.headRevision = res.revision; +898 } finally { +899 writeUnLock(); +900 } +901 +902 // Note that the notification is made while no lock is held to avoid the risk of a dead lock. +903 notifyWatchers(res.revision, res.diffEntries); +904 return CommitResult.of(res.revision, applyingChanges); +905 } +906 +907 private RevisionAndEntries commit0(@Nullable Revision prevRevision, Revision nextRevision, +908 long commitTimeMillis, Author author, String summary, +909 String detail, Markup markup, +910 Iterable<Change<?>> changes, boolean allowEmpty) { +911 +912 requireNonNull(author, "author"); +913 requireNonNull(summary, "summary"); +914 requireNonNull(changes, "changes"); +915 requireNonNull(detail, "detail"); +916 requireNonNull(markup, "markup"); +917 +918 assert prevRevision == null || prevRevision.major() > 0; +919 assert nextRevision.major() > 0; +920 +921 try (ObjectInserter inserter = jGitRepository.newObjectInserter(); +922 ObjectReader reader = jGitRepository.newObjectReader(); +923 RevWalk revWalk = newRevWalk(reader)) { +924 +925 final ObjectId prevTreeId = prevRevision != null ? toTree(revWalk, prevRevision) : null; 926 -927 final ObjectId prevTreeId = prevRevision != null ? toTree(revWalk, prevRevision) : null; -928 -929 // The staging area that keeps the entries of the new tree. -930 // It starts with the entries of the tree at the prevRevision (or with no entries if the -931 // prevRevision is the initial commit), and then this method will apply the requested changes -932 // to build the new tree. -933 final DirCache dirCache = DirCache.newInCore(); -934 -935 // Apply the changes and retrieve the list of the affected files. -936 final int numEdits = applyChanges(prevRevision, prevTreeId, dirCache, changes); -937 -938 // Reject empty commit if necessary. -939 final List<DiffEntry> diffEntries; -940 boolean isEmpty = numEdits == 0; -941 if (!isEmpty) { -942 // Even if there are edits, the resulting tree might be identical with the previous tree. -943 final CanonicalTreeParser p = new CanonicalTreeParser(); -944 p.reset(reader, prevTreeId); -945 final DiffFormatter diffFormatter = new DiffFormatter(null); -946 diffFormatter.setRepository(jGitRepository); -947 diffEntries = diffFormatter.scan(p, new DirCacheIterator(dirCache)); -948 isEmpty = diffEntries.isEmpty(); -949 } else { -950 diffEntries = ImmutableList.of(); -951 } -952 -953 if (!allowEmpty && isEmpty) { -954 throw new RedundantChangeException( -955 "changes did not change anything in " + parent().name() + '/' + name() + -956 " at revision " + (prevRevision != null ? prevRevision.major() : 0) + -957 ": " + changes); -958 } -959 -960 // flush the current index to repository and get the result tree object id. -961 final ObjectId nextTreeId = dirCache.writeTree(inserter); -962 -963 // build a commit object -964 final PersonIdent personIdent = new PersonIdent(author.name(), author.email(), -965 commitTimeMillis / 1000L * 1000L, 0); +927 // The staging area that keeps the entries of the new tree. +928 // It starts with the entries of the tree at the prevRevision (or with no entries if the +929 // prevRevision is the initial commit), and then this method will apply the requested changes +930 // to build the new tree. +931 final DirCache dirCache = DirCache.newInCore(); +932 +933 // Apply the changes and retrieve the list of the affected files. +934 final int numEdits = applyChanges(prevRevision, prevTreeId, dirCache, changes); +935 +936 // Reject empty commit if necessary. +937 final List<DiffEntry> diffEntries; +938 boolean isEmpty = numEdits == 0; +939 if (!isEmpty) { +940 // Even if there are edits, the resulting tree might be identical with the previous tree. +941 final CanonicalTreeParser p = new CanonicalTreeParser(); +942 p.reset(reader, prevTreeId); +943 final DiffFormatter diffFormatter = new DiffFormatter(null); +944 diffFormatter.setRepository(jGitRepository); +945 diffEntries = diffFormatter.scan(p, new DirCacheIterator(dirCache)); +946 isEmpty = diffEntries.isEmpty(); +947 } else { +948 diffEntries = ImmutableList.of(); +949 } +950 +951 if (!allowEmpty && isEmpty) { +952 throw new RedundantChangeException( +953 "changes did not change anything in " + parent().name() + '/' + name() + +954 " at revision " + (prevRevision != null ? prevRevision.major() : 0) + +955 ": " + changes); +956 } +957 +958 // flush the current index to repository and get the result tree object id. +959 final ObjectId nextTreeId = dirCache.writeTree(inserter); +960 +961 // build a commit object +962 final PersonIdent personIdent = new PersonIdent(author.name(), author.email(), +963 commitTimeMillis / 1000L * 1000L, 0); +964 +965 final CommitBuilder commitBuilder = new CommitBuilder(); 966 -967 final CommitBuilder commitBuilder = new CommitBuilder(); -968 -969 commitBuilder.setAuthor(personIdent); -970 commitBuilder.setCommitter(personIdent); -971 commitBuilder.setTreeId(nextTreeId); -972 commitBuilder.setEncoding(UTF_8); -973 -974 // Write summary, detail and revision to commit's message as JSON format. -975 commitBuilder.setMessage(CommitUtil.toJsonString(summary, detail, markup, nextRevision)); -976 -977 // if the head commit exists, use it as the parent commit. -978 if (prevRevision != null) { -979 commitBuilder.setParentId(commitIdDatabase.get(prevRevision)); -980 } -981 -982 final ObjectId nextCommitId = inserter.insert(commitBuilder); -983 inserter.flush(); -984 -985 // tagging the revision object, for history lookup purpose. -986 commitIdDatabase.put(nextRevision, nextCommitId); -987 doRefUpdate(revWalk, R_HEADS_MASTER, nextCommitId); -988 -989 return new RevisionAndEntries(nextRevision, diffEntries); -990 } catch (CentralDogmaException | IllegalArgumentException e) { -991 throw e; -992 } catch (Exception e) { -993 throw new StorageException("failed to push at '" + parent.name() + '/' + name + '\'', e); -994 } -995 } -996 -997 private int applyChanges(@Nullable Revision baseRevision, @Nullable ObjectId baseTreeId, DirCache dirCache, -998 Iterable<Change<?>> changes) { +967 commitBuilder.setAuthor(personIdent); +968 commitBuilder.setCommitter(personIdent); +969 commitBuilder.setTreeId(nextTreeId); +970 commitBuilder.setEncoding(UTF_8); +971 +972 // Write summary, detail and revision to commit's message as JSON format. +973 commitBuilder.setMessage(CommitUtil.toJsonString(summary, detail, markup, nextRevision)); +974 +975 // if the head commit exists, use it as the parent commit. +976 if (prevRevision != null) { +977 commitBuilder.setParentId(commitIdDatabase.get(prevRevision)); +978 } +979 +980 final ObjectId nextCommitId = inserter.insert(commitBuilder); +981 inserter.flush(); +982 +983 // tagging the revision object, for history lookup purpose. +984 commitIdDatabase.put(nextRevision, nextCommitId); +985 doRefUpdate(revWalk, R_HEADS_MASTER, nextCommitId); +986 +987 return new RevisionAndEntries(nextRevision, diffEntries); +988 } catch (CentralDogmaException | IllegalArgumentException e) { +989 throw e; +990 } catch (Exception e) { +991 throw new StorageException("failed to push at '" + parent.name() + '/' + name + '\'', e); +992 } +993 } +994 +995 private int applyChanges(@Nullable Revision baseRevision, @Nullable ObjectId baseTreeId, DirCache dirCache, +996 Iterable<Change<?>> changes) { +997 +998 int numEdits = 0; 999 -1000 int numEdits = 0; -1001 -1002 try (ObjectInserter inserter = jGitRepository.newObjectInserter(); -1003 ObjectReader reader = jGitRepository.newObjectReader()) { -1004 -1005 if (baseTreeId != null) { -1006 // the DirCacheBuilder is to used for doing update operations on the given DirCache object -1007 final DirCacheBuilder builder = dirCache.builder(); -1008 -1009 // Add the tree object indicated by the prevRevision to the temporary DirCache object. -1010 builder.addTree(EMPTY_BYTE, 0, reader, baseTreeId); -1011 builder.finish(); -1012 } -1013 -1014 // loop over the specified changes. -1015 for (Change<?> change : changes) { -1016 final String changePath = change.path().substring(1); // Strip the leading '/'. -1017 final DirCacheEntry oldEntry = dirCache.getEntry(changePath); -1018 final byte[] oldContent = oldEntry != null ? reader.open(oldEntry.getObjectId()).getBytes() -1019 : null; -1020 -1021 switch (change.type()) { -1022 case UPSERT_JSON: { -1023 final JsonNode oldJsonNode = oldContent != null ? Jackson.readTree(oldContent) : null; -1024 final JsonNode newJsonNode = firstNonNull((JsonNode) change.content(), -1025 JsonNodeFactory.instance.nullNode()); -1026 -1027 // Upsert only when the contents are really different. -1028 if (!Objects.equals(newJsonNode, oldJsonNode)) { -1029 applyPathEdit(dirCache, new InsertJson(changePath, inserter, newJsonNode)); -1030 numEdits++; -1031 } -1032 break; -1033 } -1034 case UPSERT_TEXT: { -1035 final String sanitizedOldText; -1036 if (oldContent != null) { -1037 sanitizedOldText = sanitizeText(new String(oldContent, UTF_8)); -1038 } else { -1039 sanitizedOldText = null; -1040 } +1000 try (ObjectInserter inserter = jGitRepository.newObjectInserter(); +1001 ObjectReader reader = jGitRepository.newObjectReader()) { +1002 +1003 if (baseTreeId != null) { +1004 // the DirCacheBuilder is to used for doing update operations on the given DirCache object +1005 final DirCacheBuilder builder = dirCache.builder(); +1006 +1007 // Add the tree object indicated by the prevRevision to the temporary DirCache object. +1008 builder.addTree(EMPTY_BYTE, 0, reader, baseTreeId); +1009 builder.finish(); +1010 } +1011 +1012 // loop over the specified changes. +1013 for (Change<?> change : changes) { +1014 final String changePath = change.path().substring(1); // Strip the leading '/'. +1015 final DirCacheEntry oldEntry = dirCache.getEntry(changePath); +1016 final byte[] oldContent = oldEntry != null ? reader.open(oldEntry.getObjectId()).getBytes() +1017 : null; +1018 +1019 switch (change.type()) { +1020 case UPSERT_JSON: { +1021 final JsonNode oldJsonNode = oldContent != null ? Jackson.readTree(oldContent) : null; +1022 final JsonNode newJsonNode = firstNonNull((JsonNode) change.content(), +1023 JsonNodeFactory.instance.nullNode()); +1024 +1025 // Upsert only when the contents are really different. +1026 if (!Objects.equals(newJsonNode, oldJsonNode)) { +1027 applyPathEdit(dirCache, new InsertJson(changePath, inserter, newJsonNode)); +1028 numEdits++; +1029 } +1030 break; +1031 } +1032 case UPSERT_TEXT: { +1033 final String sanitizedOldText; +1034 if (oldContent != null) { +1035 sanitizedOldText = sanitizeText(new String(oldContent, UTF_8)); +1036 } else { +1037 sanitizedOldText = null; +1038 } +1039 +1040 final String sanitizedNewText = sanitizeText(change.contentAsText()); 1041 -1042 final String sanitizedNewText = sanitizeText(change.contentAsText()); -1043 -1044 // Upsert only when the contents are really different. -1045 if (!sanitizedNewText.equals(sanitizedOldText)) { -1046 applyPathEdit(dirCache, new InsertText(changePath, inserter, sanitizedNewText)); -1047 numEdits++; -1048 } -1049 break; -1050 } -1051 case REMOVE: -1052 if (oldEntry != null) { -1053 applyPathEdit(dirCache, new DeletePath(changePath)); -1054 numEdits++; -1055 break; -1056 } -1057 -1058 // The path might be a directory. -1059 if (applyDirectoryEdits(dirCache, changePath, null, change)) { -1060 numEdits++; -1061 } else { -1062 // Was not a directory either; conflict. -1063 reportNonExistentEntry(change); -1064 break; -1065 } -1066 break; -1067 case RENAME: { -1068 final String newPath = -1069 ((String) change.content()).substring(1); // Strip the leading '/'. -1070 -1071 if (dirCache.getEntry(newPath) != null) { -1072 throw new ChangeConflictException("a file exists at the target path: " + change); -1073 } -1074 -1075 if (oldEntry != null) { -1076 if (changePath.equals(newPath)) { -1077 // Redundant rename request - old path and new path are same. -1078 break; -1079 } -1080 -1081 final DirCacheEditor editor = dirCache.editor(); -1082 editor.add(new DeletePath(changePath)); -1083 editor.add(new CopyOldEntry(newPath, oldEntry)); -1084 editor.finish(); -1085 numEdits++; -1086 break; -1087 } -1088 -1089 // The path might be a directory. -1090 if (applyDirectoryEdits(dirCache, changePath, newPath, change)) { -1091 numEdits++; -1092 } else { -1093 // Was not a directory either; conflict. -1094 reportNonExistentEntry(change); -1095 } -1096 break; -1097 } -1098 case APPLY_JSON_PATCH: { -1099 final JsonNode oldJsonNode; -1100 if (oldContent != null) { -1101 oldJsonNode = Jackson.readTree(oldContent); -1102 } else { -1103 oldJsonNode = Jackson.nullNode; -1104 } -1105 -1106 final JsonNode newJsonNode; -1107 try { -1108 newJsonNode = JsonPatch.fromJson((JsonNode) change.content()).apply(oldJsonNode); -1109 } catch (Exception e) { -1110 throw new ChangeConflictException("failed to apply JSON patch: " + change, e); -1111 } -1112 -1113 // Apply only when the contents are really different. -1114 if (!newJsonNode.equals(oldJsonNode)) { -1115 applyPathEdit(dirCache, new InsertJson(changePath, inserter, newJsonNode)); -1116 numEdits++; -1117 } -1118 break; -1119 } -1120 case APPLY_TEXT_PATCH: -1121 final Patch<String> patch = DiffUtils.parseUnifiedDiff( -1122 Util.stringToLines(sanitizeText((String) change.content()))); -1123 -1124 final String sanitizedOldText; -1125 final List<String> sanitizedOldTextLines; -1126 if (oldContent != null) { -1127 sanitizedOldText = sanitizeText(new String(oldContent, UTF_8)); -1128 sanitizedOldTextLines = Util.stringToLines(sanitizedOldText); -1129 } else { -1130 sanitizedOldText = null; -1131 sanitizedOldTextLines = Collections.emptyList(); -1132 } -1133 -1134 final String newText; -1135 try { -1136 final List<String> newTextLines = DiffUtils.patch(sanitizedOldTextLines, patch); -1137 if (newTextLines.isEmpty()) { -1138 newText = ""; -1139 } else { -1140 final StringJoiner joiner = new StringJoiner("\n", "", "\n"); -1141 for (String line : newTextLines) { -1142 joiner.add(line); -1143 } -1144 newText = joiner.toString(); -1145 } -1146 } catch (Exception e) { -1147 throw new ChangeConflictException("failed to apply text patch: " + change, e); -1148 } -1149 -1150 // Apply only when the contents are really different. -1151 if (!newText.equals(sanitizedOldText)) { -1152 applyPathEdit(dirCache, new InsertText(changePath, inserter, newText)); -1153 numEdits++; -1154 } -1155 break; -1156 } -1157 } -1158 } catch (CentralDogmaException | IllegalArgumentException e) { -1159 throw e; -1160 } catch (Exception e) { -1161 throw new StorageException("failed to apply changes on revision " + baseRevision, e); -1162 } -1163 return numEdits; -1164 } -1165 -1166 /** -1167 * Removes {@code \r} and appends {@code \n} on the last line if it does not end with {@code \n}. -1168 */ -1169 private static String sanitizeText(String text) { -1170 if (text.indexOf('\r') >= 0) { -1171 text = CR.matcher(text).replaceAll(""); -1172 } -1173 if (!text.isEmpty() && !text.endsWith("\n")) { -1174 text += "\n"; -1175 } -1176 return text; -1177 } -1178 -1179 private static void reportNonExistentEntry(Change<?> change) { -1180 throw new ChangeConflictException("non-existent file/directory: " + change); -1181 } -1182 -1183 private static void applyPathEdit(DirCache dirCache, PathEdit edit) { -1184 final DirCacheEditor e = dirCache.editor(); -1185 e.add(edit); -1186 e.finish(); -1187 } -1188 -1189 /** -1190 * Applies recursive directory edits. -1191 * -1192 * @param oldDir the path to the directory to make a recursive change -1193 * @param newDir the path to the renamed directory, or {@code null} to remove the directory. -1194 * -1195 * @return {@code true} if any edits were made to {@code dirCache}, {@code false} otherwise -1196 */ -1197 private static boolean applyDirectoryEdits(DirCache dirCache, -1198 String oldDir, @Nullable String newDir, Change<?> change) { -1199 -1200 if (!oldDir.endsWith("/")) { -1201 oldDir += '/'; -1202 } -1203 if (newDir != null && !newDir.endsWith("/")) { -1204 newDir += '/'; -1205 } -1206 -1207 final byte[] rawOldDir = Constants.encode(oldDir); -1208 final byte[] rawNewDir = newDir != null ? Constants.encode(newDir) : null; -1209 final int numEntries = dirCache.getEntryCount(); -1210 DirCacheEditor editor = null; -1211 -1212 loop: -1213 for (int i = 0; i < numEntries; i++) { -1214 final DirCacheEntry e = dirCache.getEntry(i); -1215 final byte[] rawPath = e.getRawPath(); -1216 -1217 // Ensure that there are no entries under the newDir; we have a conflict otherwise. -1218 if (rawNewDir != null) { -1219 boolean conflict = true; -1220 if (rawPath.length > rawNewDir.length) { -1221 // Check if there is a file whose path starts with 'newDir'. -1222 for (int j = 0; j < rawNewDir.length; j++) { -1223 if (rawNewDir[j] != rawPath[j]) { -1224 conflict = false; -1225 break; -1226 } -1227 } -1228 } else if (rawPath.length == rawNewDir.length - 1) { -1229 // Check if there is a file whose path is exactly same with newDir without trailing '/'. -1230 for (int j = 0; j < rawNewDir.length - 1; j++) { -1231 if (rawNewDir[j] != rawPath[j]) { -1232 conflict = false; -1233 break; -1234 } -1235 } -1236 } else { -1237 conflict = false; -1238 } -1239 -1240 if (conflict) { -1241 throw new ChangeConflictException("target directory exists already: " + change); -1242 } -1243 } -1244 -1245 // Skip the entries that do not belong to the oldDir. -1246 if (rawPath.length <= rawOldDir.length) { -1247 continue; -1248 } -1249 for (int j = 0; j < rawOldDir.length; j++) { -1250 if (rawOldDir[j] != rawPath[j]) { -1251 continue loop; -1252 } -1253 } -1254 -1255 // Do not create an editor until we find an entry to rename/remove. -1256 // We can tell if there was any matching entries or not from the nullness of editor later. -1257 if (editor == null) { -1258 editor = dirCache.editor(); -1259 editor.add(new DeleteTree(oldDir)); -1260 if (newDir == null) { -1261 // Recursive removal -1262 break; -1263 } -1264 } +1042 // Upsert only when the contents are really different. +1043 if (!sanitizedNewText.equals(sanitizedOldText)) { +1044 applyPathEdit(dirCache, new InsertText(changePath, inserter, sanitizedNewText)); +1045 numEdits++; +1046 } +1047 break; +1048 } +1049 case REMOVE: +1050 if (oldEntry != null) { +1051 applyPathEdit(dirCache, new DeletePath(changePath)); +1052 numEdits++; +1053 break; +1054 } +1055 +1056 // The path might be a directory. +1057 if (applyDirectoryEdits(dirCache, changePath, null, change)) { +1058 numEdits++; +1059 } else { +1060 // Was not a directory either; conflict. +1061 reportNonExistentEntry(change); +1062 break; +1063 } +1064 break; +1065 case RENAME: { +1066 final String newPath = +1067 ((String) change.content()).substring(1); // Strip the leading '/'. +1068 +1069 if (dirCache.getEntry(newPath) != null) { +1070 throw new ChangeConflictException("a file exists at the target path: " + change); +1071 } +1072 +1073 if (oldEntry != null) { +1074 if (changePath.equals(newPath)) { +1075 // Redundant rename request - old path and new path are same. +1076 break; +1077 } +1078 +1079 final DirCacheEditor editor = dirCache.editor(); +1080 editor.add(new DeletePath(changePath)); +1081 editor.add(new CopyOldEntry(newPath, oldEntry)); +1082 editor.finish(); +1083 numEdits++; +1084 break; +1085 } +1086 +1087 // The path might be a directory. +1088 if (applyDirectoryEdits(dirCache, changePath, newPath, change)) { +1089 numEdits++; +1090 } else { +1091 // Was not a directory either; conflict. +1092 reportNonExistentEntry(change); +1093 } +1094 break; +1095 } +1096 case APPLY_JSON_PATCH: { +1097 final JsonNode oldJsonNode; +1098 if (oldContent != null) { +1099 oldJsonNode = Jackson.readTree(oldContent); +1100 } else { +1101 oldJsonNode = Jackson.nullNode; +1102 } +1103 +1104 final JsonNode newJsonNode; +1105 try { +1106 newJsonNode = JsonPatch.fromJson((JsonNode) change.content()).apply(oldJsonNode); +1107 } catch (Exception e) { +1108 throw new ChangeConflictException("failed to apply JSON patch: " + change, e); +1109 } +1110 +1111 // Apply only when the contents are really different. +1112 if (!newJsonNode.equals(oldJsonNode)) { +1113 applyPathEdit(dirCache, new InsertJson(changePath, inserter, newJsonNode)); +1114 numEdits++; +1115 } +1116 break; +1117 } +1118 case APPLY_TEXT_PATCH: +1119 final Patch<String> patch = DiffUtils.parseUnifiedDiff( +1120 Util.stringToLines(sanitizeText((String) change.content()))); +1121 +1122 final String sanitizedOldText; +1123 final List<String> sanitizedOldTextLines; +1124 if (oldContent != null) { +1125 sanitizedOldText = sanitizeText(new String(oldContent, UTF_8)); +1126 sanitizedOldTextLines = Util.stringToLines(sanitizedOldText); +1127 } else { +1128 sanitizedOldText = null; +1129 sanitizedOldTextLines = Collections.emptyList(); +1130 } +1131 +1132 final String newText; +1133 try { +1134 final List<String> newTextLines = DiffUtils.patch(sanitizedOldTextLines, patch); +1135 if (newTextLines.isEmpty()) { +1136 newText = ""; +1137 } else { +1138 final StringJoiner joiner = new StringJoiner("\n", "", "\n"); +1139 for (String line : newTextLines) { +1140 joiner.add(line); +1141 } +1142 newText = joiner.toString(); +1143 } +1144 } catch (Exception e) { +1145 throw new ChangeConflictException("failed to apply text patch: " + change, e); +1146 } +1147 +1148 // Apply only when the contents are really different. +1149 if (!newText.equals(sanitizedOldText)) { +1150 applyPathEdit(dirCache, new InsertText(changePath, inserter, newText)); +1151 numEdits++; +1152 } +1153 break; +1154 } +1155 } +1156 } catch (CentralDogmaException | IllegalArgumentException e) { +1157 throw e; +1158 } catch (Exception e) { +1159 throw new StorageException("failed to apply changes on revision " + baseRevision, e); +1160 } +1161 return numEdits; +1162 } +1163 +1164 /** +1165 * Removes {@code \r} and appends {@code \n} on the last line if it does not end with {@code \n}. +1166 */ +1167 private static String sanitizeText(String text) { +1168 if (text.indexOf('\r') >= 0) { +1169 text = CR.matcher(text).replaceAll(""); +1170 } +1171 if (!text.isEmpty() && !text.endsWith("\n")) { +1172 text += "\n"; +1173 } +1174 return text; +1175 } +1176 +1177 private static void reportNonExistentEntry(Change<?> change) { +1178 throw new ChangeConflictException("non-existent file/directory: " + change); +1179 } +1180 +1181 private static void applyPathEdit(DirCache dirCache, PathEdit edit) { +1182 final DirCacheEditor e = dirCache.editor(); +1183 e.add(edit); +1184 e.finish(); +1185 } +1186 +1187 /** +1188 * Applies recursive directory edits. +1189 * +1190 * @param oldDir the path to the directory to make a recursive change +1191 * @param newDir the path to the renamed directory, or {@code null} to remove the directory. +1192 * +1193 * @return {@code true} if any edits were made to {@code dirCache}, {@code false} otherwise +1194 */ +1195 private static boolean applyDirectoryEdits(DirCache dirCache, +1196 String oldDir, @Nullable String newDir, Change<?> change) { +1197 +1198 if (!oldDir.endsWith("/")) { +1199 oldDir += '/'; +1200 } +1201 if (newDir != null && !newDir.endsWith("/")) { +1202 newDir += '/'; +1203 } +1204 +1205 final byte[] rawOldDir = Constants.encode(oldDir); +1206 final byte[] rawNewDir = newDir != null ? Constants.encode(newDir) : null; +1207 final int numEntries = dirCache.getEntryCount(); +1208 DirCacheEditor editor = null; +1209 +1210 loop: +1211 for (int i = 0; i < numEntries; i++) { +1212 final DirCacheEntry e = dirCache.getEntry(i); +1213 final byte[] rawPath = e.getRawPath(); +1214 +1215 // Ensure that there are no entries under the newDir; we have a conflict otherwise. +1216 if (rawNewDir != null) { +1217 boolean conflict = true; +1218 if (rawPath.length > rawNewDir.length) { +1219 // Check if there is a file whose path starts with 'newDir'. +1220 for (int j = 0; j < rawNewDir.length; j++) { +1221 if (rawNewDir[j] != rawPath[j]) { +1222 conflict = false; +1223 break; +1224 } +1225 } +1226 } else if (rawPath.length == rawNewDir.length - 1) { +1227 // Check if there is a file whose path is exactly same with newDir without trailing '/'. +1228 for (int j = 0; j < rawNewDir.length - 1; j++) { +1229 if (rawNewDir[j] != rawPath[j]) { +1230 conflict = false; +1231 break; +1232 } +1233 } +1234 } else { +1235 conflict = false; +1236 } +1237 +1238 if (conflict) { +1239 throw new ChangeConflictException("target directory exists already: " + change); +1240 } +1241 } +1242 +1243 // Skip the entries that do not belong to the oldDir. +1244 if (rawPath.length <= rawOldDir.length) { +1245 continue; +1246 } +1247 for (int j = 0; j < rawOldDir.length; j++) { +1248 if (rawOldDir[j] != rawPath[j]) { +1249 continue loop; +1250 } +1251 } +1252 +1253 // Do not create an editor until we find an entry to rename/remove. +1254 // We can tell if there was any matching entries or not from the nullness of editor later. +1255 if (editor == null) { +1256 editor = dirCache.editor(); +1257 editor.add(new DeleteTree(oldDir)); +1258 if (newDir == null) { +1259 // Recursive removal +1260 break; +1261 } +1262 } +1263 +1264 assert newDir != null; // We should get here only when it's a recursive rename. 1265 -1266 assert newDir != null; // We should get here only when it's a recursive rename. -1267 -1268 final String oldPath = e.getPathString(); -1269 final String newPath = newDir + oldPath.substring(oldDir.length()); -1270 editor.add(new CopyOldEntry(newPath, e)); -1271 } -1272 -1273 if (editor != null) { -1274 editor.finish(); -1275 return true; -1276 } else { -1277 return false; -1278 } -1279 } -1280 -1281 private void doRefUpdate(RevWalk revWalk, String ref, ObjectId commitId) throws IOException { -1282 doRefUpdate(jGitRepository, revWalk, ref, commitId); -1283 } -1284 -1285 @VisibleForTesting -1286 static void doRefUpdate(org.eclipse.jgit.lib.Repository jGitRepository, RevWalk revWalk, -1287 String ref, ObjectId commitId) throws IOException { -1288 -1289 if (ref.startsWith(Constants.R_TAGS)) { -1290 final Ref oldRef = jGitRepository.exactRef(ref); -1291 if (oldRef != null) { -1292 throw new StorageException("tag ref exists already: " + ref); -1293 } -1294 } -1295 -1296 final RefUpdate refUpdate = jGitRepository.updateRef(ref); -1297 refUpdate.setNewObjectId(commitId); -1298 -1299 final Result res = refUpdate.update(revWalk); -1300 switch (res) { -1301 case NEW: -1302 case FAST_FORWARD: -1303 // Expected -1304 break; -1305 default: -1306 throw new StorageException("unexpected refUpdate state: " + res); -1307 } -1308 } -1309 -1310 @Override -1311 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, -1312 boolean errorOnEntryNotFound) { -1313 requireNonNull(lastKnownRevision, "lastKnownRevision"); -1314 requireNonNull(pathPattern, "pathPattern"); -1315 -1316 final ServiceRequestContext ctx = context(); -1317 return CompletableFuture.supplyAsync(() -> { -1318 failFastIfTimedOut(this, logger, ctx, "findLatestRevision", lastKnownRevision, pathPattern); -1319 return blockingFindLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); -1320 }, repositoryWorker); -1321 } -1322 -1323 @Nullable -1324 private Revision blockingFindLatestRevision(Revision lastKnownRevision, String pathPattern, -1325 boolean errorOnEntryNotFound) { -1326 final RevisionRange range = normalizeNow(lastKnownRevision, Revision.HEAD); -1327 if (range.from().equals(range.to())) { -1328 // Empty range. -1329 if (!errorOnEntryNotFound) { -1330 return null; -1331 } -1332 // We have to check if we have the entry. -1333 final Map<String, Entry<?>> entries = -1334 blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT); -1335 if (!entries.isEmpty()) { -1336 // We have the entry so just return null because there's no change. -1337 return null; -1338 } -1339 throw new EntryNotFoundException(lastKnownRevision, pathPattern); -1340 } -1341 -1342 if (range.from().major() == 1) { -1343 // Fast path: no need to compare because we are sure there is nothing at revision 1. -1344 final Map<String, Entry<?>> entries = -1345 blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT); -1346 if (entries.isEmpty()) { -1347 if (!errorOnEntryNotFound) { -1348 return null; -1349 } -1350 throw new EntryNotFoundException(lastKnownRevision, pathPattern); -1351 } else { -1352 return range.to(); -1353 } -1354 } -1355 -1356 // Slow path: compare the two trees. -1357 final PathPatternFilter filter = PathPatternFilter.of(pathPattern); -1358 // Convert the revisions to Git trees. -1359 final List<DiffEntry> diffEntries; -1360 readLock(); -1361 try (RevWalk revWalk = newRevWalk()) { -1362 final RevTree treeA = toTree(revWalk, range.from()); -1363 final RevTree treeB = toTree(revWalk, range.to()); -1364 diffEntries = blockingCompareTrees(treeA, treeB); -1365 } finally { -1366 readUnlock(); -1367 } -1368 -1369 // Return the latest revision if the changes between the two trees contain the file. -1370 for (DiffEntry e : diffEntries) { -1371 final String path; -1372 switch (e.getChangeType()) { -1373 case ADD: -1374 path = e.getNewPath(); -1375 break; -1376 case MODIFY: -1377 case DELETE: -1378 path = e.getOldPath(); -1379 break; -1380 default: -1381 throw new Error(); -1382 } -1383 -1384 if (filter.matches(path)) { -1385 return range.to(); -1386 } -1387 } -1388 -1389 if (!errorOnEntryNotFound) { -1390 return null; -1391 } -1392 if (!blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT).isEmpty()) { -1393 // We have to make sure that the entry does not exist because the size of diffEntries can be 0 -1394 // when the contents of range.from() and range.to() are identical. (e.g. add, remove and add again) -1395 return null; -1396 } -1397 throw new EntryNotFoundException(lastKnownRevision, pathPattern); -1398 } -1399 -1400 /** -1401 * Compares the two Git trees (with caching). -1402 */ -1403 private List<DiffEntry> blockingCompareTrees(RevTree treeA, RevTree treeB) { -1404 if (cache == null) { -1405 return blockingCompareTreesUncached(treeA, treeB, TreeFilter.ALL); -1406 } -1407 -1408 final CacheableCompareTreesCall key = new CacheableCompareTreesCall(this, treeA, treeB); -1409 CompletableFuture<List<DiffEntry>> existingFuture = cache.getIfPresent(key); -1410 if (existingFuture != null) { -1411 final List<DiffEntry> existingDiffEntries = existingFuture.getNow(null); -1412 if (existingDiffEntries != null) { -1413 // Cached already. -1414 return existingDiffEntries; -1415 } -1416 } -1417 -1418 // Not cached yet. Acquire a lock so that we do not compare the same tree pairs simultaneously. -1419 final List<DiffEntry> newDiffEntries; -1420 final Lock lock = key.coarseGrainedLock(); -1421 lock.lock(); -1422 try { -1423 existingFuture = cache.getIfPresent(key); -1424 if (existingFuture != null) { -1425 final List<DiffEntry> existingDiffEntries = existingFuture.getNow(null); -1426 if (existingDiffEntries != null) { -1427 // Other thread already put the entries to the cache before we acquire the lock. -1428 return existingDiffEntries; -1429 } -1430 } -1431 -1432 newDiffEntries = blockingCompareTreesUncached(treeA, treeB, TreeFilter.ALL); -1433 cache.put(key, newDiffEntries); -1434 } finally { -1435 lock.unlock(); -1436 } -1437 -1438 logger.debug("Cache miss: {}", key); -1439 return newDiffEntries; -1440 } -1441 -1442 private List<DiffEntry> blockingCompareTreesUncached(@Nullable RevTree treeA, -1443 @Nullable RevTree treeB, -1444 TreeFilter filter) { -1445 readLock(); -1446 try (DiffFormatter diffFormatter = new DiffFormatter(null)) { -1447 diffFormatter.setRepository(jGitRepository); -1448 diffFormatter.setPathFilter(filter); -1449 return ImmutableList.copyOf(diffFormatter.scan(treeA, treeB)); -1450 } catch (IOException e) { -1451 throw new StorageException("failed to compare two trees: " + treeA + " vs. " + treeB, e); -1452 } finally { -1453 readUnlock(); -1454 } -1455 } -1456 -1457 @Override -1458 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, -1459 boolean errorOnEntryNotFound) { -1460 requireNonNull(lastKnownRevision, "lastKnownRevision"); -1461 requireNonNull(pathPattern, "pathPattern"); -1462 -1463 final ServiceRequestContext ctx = context(); -1464 final Revision normLastKnownRevision = normalizeNow(lastKnownRevision); -1465 final CompletableFuture<Revision> future = new CompletableFuture<>(); -1466 CompletableFuture.runAsync(() -> { -1467 failFastIfTimedOut(this, logger, ctx, "watch", lastKnownRevision, pathPattern); -1468 readLock(); -1469 try { -1470 // If lastKnownRevision is outdated already and the recent changes match, -1471 // there's no need to watch. -1472 final Revision latestRevision = blockingFindLatestRevision(normLastKnownRevision, pathPattern, -1473 errorOnEntryNotFound); -1474 if (latestRevision != null) { -1475 future.complete(latestRevision); -1476 } else { -1477 commitWatchers.add(normLastKnownRevision, pathPattern, future); -1478 } -1479 } finally { -1480 readUnlock(); -1481 } -1482 }, repositoryWorker).exceptionally(cause -> { -1483 future.completeExceptionally(cause); -1484 return null; -1485 }); -1486 -1487 return future; -1488 } -1489 -1490 private void notifyWatchers(Revision newRevision, List<DiffEntry> diffEntries) { -1491 for (DiffEntry entry : diffEntries) { -1492 switch (entry.getChangeType()) { -1493 case ADD: -1494 commitWatchers.notify(newRevision, entry.getNewPath()); -1495 break; -1496 case MODIFY: -1497 case DELETE: -1498 commitWatchers.notify(newRevision, entry.getOldPath()); -1499 break; -1500 default: -1501 throw new Error(); -1502 } -1503 } -1504 } -1505 -1506 private Revision cachedHeadRevision() { -1507 return headRevision; -1508 } -1509 -1510 /** -1511 * Returns the current revision. -1512 */ -1513 private Revision uncachedHeadRevision() { -1514 try (RevWalk revWalk = newRevWalk()) { -1515 final ObjectId headRevisionId = jGitRepository.resolve(R_HEADS_MASTER); -1516 if (headRevisionId != null) { -1517 final RevCommit revCommit = revWalk.parseCommit(headRevisionId); -1518 return CommitUtil.extractRevision(revCommit.getFullMessage()); -1519 } -1520 } catch (CentralDogmaException e) { -1521 throw e; -1522 } catch (Exception e) { -1523 throw new StorageException("failed to get the current revision", e); -1524 } -1525 -1526 throw new StorageException("failed to determine the HEAD: " + parent.name() + '/' + name); -1527 } -1528 -1529 private RevTree toTree(RevWalk revWalk, Revision revision) { -1530 final ObjectId commitId = commitIdDatabase.get(revision); -1531 try { -1532 return revWalk.parseCommit(commitId).getTree(); -1533 } catch (IOException e) { -1534 throw new StorageException("failed to parse a commit: " + commitId, e); -1535 } -1536 } -1537 -1538 private RevWalk newRevWalk() { -1539 final RevWalk revWalk = new RevWalk(jGitRepository); -1540 configureRevWalk(revWalk); -1541 return revWalk; -1542 } -1543 -1544 private static RevWalk newRevWalk(ObjectReader reader) { -1545 final RevWalk revWalk = new RevWalk(reader); -1546 configureRevWalk(revWalk); -1547 return revWalk; -1548 } -1549 -1550 private static void configureRevWalk(RevWalk revWalk) { -1551 // Disable rewriteParents because otherwise `RevWalk` will load every commit into memory. -1552 revWalk.setRewriteParents(false); -1553 } -1554 -1555 private void readLock() { -1556 rwLock.readLock().lock(); -1557 if (closePending.get() != null) { -1558 rwLock.readLock().unlock(); -1559 throw closePending.get().get(); -1560 } -1561 } -1562 -1563 private void readUnlock() { -1564 rwLock.readLock().unlock(); -1565 } -1566 -1567 private void writeLock() { -1568 rwLock.writeLock().lock(); -1569 if (closePending.get() != null) { -1570 writeUnLock(); -1571 throw closePending.get().get(); -1572 } -1573 } -1574 -1575 private void writeUnLock() { -1576 rwLock.writeLock().unlock(); -1577 } -1578 -1579 /** -1580 * Clones this repository into a new one. -1581 */ -1582 public void cloneTo(File newRepoDir) { -1583 cloneTo(newRepoDir, (current, total) -> { /* no-op */ }); -1584 } -1585 -1586 /** -1587 * Clones this repository into a new one. -1588 */ -1589 public void cloneTo(File newRepoDir, BiConsumer<Integer, Integer> progressListener) { -1590 requireNonNull(newRepoDir, "newRepoDir"); -1591 requireNonNull(progressListener, "progressListener"); -1592 -1593 final Revision endRevision = normalizeNow(Revision.HEAD); -1594 final GitRepository newRepo = new GitRepository(parent, newRepoDir, repositoryWorker, -1595 creationTimeMillis(), author(), cache); -1596 -1597 progressListener.accept(1, endRevision.major()); -1598 boolean success = false; -1599 try { -1600 // Replay all commits. -1601 Revision previousNonEmptyRevision = null; -1602 for (int i = 2; i <= endRevision.major();) { -1603 // Fetch up to 16 commits at once. -1604 final int batch = 16; -1605 final List<Commit> commits = blockingHistory( -1606 new Revision(i), new Revision(Math.min(endRevision.major(), i + batch - 1)), -1607 Repository.ALL_PATH, batch); -1608 checkState(!commits.isEmpty(), "empty commits"); -1609 -1610 if (previousNonEmptyRevision == null) { -1611 previousNonEmptyRevision = commits.get(0).revision().backward(1); -1612 } -1613 for (Commit c : commits) { -1614 final Revision revision = c.revision(); -1615 checkState(revision.major() == i, -1616 "mismatching revision: %s (expected: %s)", revision.major(), i); -1617 -1618 final Revision baseRevision = revision.backward(1); -1619 final Collection<Change<?>> changes = -1620 diff(previousNonEmptyRevision, revision, Repository.ALL_PATH).join().values(); -1621 -1622 try { -1623 newRepo.blockingCommit( -1624 baseRevision, c.when(), c.author(), c.summary(), c.detail(), c.markup(), -1625 changes, /* allowEmptyCommit */ false, false); -1626 previousNonEmptyRevision = revision; -1627 } catch (RedundantChangeException e) { -1628 // NB: We allow an empty commit here because an old version of Central Dogma had a bug -1629 // which allowed the creation of an empty commit. -1630 newRepo.blockingCommit( -1631 baseRevision, c.when(), c.author(), c.summary(), c.detail(), c.markup(), -1632 changes, /* allowEmptyCommit */ true, false); -1633 } -1634 -1635 progressListener.accept(i, endRevision.major()); -1636 i++; -1637 } -1638 } -1639 -1640 success = true; -1641 } finally { -1642 newRepo.internalClose(); -1643 if (!success) { -1644 deleteCruft(newRepoDir); -1645 } -1646 } -1647 } -1648 -1649 private static void deleteCruft(File repoDir) { -1650 try { -1651 Util.deleteFileTree(repoDir); -1652 } catch (IOException e) { -1653 logger.error("Failed to delete a half-created repository at: {}", repoDir, e); -1654 } -1655 } -1656 -1657 @Override -1658 public String toString() { -1659 return MoreObjects.toStringHelper(this) -1660 .add("dir", jGitRepository.getDirectory()) -1661 .toString(); -1662 } -1663 -1664 private static final class RevisionAndEntries { -1665 final Revision revision; -1666 final List<DiffEntry> diffEntries; -1667 -1668 RevisionAndEntries(Revision revision, List<DiffEntry> diffEntries) { -1669 this.revision = revision; -1670 this.diffEntries = diffEntries; -1671 } -1672 } +1266 final String oldPath = e.getPathString(); +1267 final String newPath = newDir + oldPath.substring(oldDir.length()); +1268 editor.add(new CopyOldEntry(newPath, e)); +1269 } +1270 +1271 if (editor != null) { +1272 editor.finish(); +1273 return true; +1274 } else { +1275 return false; +1276 } +1277 } +1278 +1279 private void doRefUpdate(RevWalk revWalk, String ref, ObjectId commitId) throws IOException { +1280 doRefUpdate(jGitRepository, revWalk, ref, commitId); +1281 } +1282 +1283 @VisibleForTesting +1284 static void doRefUpdate(org.eclipse.jgit.lib.Repository jGitRepository, RevWalk revWalk, +1285 String ref, ObjectId commitId) throws IOException { +1286 +1287 if (ref.startsWith(Constants.R_TAGS)) { +1288 final Ref oldRef = jGitRepository.exactRef(ref); +1289 if (oldRef != null) { +1290 throw new StorageException("tag ref exists already: " + ref); +1291 } +1292 } +1293 +1294 final RefUpdate refUpdate = jGitRepository.updateRef(ref); +1295 refUpdate.setNewObjectId(commitId); +1296 +1297 final Result res = refUpdate.update(revWalk); +1298 switch (res) { +1299 case NEW: +1300 case FAST_FORWARD: +1301 // Expected +1302 break; +1303 default: +1304 throw new StorageException("unexpected refUpdate state: " + res); +1305 } +1306 } +1307 +1308 @Override +1309 public CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, +1310 boolean errorOnEntryNotFound) { +1311 requireNonNull(lastKnownRevision, "lastKnownRevision"); +1312 requireNonNull(pathPattern, "pathPattern"); +1313 +1314 final ServiceRequestContext ctx = context(); +1315 return CompletableFuture.supplyAsync(() -> { +1316 failFastIfTimedOut(this, logger, ctx, "findLatestRevision", lastKnownRevision, pathPattern); +1317 return blockingFindLatestRevision(lastKnownRevision, pathPattern, errorOnEntryNotFound); +1318 }, repositoryWorker); +1319 } +1320 +1321 @Nullable +1322 private Revision blockingFindLatestRevision(Revision lastKnownRevision, String pathPattern, +1323 boolean errorOnEntryNotFound) { +1324 final RevisionRange range = normalizeNow(lastKnownRevision, Revision.HEAD); +1325 if (range.from().equals(range.to())) { +1326 // Empty range. +1327 if (!errorOnEntryNotFound) { +1328 return null; +1329 } +1330 // We have to check if we have the entry. +1331 final Map<String, Entry<?>> entries = +1332 blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT); +1333 if (!entries.isEmpty()) { +1334 // We have the entry so just return null because there's no change. +1335 return null; +1336 } +1337 throw new EntryNotFoundException(lastKnownRevision, pathPattern); +1338 } +1339 +1340 if (range.from().major() == 1) { +1341 // Fast path: no need to compare because we are sure there is nothing at revision 1. +1342 final Map<String, Entry<?>> entries = +1343 blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT); +1344 if (entries.isEmpty()) { +1345 if (!errorOnEntryNotFound) { +1346 return null; +1347 } +1348 throw new EntryNotFoundException(lastKnownRevision, pathPattern); +1349 } else { +1350 return range.to(); +1351 } +1352 } +1353 +1354 // Slow path: compare the two trees. +1355 final PathPatternFilter filter = PathPatternFilter.of(pathPattern); +1356 // Convert the revisions to Git trees. +1357 final List<DiffEntry> diffEntries; +1358 readLock(); +1359 try (RevWalk revWalk = newRevWalk()) { +1360 final RevTree treeA = toTree(revWalk, range.from()); +1361 final RevTree treeB = toTree(revWalk, range.to()); +1362 diffEntries = blockingCompareTrees(treeA, treeB); +1363 } finally { +1364 readUnlock(); +1365 } +1366 +1367 // Return the latest revision if the changes between the two trees contain the file. +1368 for (DiffEntry e : diffEntries) { +1369 final String path; +1370 switch (e.getChangeType()) { +1371 case ADD: +1372 path = e.getNewPath(); +1373 break; +1374 case MODIFY: +1375 case DELETE: +1376 path = e.getOldPath(); +1377 break; +1378 default: +1379 throw new Error(); +1380 } +1381 +1382 if (filter.matches(path)) { +1383 return range.to(); +1384 } +1385 } +1386 +1387 if (!errorOnEntryNotFound) { +1388 return null; +1389 } +1390 if (!blockingFind(range.to(), pathPattern, FindOptions.FIND_ONE_WITHOUT_CONTENT).isEmpty()) { +1391 // We have to make sure that the entry does not exist because the size of diffEntries can be 0 +1392 // when the contents of range.from() and range.to() are identical. (e.g. add, remove and add again) +1393 return null; +1394 } +1395 throw new EntryNotFoundException(lastKnownRevision, pathPattern); +1396 } +1397 +1398 /** +1399 * Compares the two Git trees (with caching). +1400 */ +1401 private List<DiffEntry> blockingCompareTrees(RevTree treeA, RevTree treeB) { +1402 if (cache == null) { +1403 return blockingCompareTreesUncached(treeA, treeB, TreeFilter.ALL); +1404 } +1405 +1406 final CacheableCompareTreesCall key = new CacheableCompareTreesCall(this, treeA, treeB); +1407 CompletableFuture<List<DiffEntry>> existingFuture = cache.getIfPresent(key); +1408 if (existingFuture != null) { +1409 final List<DiffEntry> existingDiffEntries = existingFuture.getNow(null); +1410 if (existingDiffEntries != null) { +1411 // Cached already. +1412 return existingDiffEntries; +1413 } +1414 } +1415 +1416 // Not cached yet. Acquire a lock so that we do not compare the same tree pairs simultaneously. +1417 final List<DiffEntry> newDiffEntries; +1418 final Lock lock = key.coarseGrainedLock(); +1419 lock.lock(); +1420 try { +1421 existingFuture = cache.getIfPresent(key); +1422 if (existingFuture != null) { +1423 final List<DiffEntry> existingDiffEntries = existingFuture.getNow(null); +1424 if (existingDiffEntries != null) { +1425 // Other thread already put the entries to the cache before we acquire the lock. +1426 return existingDiffEntries; +1427 } +1428 } +1429 +1430 newDiffEntries = blockingCompareTreesUncached(treeA, treeB, TreeFilter.ALL); +1431 cache.put(key, newDiffEntries); +1432 } finally { +1433 lock.unlock(); +1434 } +1435 +1436 logger.debug("Cache miss: {}", key); +1437 return newDiffEntries; +1438 } +1439 +1440 private List<DiffEntry> blockingCompareTreesUncached(@Nullable RevTree treeA, +1441 @Nullable RevTree treeB, +1442 TreeFilter filter) { +1443 readLock(); +1444 try (DiffFormatter diffFormatter = new DiffFormatter(null)) { +1445 diffFormatter.setRepository(jGitRepository); +1446 diffFormatter.setPathFilter(filter); +1447 return ImmutableList.copyOf(diffFormatter.scan(treeA, treeB)); +1448 } catch (IOException e) { +1449 throw new StorageException("failed to compare two trees: " + treeA + " vs. " + treeB, e); +1450 } finally { +1451 readUnlock(); +1452 } +1453 } +1454 +1455 @Override +1456 public CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, +1457 boolean errorOnEntryNotFound) { +1458 requireNonNull(lastKnownRevision, "lastKnownRevision"); +1459 requireNonNull(pathPattern, "pathPattern"); +1460 +1461 final ServiceRequestContext ctx = context(); +1462 final Revision normLastKnownRevision = normalizeNow(lastKnownRevision); +1463 final CompletableFuture<Revision> future = new CompletableFuture<>(); +1464 CompletableFuture.runAsync(() -> { +1465 failFastIfTimedOut(this, logger, ctx, "watch", lastKnownRevision, pathPattern); +1466 readLock(); +1467 try { +1468 // If lastKnownRevision is outdated already and the recent changes match, +1469 // there's no need to watch. +1470 final Revision latestRevision = blockingFindLatestRevision(normLastKnownRevision, pathPattern, +1471 errorOnEntryNotFound); +1472 if (latestRevision != null) { +1473 future.complete(latestRevision); +1474 } else { +1475 commitWatchers.add(normLastKnownRevision, pathPattern, future); +1476 } +1477 } finally { +1478 readUnlock(); +1479 } +1480 }, repositoryWorker).exceptionally(cause -> { +1481 future.completeExceptionally(cause); +1482 return null; +1483 }); +1484 +1485 return future; +1486 } +1487 +1488 private void notifyWatchers(Revision newRevision, List<DiffEntry> diffEntries) { +1489 for (DiffEntry entry : diffEntries) { +1490 switch (entry.getChangeType()) { +1491 case ADD: +1492 commitWatchers.notify(newRevision, entry.getNewPath()); +1493 break; +1494 case MODIFY: +1495 case DELETE: +1496 commitWatchers.notify(newRevision, entry.getOldPath()); +1497 break; +1498 default: +1499 throw new Error(); +1500 } +1501 } +1502 } +1503 +1504 private Revision cachedHeadRevision() { +1505 return headRevision; +1506 } +1507 +1508 /** +1509 * Returns the current revision. +1510 */ +1511 private Revision uncachedHeadRevision() { +1512 try (RevWalk revWalk = newRevWalk()) { +1513 final ObjectId headRevisionId = jGitRepository.resolve(R_HEADS_MASTER); +1514 if (headRevisionId != null) { +1515 final RevCommit revCommit = revWalk.parseCommit(headRevisionId); +1516 return CommitUtil.extractRevision(revCommit.getFullMessage()); +1517 } +1518 } catch (CentralDogmaException e) { +1519 throw e; +1520 } catch (Exception e) { +1521 throw new StorageException("failed to get the current revision", e); +1522 } +1523 +1524 throw new StorageException("failed to determine the HEAD: " + parent.name() + '/' + name); +1525 } +1526 +1527 private RevTree toTree(RevWalk revWalk, Revision revision) { +1528 final ObjectId commitId = commitIdDatabase.get(revision); +1529 try { +1530 return revWalk.parseCommit(commitId).getTree(); +1531 } catch (IOException e) { +1532 throw new StorageException("failed to parse a commit: " + commitId, e); +1533 } +1534 } +1535 +1536 private RevWalk newRevWalk() { +1537 final RevWalk revWalk = new RevWalk(jGitRepository); +1538 configureRevWalk(revWalk); +1539 return revWalk; +1540 } +1541 +1542 private static RevWalk newRevWalk(ObjectReader reader) { +1543 final RevWalk revWalk = new RevWalk(reader); +1544 configureRevWalk(revWalk); +1545 return revWalk; +1546 } +1547 +1548 private static void configureRevWalk(RevWalk revWalk) { +1549 // Disable rewriteParents because otherwise `RevWalk` will load every commit into memory. +1550 revWalk.setRewriteParents(false); +1551 } +1552 +1553 private void readLock() { +1554 rwLock.readLock().lock(); +1555 if (closePending.get() != null) { +1556 rwLock.readLock().unlock(); +1557 throw closePending.get().get(); +1558 } +1559 } +1560 +1561 private void readUnlock() { +1562 rwLock.readLock().unlock(); +1563 } +1564 +1565 private void writeLock() { +1566 rwLock.writeLock().lock(); +1567 if (closePending.get() != null) { +1568 writeUnLock(); +1569 throw closePending.get().get(); +1570 } +1571 } +1572 +1573 private void writeUnLock() { +1574 rwLock.writeLock().unlock(); +1575 } +1576 +1577 /** +1578 * Clones this repository into a new one. +1579 */ +1580 public void cloneTo(File newRepoDir) { +1581 cloneTo(newRepoDir, (current, total) -> { /* no-op */ }); +1582 } +1583 +1584 /** +1585 * Clones this repository into a new one. +1586 */ +1587 public void cloneTo(File newRepoDir, BiConsumer<Integer, Integer> progressListener) { +1588 requireNonNull(newRepoDir, "newRepoDir"); +1589 requireNonNull(progressListener, "progressListener"); +1590 +1591 final Revision endRevision = normalizeNow(Revision.HEAD); +1592 final GitRepository newRepo = new GitRepository(parent, newRepoDir, repositoryWorker, +1593 creationTimeMillis(), author(), cache); +1594 +1595 progressListener.accept(1, endRevision.major()); +1596 boolean success = false; +1597 try { +1598 // Replay all commits. +1599 Revision previousNonEmptyRevision = null; +1600 for (int i = 2; i <= endRevision.major();) { +1601 // Fetch up to 16 commits at once. +1602 final int batch = 16; +1603 final List<Commit> commits = blockingHistory( +1604 new Revision(i), new Revision(Math.min(endRevision.major(), i + batch - 1)), +1605 Repository.ALL_PATH, batch); +1606 checkState(!commits.isEmpty(), "empty commits"); +1607 +1608 if (previousNonEmptyRevision == null) { +1609 previousNonEmptyRevision = commits.get(0).revision().backward(1); +1610 } +1611 for (Commit c : commits) { +1612 final Revision revision = c.revision(); +1613 checkState(revision.major() == i, +1614 "mismatching revision: %s (expected: %s)", revision.major(), i); +1615 +1616 final Revision baseRevision = revision.backward(1); +1617 final Collection<Change<?>> changes = +1618 diff(previousNonEmptyRevision, revision, Repository.ALL_PATH).join().values(); +1619 +1620 try { +1621 newRepo.blockingCommit( +1622 baseRevision, c.when(), c.author(), c.summary(), c.detail(), c.markup(), +1623 changes, /* allowEmptyCommit */ false, false); +1624 previousNonEmptyRevision = revision; +1625 } catch (RedundantChangeException e) { +1626 // NB: We allow an empty commit here because an old version of Central Dogma had a bug +1627 // which allowed the creation of an empty commit. +1628 newRepo.blockingCommit( +1629 baseRevision, c.when(), c.author(), c.summary(), c.detail(), c.markup(), +1630 changes, /* allowEmptyCommit */ true, false); +1631 } +1632 +1633 progressListener.accept(i, endRevision.major()); +1634 i++; +1635 } +1636 } +1637 +1638 success = true; +1639 } finally { +1640 newRepo.internalClose(); +1641 if (!success) { +1642 deleteCruft(newRepoDir); +1643 } +1644 } +1645 } +1646 +1647 private static void deleteCruft(File repoDir) { +1648 try { +1649 Util.deleteFileTree(repoDir); +1650 } catch (IOException e) { +1651 logger.error("Failed to delete a half-created repository at: {}", repoDir, e); +1652 } +1653 } +1654 +1655 @Override +1656 public String toString() { +1657 return MoreObjects.toStringHelper(this) +1658 .add("dir", jGitRepository.getDirectory()) +1659 .toString(); +1660 } +1661 +1662 private static final class RevisionAndEntries { +1663 final Revision revision; +1664 final List<DiffEntry> diffEntries; +1665 +1666 RevisionAndEntries(Revision revision, List<DiffEntry> diffEntries) { +1667 this.revision = revision; +1668 this.diffEntries = diffEntries; +1669 } +1670 } +1671 +1672 // PathEdit implementations which is used when applying changes. 1673 -1674 // PathEdit implementations which is used when applying changes. -1675 -1676 private static final class InsertText extends PathEdit { -1677 private final ObjectInserter inserter; -1678 private final String text; -1679 -1680 InsertText(String entryPath, ObjectInserter inserter, String text) { -1681 super(entryPath); -1682 this.inserter = inserter; -1683 this.text = text; -1684 } -1685 -1686 @Override -1687 public void apply(DirCacheEntry ent) { -1688 try { -1689 ent.setObjectId(inserter.insert(Constants.OBJ_BLOB, text.getBytes(UTF_8))); -1690 ent.setFileMode(FileMode.REGULAR_FILE); -1691 } catch (IOException e) { -1692 throw new StorageException("failed to create a new text blob", e); -1693 } -1694 } -1695 } -1696 -1697 private static final class InsertJson extends PathEdit { -1698 private final ObjectInserter inserter; -1699 private final JsonNode jsonNode; -1700 -1701 InsertJson(String entryPath, ObjectInserter inserter, JsonNode jsonNode) { -1702 super(entryPath); -1703 this.inserter = inserter; -1704 this.jsonNode = jsonNode; -1705 } -1706 -1707 @Override -1708 public void apply(DirCacheEntry ent) { -1709 try { -1710 ent.setObjectId(inserter.insert(Constants.OBJ_BLOB, Jackson.writeValueAsBytes(jsonNode))); -1711 ent.setFileMode(FileMode.REGULAR_FILE); -1712 } catch (IOException e) { -1713 throw new StorageException("failed to create a new JSON blob", e); -1714 } -1715 } -1716 } -1717 -1718 private static final class CopyOldEntry extends PathEdit { -1719 private final DirCacheEntry oldEntry; -1720 -1721 CopyOldEntry(String entryPath, DirCacheEntry oldEntry) { -1722 super(entryPath); -1723 this.oldEntry = oldEntry; -1724 } -1725 -1726 @Override -1727 public void apply(DirCacheEntry ent) { -1728 ent.setFileMode(oldEntry.getFileMode()); -1729 ent.setObjectId(oldEntry.getObjectId()); -1730 } -1731 } -1732 } +1674 private static final class InsertText extends PathEdit { +1675 private final ObjectInserter inserter; +1676 private final String text; +1677 +1678 InsertText(String entryPath, ObjectInserter inserter, String text) { +1679 super(entryPath); +1680 this.inserter = inserter; +1681 this.text = text; +1682 } +1683 +1684 @Override +1685 public void apply(DirCacheEntry ent) { +1686 try { +1687 ent.setObjectId(inserter.insert(Constants.OBJ_BLOB, text.getBytes(UTF_8))); +1688 ent.setFileMode(FileMode.REGULAR_FILE); +1689 } catch (IOException e) { +1690 throw new StorageException("failed to create a new text blob", e); +1691 } +1692 } +1693 } +1694 +1695 private static final class InsertJson extends PathEdit { +1696 private final ObjectInserter inserter; +1697 private final JsonNode jsonNode; +1698 +1699 InsertJson(String entryPath, ObjectInserter inserter, JsonNode jsonNode) { +1700 super(entryPath); +1701 this.inserter = inserter; +1702 this.jsonNode = jsonNode; +1703 } +1704 +1705 @Override +1706 public void apply(DirCacheEntry ent) { +1707 try { +1708 ent.setObjectId(inserter.insert(Constants.OBJ_BLOB, Jackson.writeValueAsBytes(jsonNode))); +1709 ent.setFileMode(FileMode.REGULAR_FILE); +1710 } catch (IOException e) { +1711 throw new StorageException("failed to create a new JSON blob", e); +1712 } +1713 } +1714 } +1715 +1716 private static final class CopyOldEntry extends PathEdit { +1717 private final DirCacheEntry oldEntry; +1718 +1719 CopyOldEntry(String entryPath, DirCacheEntry oldEntry) { +1720 super(entryPath); +1721 this.oldEntry = oldEntry; +1722 } +1723 +1724 @Override +1725 public void apply(DirCacheEntry ent) { +1726 ent.setFileMode(oldEntry.getFileMode()); +1727 ent.setObjectId(oldEntry.getObjectId()); +1728 } +1729 } +1730 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepositoryManager.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepositoryManager.html index 9573f66fdd..8cfa8471c5 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepositoryManager.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/GitRepositoryManager.html @@ -27,71 +27,120 @@ 19 import static java.util.Objects.requireNonNull; 20 21 import java.io.File; -22 import java.util.concurrent.Executor; -23 import java.util.function.Supplier; -24 -25 import javax.annotation.Nullable; -26 -27 import com.linecorp.centraldogma.common.Author; -28 import com.linecorp.centraldogma.common.CentralDogmaException; -29 import com.linecorp.centraldogma.common.RepositoryExistsException; -30 import com.linecorp.centraldogma.common.RepositoryNotFoundException; -31 import com.linecorp.centraldogma.server.internal.storage.DirectoryBasedStorageManager; -32 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryCache; -33 import com.linecorp.centraldogma.server.storage.project.Project; -34 import com.linecorp.centraldogma.server.storage.repository.Repository; -35 import com.linecorp.centraldogma.server.storage.repository.RepositoryManager; -36 -37 public class GitRepositoryManager extends DirectoryBasedStorageManager<Repository> -38 implements RepositoryManager { -39 -40 private final Project parent; -41 private final Executor repositoryWorker; -42 -43 @Nullable -44 private final RepositoryCache cache; -45 -46 public GitRepositoryManager(Project parent, File rootDir, Executor repositoryWorker, -47 Executor purgeWorker, @Nullable RepositoryCache cache) { -48 super(rootDir, Repository.class, purgeWorker); -49 this.parent = requireNonNull(parent, "parent"); -50 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); -51 this.cache = cache; -52 init(); -53 } -54 -55 @Override -56 public Project parent() { -57 return parent; -58 } -59 -60 @Override -61 protected Repository openChild(File childDir) throws Exception { -62 return new GitRepository(parent, childDir, repositoryWorker, cache); +22 import java.io.IOException; +23 import java.util.concurrent.Executor; +24 import java.util.concurrent.TimeUnit; +25 import java.util.function.BiConsumer; +26 import java.util.function.Supplier; +27 +28 import javax.annotation.Nullable; +29 +30 import org.slf4j.Logger; +31 import org.slf4j.LoggerFactory; +32 +33 import com.linecorp.armeria.common.util.TextFormatter; +34 import com.linecorp.centraldogma.common.Author; +35 import com.linecorp.centraldogma.common.CentralDogmaException; +36 import com.linecorp.centraldogma.common.RepositoryExistsException; +37 import com.linecorp.centraldogma.common.RepositoryNotFoundException; +38 import com.linecorp.centraldogma.internal.Util; +39 import com.linecorp.centraldogma.server.internal.storage.DirectoryBasedStorageManager; +40 import com.linecorp.centraldogma.server.internal.storage.repository.RepositoryCache; +41 import com.linecorp.centraldogma.server.storage.project.Project; +42 import com.linecorp.centraldogma.server.storage.repository.Repository; +43 import com.linecorp.centraldogma.server.storage.repository.RepositoryManager; +44 +45 public class GitRepositoryManager extends DirectoryBasedStorageManager<Repository> +46 implements RepositoryManager { +47 +48 private static final Logger logger = LoggerFactory.getLogger(GitRepositoryManager.class); +49 +50 private final Project parent; +51 private final Executor repositoryWorker; +52 +53 @Nullable +54 private final RepositoryCache cache; +55 +56 public GitRepositoryManager(Project parent, File rootDir, Executor repositoryWorker, +57 Executor purgeWorker, @Nullable RepositoryCache cache) { +58 super(rootDir, Repository.class, purgeWorker); +59 this.parent = requireNonNull(parent, "parent"); +60 this.repositoryWorker = requireNonNull(repositoryWorker, "repositoryWorker"); +61 this.cache = cache; +62 init(); 63 } 64 65 @Override -66 protected Repository createChild(File childDir, Author author, long creationTimeMillis) throws Exception { -67 return new GitRepository(parent, childDir, repositoryWorker, -68 creationTimeMillis, author, cache); -69 } -70 -71 @Override -72 protected void closeChild(File childDir, Repository child, -73 Supplier<CentralDogmaException> failureCauseSupplier) { -74 ((GitRepository) child).close(failureCauseSupplier); -75 } -76 -77 @Override -78 protected CentralDogmaException newStorageExistsException(String name) { -79 return new RepositoryExistsException(parent().name() + '/' + name); -80 } -81 -82 @Override -83 protected CentralDogmaException newStorageNotFoundException(String name) { -84 return new RepositoryNotFoundException(parent().name() + '/' + name); +66 public Project parent() { +67 return parent; +68 } +69 +70 @Override +71 protected Repository openChild(File childDir) throws Exception { +72 return new GitRepository(parent, childDir, repositoryWorker, cache); +73 } +74 +75 private static void deleteCruft(File dir) throws IOException { +76 logger.info("Deleting the cruft from previous migration: {}", dir); +77 Util.deleteFileTree(dir); +78 logger.info("Deleted the cruft from previous migration: {}", dir); +79 } +80 +81 @Override +82 protected Repository createChild(File childDir, Author author, long creationTimeMillis) throws Exception { +83 return new GitRepository(parent, childDir, repositoryWorker, +84 creationTimeMillis, author, cache); 85 } -86 } +86 +87 @Override +88 protected void closeChild(File childDir, Repository child, +89 Supplier<CentralDogmaException> failureCauseSupplier) { +90 ((GitRepository) child).close(failureCauseSupplier); +91 } +92 +93 @Override +94 protected CentralDogmaException newStorageExistsException(String name) { +95 return new RepositoryExistsException(parent().name() + '/' + name); +96 } +97 +98 @Override +99 protected CentralDogmaException newStorageNotFoundException(String name) { +100 return new RepositoryNotFoundException(parent().name() + '/' + name); +101 } +102 +103 /** +104 * Logs the migration progress periodically. +105 */ +106 private static class MigrationProgressLogger implements BiConsumer<Integer, Integer> { +107 +108 private static final long REPORT_INTERVAL_NANOS = TimeUnit.SECONDS.toNanos(10); +109 +110 private final String name; +111 private final long startTimeNanos; +112 private long lastReportTimeNanos; +113 +114 MigrationProgressLogger(Repository repo) { +115 name = repo.parent().name() + '/' + repo.name(); +116 startTimeNanos = lastReportTimeNanos = System.nanoTime(); +117 } +118 +119 @Override +120 public void accept(Integer current, Integer total) { +121 final long currentTimeNanos = System.nanoTime(); +122 final long elapsedTimeNanos = currentTimeNanos - startTimeNanos; +123 if (currentTimeNanos - lastReportTimeNanos > REPORT_INTERVAL_NANOS) { +124 logger.info("{}: {}% ({}/{}) - took {}", +125 name, (int) ((double) current / total * 100), +126 current, total, TextFormatter.elapsed(elapsedTimeNanos)); +127 lastReportTimeNanos = currentTimeNanos; +128 } else if (current.equals(total)) { +129 logger.info("{}: 100% ({}/{}) - took {}", +130 name, current, total, +131 TextFormatter.elapsed(elapsedTimeNanos)); +132 } +133 } +134 } +135 }
    diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-frame.html index fd1b6769eb..eb417719f7 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.git + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.git @@ -47,6 +47,9 @@

    Classes

  • LruMap +
  • +
  • + MigrationProgressLogger
  • PathPatternFilter diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-summary.html index ede687271a..95f9a0afa6 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/git/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.git + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository.git @@ -89,6 +89,11 @@

    Package com.linecorp.centraldogma.server.internal.storage.repository.git

    LruMap + + + + MigrationProgressLogger + diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-frame.html index 1059b264a1..130d32ebc5 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository diff --git a/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-summary.html index 8291b6a48b..06273112c5 100644 --- a/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/storage/repository/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.storage.repository diff --git a/xref/com/linecorp/centraldogma/server/internal/thrift/package-frame.html b/xref/com/linecorp/centraldogma/server/internal/thrift/package-frame.html index 309e5156a3..9bab1ed355 100644 --- a/xref/com/linecorp/centraldogma/server/internal/thrift/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/internal/thrift/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.thrift + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.thrift diff --git a/xref/com/linecorp/centraldogma/server/internal/thrift/package-summary.html b/xref/com/linecorp/centraldogma/server/internal/thrift/package-summary.html index 4ab07b518e..538b7f667c 100644 --- a/xref/com/linecorp/centraldogma/server/internal/thrift/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/internal/thrift/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.internal.thrift + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.internal.thrift diff --git a/xref/com/linecorp/centraldogma/server/management/package-frame.html b/xref/com/linecorp/centraldogma/server/management/package-frame.html index ce178c043a..ee615c2eb2 100644 --- a/xref/com/linecorp/centraldogma/server/management/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/management/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.management + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.management diff --git a/xref/com/linecorp/centraldogma/server/management/package-summary.html b/xref/com/linecorp/centraldogma/server/management/package-summary.html index 0dc94a21d9..c25cc31bab 100644 --- a/xref/com/linecorp/centraldogma/server/management/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/management/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.management + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.management diff --git a/xref/com/linecorp/centraldogma/server/metadata/package-frame.html b/xref/com/linecorp/centraldogma/server/metadata/package-frame.html index e0c824d151..5c9e505ea4 100644 --- a/xref/com/linecorp/centraldogma/server/metadata/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/metadata/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.metadata + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.metadata diff --git a/xref/com/linecorp/centraldogma/server/metadata/package-summary.html b/xref/com/linecorp/centraldogma/server/metadata/package-summary.html index c3d289d506..2aadefc1bf 100644 --- a/xref/com/linecorp/centraldogma/server/metadata/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/metadata/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.metadata + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.metadata diff --git a/xref/com/linecorp/centraldogma/server/mirror/MirrorCredential.html b/xref/com/linecorp/centraldogma/server/mirror/MirrorCredential.html index 17a096211f..d18877c61d 100644 --- a/xref/com/linecorp/centraldogma/server/mirror/MirrorCredential.html +++ b/xref/com/linecorp/centraldogma/server/mirror/MirrorCredential.html @@ -80,12 +80,7 @@ 72 * @param uri a URI of a Git repository 73 */ 74 boolean matches(URI uri); -75 -76 /** -77 * Returns a new {@link MirrorCredential} that does not contain any sensitive information. -78 */ -79 MirrorCredential withoutSecret(); -80 } +75 }
    diff --git a/xref/com/linecorp/centraldogma/server/mirror/package-frame.html b/xref/com/linecorp/centraldogma/server/mirror/package-frame.html index ffa128444f..3297b6e77a 100644 --- a/xref/com/linecorp/centraldogma/server/mirror/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/mirror/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.mirror + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.mirror diff --git a/xref/com/linecorp/centraldogma/server/mirror/package-summary.html b/xref/com/linecorp/centraldogma/server/mirror/package-summary.html index fe4ca34a2f..4323a076e4 100644 --- a/xref/com/linecorp/centraldogma/server/mirror/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/mirror/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.mirror + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.mirror diff --git a/xref/com/linecorp/centraldogma/server/package-frame.html b/xref/com/linecorp/centraldogma/server/package-frame.html index 775195193b..6545f74ca6 100644 --- a/xref/com/linecorp/centraldogma/server/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server diff --git a/xref/com/linecorp/centraldogma/server/package-summary.html b/xref/com/linecorp/centraldogma/server/package-summary.html index d2366693b2..daa07f0e6e 100644 --- a/xref/com/linecorp/centraldogma/server/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server diff --git a/xref/com/linecorp/centraldogma/server/plugin/package-frame.html b/xref/com/linecorp/centraldogma/server/plugin/package-frame.html index 28dca1dfa7..6aeae30cfa 100644 --- a/xref/com/linecorp/centraldogma/server/plugin/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/plugin/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.plugin + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.plugin diff --git a/xref/com/linecorp/centraldogma/server/plugin/package-summary.html b/xref/com/linecorp/centraldogma/server/plugin/package-summary.html index 932e0e2d15..856ecf19c3 100644 --- a/xref/com/linecorp/centraldogma/server/plugin/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/plugin/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.plugin + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.plugin diff --git a/xref/com/linecorp/centraldogma/server/storage/package-frame.html b/xref/com/linecorp/centraldogma/server/storage/package-frame.html index cb3d891767..63798756b5 100644 --- a/xref/com/linecorp/centraldogma/server/storage/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/storage/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage diff --git a/xref/com/linecorp/centraldogma/server/storage/package-summary.html b/xref/com/linecorp/centraldogma/server/storage/package-summary.html index d16def394f..8e32079044 100644 --- a/xref/com/linecorp/centraldogma/server/storage/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/storage/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage diff --git a/xref/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html b/xref/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html index adec49cdda..bdf4f2d928 100644 --- a/xref/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html +++ b/xref/com/linecorp/centraldogma/server/storage/project/InternalProjectInitializer.html @@ -24,145 +24,136 @@ 16 17 package com.linecorp.centraldogma.server.storage.project; 18 -19 import static com.google.common.base.Preconditions.checkArgument; -20 import static com.linecorp.centraldogma.server.command.Command.createProject; -21 import static com.linecorp.centraldogma.server.command.Command.createRepository; -22 import static com.linecorp.centraldogma.server.command.Command.push; -23 import static java.util.Objects.requireNonNull; -24 -25 import java.util.List; -26 import java.util.concurrent.CompletableFuture; -27 -28 import com.google.common.collect.ImmutableList; -29 -30 import com.linecorp.armeria.common.util.Exceptions; -31 import com.linecorp.centraldogma.common.Author; -32 import com.linecorp.centraldogma.common.Change; -33 import com.linecorp.centraldogma.common.ChangeConflictException; -34 import com.linecorp.centraldogma.common.Markup; -35 import com.linecorp.centraldogma.common.ProjectExistsException; -36 import com.linecorp.centraldogma.common.ReadOnlyException; -37 import com.linecorp.centraldogma.common.RepositoryExistsException; -38 import com.linecorp.centraldogma.common.Revision; -39 import com.linecorp.centraldogma.internal.Jackson; -40 import com.linecorp.centraldogma.server.command.CommandExecutor; -41 import com.linecorp.centraldogma.server.metadata.MetadataService; -42 import com.linecorp.centraldogma.server.metadata.Tokens; -43 -44 /** -45 * Initializes the internal project and repositories. -46 */ -47 public final class InternalProjectInitializer { -48 -49 public static final String INTERNAL_PROJECT_DOGMA = "dogma"; -50 -51 private final CommandExecutor executor; -52 private final CompletableFuture<Void> initialFuture = new CompletableFuture<>(); -53 -54 /** -55 * Creates a new instance. -56 */ -57 public InternalProjectInitializer(CommandExecutor executor) { -58 this.executor = executor; -59 } -60 -61 /** -62 * Creates an internal project and repositories and a token storage to {@code dogma/dogma/tokens.json}. -63 */ -64 public void initialize() { -65 try { -66 initialize0(INTERNAL_PROJECT_DOGMA); -67 initializeTokens(); -68 initialFuture.complete(null); -69 } catch (Exception cause) { -70 initialFuture.completeExceptionally(cause); -71 } -72 } -73 -74 /** -75 * Creates the specified internal project and its internal repositories. -76 */ -77 public void initialize(String projectName) { -78 requireNonNull(projectName, "projectName"); -79 checkArgument(!INTERNAL_PROJECT_DOGMA.equals(projectName), -80 "Use initialize() to create %s", projectName); -81 initialize0(projectName); -82 } -83 -84 /** -85 * Creates an internal project and repositories such as a token storage. -86 */ -87 public void initialize0(String projectName) { -88 final long creationTimeMillis = System.currentTimeMillis(); -89 try { -90 executor.execute(createProject(creationTimeMillis, Author.SYSTEM, projectName)) -91 .get(); -92 } catch (Throwable cause) { -93 final Throwable peeled = Exceptions.peel(cause); -94 if (peeled instanceof ReadOnlyException) { -95 // The executor has stopped right after starting up. -96 return; -97 } -98 if (!(peeled instanceof ProjectExistsException)) { -99 throw new Error("failed to initialize an internal project: " + projectName, peeled); -100 } -101 } -102 -103 // These repositories might be created when creating an internal project, but we try to create them -104 // again here in order to make sure them exist because sometimes their names are changed. -105 initializeInternalRepos(projectName, Project.internalRepos(), creationTimeMillis); -106 } -107 -108 private void initializeTokens() { -109 try { -110 final Change<?> change = Change.ofJsonPatch(MetadataService.TOKEN_JSON, -111 null, Jackson.valueToTree(new Tokens())); -112 final String commitSummary = "Initialize the token list file: /" + INTERNAL_PROJECT_DOGMA + '/' + -113 Project.REPO_DOGMA + MetadataService.TOKEN_JSON; -114 executor.execute(push(Author.SYSTEM, INTERNAL_PROJECT_DOGMA, Project.REPO_DOGMA, Revision.HEAD, -115 commitSummary, "", Markup.PLAINTEXT, ImmutableList.of(change))) -116 .get(); -117 } catch (Throwable cause) { -118 final Throwable peeled = Exceptions.peel(cause); -119 if (peeled instanceof ReadOnlyException || peeled instanceof ChangeConflictException) { -120 return; -121 } -122 throw new Error("failed to initialize the token list file", peeled); -123 } -124 } -125 -126 /** -127 * Returns a {@link CompletableFuture} which is completed when the internal project and repositories are -128 * ready. -129 */ -130 public CompletableFuture<Void> whenInitialized() { -131 return initialFuture; -132 } -133 -134 /** -135 * Creates the specified internal repositories in the internal project. -136 */ -137 private void initializeInternalRepos(String projectName, List<String> internalRepos, -138 long creationTimeMillis) { -139 requireNonNull(internalRepos, "internalRepos"); -140 for (final String repo : internalRepos) { -141 try { -142 executor.execute(createRepository(creationTimeMillis, Author.SYSTEM, projectName, repo)) -143 .get(); -144 } catch (Throwable cause) { -145 final Throwable peeled = Exceptions.peel(cause); -146 if (peeled instanceof ReadOnlyException) { -147 // The executor has stopped right after starting up. -148 return; -149 } -150 if (!(peeled instanceof RepositoryExistsException)) { -151 throw new Error("failed to initialize an internal repository: " + projectName + -152 '/' + repo, peeled); -153 } -154 } -155 } -156 } -157 } +19 import static com.linecorp.centraldogma.server.command.Command.createProject; +20 import static com.linecorp.centraldogma.server.command.Command.createRepository; +21 import static com.linecorp.centraldogma.server.command.Command.push; +22 import static java.util.Objects.requireNonNull; +23 +24 import java.util.List; +25 import java.util.concurrent.CompletableFuture; +26 +27 import com.google.common.collect.ImmutableList; +28 +29 import com.linecorp.armeria.common.util.Exceptions; +30 import com.linecorp.centraldogma.common.Author; +31 import com.linecorp.centraldogma.common.Change; +32 import com.linecorp.centraldogma.common.ChangeConflictException; +33 import com.linecorp.centraldogma.common.Markup; +34 import com.linecorp.centraldogma.common.ProjectExistsException; +35 import com.linecorp.centraldogma.common.ReadOnlyException; +36 import com.linecorp.centraldogma.common.RepositoryExistsException; +37 import com.linecorp.centraldogma.common.Revision; +38 import com.linecorp.centraldogma.internal.Jackson; +39 import com.linecorp.centraldogma.server.command.CommandExecutor; +40 import com.linecorp.centraldogma.server.metadata.MetadataService; +41 import com.linecorp.centraldogma.server.metadata.Tokens; +42 +43 /** +44 * Initializes the internal project and repositories. +45 */ +46 public final class InternalProjectInitializer { +47 +48 public static final String INTERNAL_PROJECT_DOGMA = "dogma"; +49 +50 private final CommandExecutor executor; +51 private final CompletableFuture<Void> initialFuture = new CompletableFuture<>(); +52 +53 /** +54 * Creates a new instance. +55 */ +56 public InternalProjectInitializer(CommandExecutor executor) { +57 this.executor = executor; +58 } +59 +60 /** +61 * Creates an internal project and repositories such as a token storage. +62 */ +63 public void initialize() { +64 try { +65 initialize0(); +66 initialFuture.complete(null); +67 } catch (Exception cause) { +68 initialFuture.completeExceptionally(cause); +69 } +70 } +71 +72 /** +73 * Creates an internal project and repositories such as a token storage. +74 */ +75 public void initialize0() { +76 final long creationTimeMillis = System.currentTimeMillis(); +77 try { +78 executor.execute(createProject(creationTimeMillis, Author.SYSTEM, INTERNAL_PROJECT_DOGMA)) +79 .get(); +80 } catch (Throwable cause) { +81 final Throwable peeled = Exceptions.peel(cause); +82 if (peeled instanceof ReadOnlyException) { +83 // The executor has stopped right after starting up. +84 return; +85 } +86 if (!(peeled instanceof ProjectExistsException)) { +87 throw new Error("failed to initialize an internal project: " + INTERNAL_PROJECT_DOGMA, peeled); +88 } +89 } +90 +91 // These repositories might be created when creating an internal project, but we try to create them +92 // again here in order to make sure them exist because sometimes their names are changed. +93 initializeInternalRepos(Project.internalRepos(), creationTimeMillis); +94 +95 try { +96 final Change<?> change = Change.ofJsonPatch(MetadataService.TOKEN_JSON, +97 null, Jackson.valueToTree(new Tokens())); +98 final String commitSummary = "Initialize the token list file: /" + INTERNAL_PROJECT_DOGMA + '/' + +99 Project.REPO_DOGMA + MetadataService.TOKEN_JSON; +100 executor.execute(push(Author.SYSTEM, INTERNAL_PROJECT_DOGMA, Project.REPO_DOGMA, Revision.HEAD, +101 commitSummary, "", Markup.PLAINTEXT, ImmutableList.of(change))) +102 .get(); +103 } catch (Throwable cause) { +104 final Throwable peeled = Exceptions.peel(cause); +105 if (peeled instanceof ReadOnlyException || peeled instanceof ChangeConflictException) { +106 return; +107 } +108 throw new Error("failed to initialize the token list file", peeled); +109 } +110 } +111 +112 /** +113 * Returns a {@link CompletableFuture} which is completed when the internal project and repositories are +114 * ready. +115 */ +116 public CompletableFuture<Void> whenInitialized() { +117 return initialFuture; +118 } +119 +120 /** +121 * Creates the specified internal repositories in the internal project. +122 */ +123 public void initializeInternalRepos(List<String> internalRepos) { +124 requireNonNull(internalRepos, "internalRepos"); +125 final long creationTimeMillis = System.currentTimeMillis(); +126 initializeInternalRepos(internalRepos, creationTimeMillis); +127 } +128 +129 private void initializeInternalRepos(List<String> internalRepos, long creationTimeMillis) { +130 for (final String repo : internalRepos) { +131 try { +132 executor.execute(createRepository(creationTimeMillis, Author.SYSTEM, +133 INTERNAL_PROJECT_DOGMA, repo)) +134 .get(); +135 } catch (Throwable cause) { +136 final Throwable peeled = Exceptions.peel(cause); +137 if (peeled instanceof ReadOnlyException) { +138 // The executor has stopped right after starting up. +139 return; +140 } +141 if (!(peeled instanceof RepositoryExistsException)) { +142 throw new Error("failed to initialize an internal repository: " + INTERNAL_PROJECT_DOGMA + +143 '/' + repo, peeled); +144 } +145 } +146 } +147 } +148 }
    diff --git a/xref/com/linecorp/centraldogma/server/storage/project/package-frame.html b/xref/com/linecorp/centraldogma/server/storage/project/package-frame.html index 63b015a662..c18563fbcf 100644 --- a/xref/com/linecorp/centraldogma/server/storage/project/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/storage/project/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage.project + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage.project diff --git a/xref/com/linecorp/centraldogma/server/storage/project/package-summary.html b/xref/com/linecorp/centraldogma/server/storage/project/package-summary.html index 5f319da4d6..e1d2ad3aa7 100644 --- a/xref/com/linecorp/centraldogma/server/storage/project/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/storage/project/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage.project + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage.project diff --git a/xref/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html b/xref/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html deleted file mode 100644 index 7e09ff3954..0000000000 --- a/xref/com/linecorp/centraldogma/server/storage/repository/DiffResultType.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -DiffResultType xref - - - -
    -1   /*
    -2    * Copyright 2024 LINE Corporation
    -3    *
    -4    * LINE Corporation licenses this file to you under the Apache License,
    -5    * version 2.0 (the "License"); you may not use this file except in compliance
    -6    * with the License. You may obtain a copy of the License at:
    -7    *
    -8    *   https://www.apache.org/licenses/LICENSE-2.0
    -9    *
    -10   * Unless required by applicable law or agreed to in writing, software
    -11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    -12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    -13   * License for the specific language governing permissions and limitations
    -14   * under the License.
    -15   */
    -16  package com.linecorp.centraldogma.server.storage.repository;
    -17  
    -18  import com.linecorp.centraldogma.common.Change;
    -19  
    -20  /**
    -21   * The options for diffing a repository.
    -22   */
    -23  public enum DiffResultType {
    -24  
    -25      /**
    -26       * Normal diff.
    -27       */
    -28      NORMAL,
    -29  
    -30      /**
    -31       * The option for creating {@link Change#ofJsonUpsert(String, String)} and
    -32       * {@link Change#ofTextUpsert(String, String)} with the new content instead of creating
    -33       * {@link Change#ofJsonPatch(String, String)} and {@link Change#ofTextPatch(String, String)}.
    -34       */
    -35      PATCH_TO_UPSERT
    -36  }
    -
    -
    - - - diff --git a/xref/com/linecorp/centraldogma/server/storage/repository/Repository.html b/xref/com/linecorp/centraldogma/server/storage/repository/Repository.html index d7e07483f3..85299ae617 100644 --- a/xref/com/linecorp/centraldogma/server/storage/repository/Repository.html +++ b/xref/com/linecorp/centraldogma/server/storage/repository/Repository.html @@ -238,330 +238,303 @@ 230 * Query a file at two different revisions and return the diff of the two query results. 231 */ 232 default CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query) { -233 return diff(from, to, query, DiffResultType.NORMAL); -234 } -235 -236 /** -237 * Query a file at two different revisions and return the diff of the two query results. -238 */ -239 default CompletableFuture<Change<?>> diff(Revision from, Revision to, Query<?> query, -240 DiffResultType diffResultType) { -241 requireNonNull(from, "from"); -242 requireNonNull(to, "to"); -243 requireNonNull(query, "query"); -244 requireNonNull(diffResultType, "diffResultType"); -245 -246 final RevisionRange range; -247 try { -248 range = normalizeNow(from, to).toAscending(); -249 } catch (Exception e) { -250 return CompletableFutures.exceptionallyCompletedFuture(e); -251 } +233 requireNonNull(from, "from"); +234 requireNonNull(to, "to"); +235 requireNonNull(query, "query"); +236 +237 final RevisionRange range; +238 try { +239 range = normalizeNow(from, to).toAscending(); +240 } catch (Exception e) { +241 return CompletableFutures.exceptionallyCompletedFuture(e); +242 } +243 +244 final String path = query.path(); +245 final CompletableFuture<Entry<?>> fromEntryFuture = getOrNull(range.from(), path); +246 final CompletableFuture<Entry<?>> toEntryFuture = getOrNull(range.to(), path); +247 +248 final CompletableFuture<Change<?>> future = +249 CompletableFutures.combine(fromEntryFuture, toEntryFuture, (fromEntry, toEntry) -> { +250 @SuppressWarnings("unchecked") +251 final Query<Object> castQuery = (Query<Object>) query; 252 -253 final String path = query.path(); -254 final CompletableFuture<Entry<?>> fromEntryFuture = getOrNull(range.from(), path); -255 final CompletableFuture<Entry<?>> toEntryFuture = getOrNull(range.to(), path); -256 -257 final CompletableFuture<Change<?>> future = -258 CompletableFutures.combine(fromEntryFuture, toEntryFuture, (fromEntry, toEntry) -> { -259 @SuppressWarnings("unchecked") -260 final Query<Object> castQuery = (Query<Object>) query; -261 -262 // Handle the case where the entry does not exist at 'from' or 'to'. -263 if (fromEntry != null) { -264 if (toEntry == null) { -265 // The entry has been removed. -266 return Change.ofRemoval(path); -267 } -268 } else if (toEntry != null) { -269 // The entry has been created. -270 final EntryType toEntryType = toEntry.type(); -271 if (!query.type().supportedEntryTypes().contains(toEntryType)) { -272 throw new QueryExecutionException("unsupported entry type: " + toEntryType); -273 } -274 -275 final Object toContent = castQuery.apply(toEntry.content()); -276 -277 switch (toEntryType) { -278 case JSON: -279 return Change.ofJsonUpsert(path, (JsonNode) toContent); -280 case TEXT: -281 return Change.ofTextUpsert(path, (String) toContent); -282 default: -283 throw new Error(); -284 } -285 } else { -286 // The entry did not exist both at 'from' and 'to'. -287 throw new EntryNotFoundException(path + " (" + from + ", " + to + ')'); -288 } -289 -290 // Handle the case where the entry exists both at 'from' and at 'to'. -291 final EntryType entryType = fromEntry.type(); -292 if (!query.type().supportedEntryTypes().contains(entryType)) { -293 throw new QueryExecutionException("unsupported entry type: " + entryType); -294 } -295 if (entryType != toEntry.type()) { -296 throw new QueryExecutionException( -297 "mismatching entry type: " + entryType + " != " + toEntry.type()); -298 } -299 -300 final Object fromContent = castQuery.apply(fromEntry.content()); -301 final Object toContent = castQuery.apply(toEntry.content()); -302 -303 switch (entryType) { -304 case JSON: -305 if (diffResultType == DiffResultType.PATCH_TO_UPSERT) { -306 return Change.ofJsonUpsert(path, (JsonNode) toContent); -307 } -308 return Change.ofJsonPatch(path, (JsonNode) fromContent, (JsonNode) toContent); -309 case TEXT: -310 if (diffResultType == DiffResultType.PATCH_TO_UPSERT) { -311 return Change.ofTextUpsert(path, (String) toContent); -312 } -313 return Change.ofTextPatch(path, (String) fromContent, (String) toContent); -314 default: -315 throw new Error(); -316 } -317 }).toCompletableFuture(); -318 return unsafeCast(future); +253 // Handle the case where the entry does not exist at 'from' or 'to'. +254 if (fromEntry != null) { +255 if (toEntry == null) { +256 // The entry has been removed. +257 return Change.ofRemoval(path); +258 } +259 } else if (toEntry != null) { +260 // The entry has been created. +261 final EntryType toEntryType = toEntry.type(); +262 if (!query.type().supportedEntryTypes().contains(toEntryType)) { +263 throw new QueryExecutionException("unsupported entry type: " + toEntryType); +264 } +265 +266 final Object toContent = castQuery.apply(toEntry.content()); +267 +268 switch (toEntryType) { +269 case JSON: +270 return Change.ofJsonUpsert(path, (JsonNode) toContent); +271 case TEXT: +272 return Change.ofTextUpsert(path, (String) toContent); +273 default: +274 throw new Error(); +275 } +276 } else { +277 // The entry did not exist both at 'from' and 'to'. +278 throw new EntryNotFoundException(path + " (" + from + ", " + to + ')'); +279 } +280 +281 // Handle the case where the entry exists both at 'from' and at 'to'. +282 final EntryType entryType = fromEntry.type(); +283 if (!query.type().supportedEntryTypes().contains(entryType)) { +284 throw new QueryExecutionException("unsupported entry type: " + entryType); +285 } +286 if (entryType != toEntry.type()) { +287 throw new QueryExecutionException( +288 "mismatching entry type: " + entryType + " != " + toEntry.type()); +289 } +290 +291 final Object fromContent = castQuery.apply(fromEntry.content()); +292 final Object toContent = castQuery.apply(toEntry.content()); +293 +294 switch (entryType) { +295 case JSON: +296 return Change.ofJsonPatch(path, (JsonNode) fromContent, (JsonNode) toContent); +297 case TEXT: +298 return Change.ofTextPatch(path, (String) fromContent, (String) toContent); +299 default: +300 throw new Error(); +301 } +302 }).toCompletableFuture(); +303 +304 return unsafeCast(future); +305 } +306 +307 /** +308 * Returns the diff for all files that are matched by the specified {@code pathPattern} +309 * between the specified two {@link Revision}s. +310 */ +311 CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern); +312 +313 /** +314 * Generates the preview diff against the specified {@code baseRevision} and {@code changes}. +315 */ +316 default CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Change<?>... changes) { +317 requireNonNull(changes, "changes"); +318 return previewDiff(baseRevision, Arrays.asList(changes)); 319 } 320 321 /** -322 * Returns the diff for all files that are matched by the specified {@code pathPattern} -323 * between the specified two {@link Revision}s. -324 * -325 * @throws StorageException if {@code from} or {@code to} does not exist. -326 */ -327 default CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern) { -328 return diff(from, to, pathPattern, DiffResultType.NORMAL); -329 } -330 -331 /** -332 * Returns the diff for all files that are matched by the specified {@code pathPattern} -333 * between the specified two {@link Revision}s. -334 * -335 * @throws StorageException if {@code from} or {@code to} does not exist. -336 */ -337 CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to, String pathPattern, -338 DiffResultType diffResultType); -339 -340 /** -341 * Generates the preview diff against the specified {@code baseRevision} and {@code changes}. -342 */ -343 default CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Change<?>... changes) { -344 requireNonNull(changes, "changes"); -345 return previewDiff(baseRevision, Arrays.asList(changes)); -346 } -347 -348 /** -349 * Generates the preview diff against the specified {@code baseRevision} and {@code changes}. -350 */ -351 CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Iterable<Change<?>> changes); -352 -353 /** -354 * Adds the specified changes to this {@link Repository}. -355 * -356 * @return the {@link Revision} of the new {@link Commit} -357 */ -358 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -359 Author author, String summary, Iterable<Change<?>> changes) { -360 return commit(baseRevision, commitTimeMillis, author, summary, "", Markup.PLAINTEXT, changes, -361 true); -362 } -363 -364 /** -365 * Adds the specified changes to this {@link Repository}. -366 * -367 * @return the {@link Revision} of the new {@link Commit} -368 */ -369 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -370 Author author, String summary, Change<?>... changes) { -371 return commit(baseRevision, commitTimeMillis, author, summary, "", Markup.PLAINTEXT, changes); -372 } -373 -374 /** -375 * Adds the specified changes to this {@link Repository}. -376 * -377 * @return the {@link Revision} of the new {@link Commit} -378 */ -379 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -380 Author author, String summary, String detail, Markup markup, -381 Change<?>... changes) { -382 requireNonNull(changes, "changes"); -383 return commit(baseRevision, commitTimeMillis, author, summary, detail, markup, -384 ImmutableList.copyOf(changes), true); -385 } -386 -387 /** -388 * Adds the specified changes to this {@link Repository}. -389 * -390 * @param baseRevision the base {@link Revision} of this {@link Commit} -391 * @param commitTimeMillis the time and date of this {@link Commit}, represented as the number of -392 * milliseconds since the epoch (midnight, January 1, 1970 UTC) -393 * @param author the {@link Author} of this {@link Commit} -394 * @param summary the human-readable summary of this {@link Commit} -395 * @param detail the human-readable detailed description of this {@link Commit} -396 * @param markup the {@link Markup} language of {@code summary} and {@code detail} -397 * @param changes the changes to be applied -398 * @param directExecution whether this {@link Commit} is received by this server and executed directly. -399 * {@code false} if this commit is delivered by a {@link ReplicationLog}. -400 * -401 * @return the {@link Revision} of the new {@link Commit} -402 */ -403 CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, -404 Author author, String summary, String detail, Markup markup, -405 Iterable<Change<?>> changes, boolean directExecution); -406 -407 /** -408 * Get a list of {@link Commit} for given pathPattern. -409 * -410 * @param from the starting revision (inclusive) -411 * @param to the end revision (inclusive) -412 * -413 * @param pathPattern the path pattern -414 * @return {@link Commit} -415 * -416 * @throws StorageException when any internal error occurs. -417 */ -418 default CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern) { -419 return history(from, to, pathPattern, DEFAULT_MAX_COMMITS); -420 } -421 -422 /** -423 * Get a list of {@link Commit} for given pathPattern. +322 * Generates the preview diff against the specified {@code baseRevision} and {@code changes}. +323 */ +324 CompletableFuture<Map<String, Change<?>>> previewDiff(Revision baseRevision, Iterable<Change<?>> changes); +325 +326 /** +327 * Adds the specified changes to this {@link Repository}. +328 * +329 * @return the {@link Revision} of the new {@link Commit} +330 */ +331 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +332 Author author, String summary, Iterable<Change<?>> changes) { +333 return commit(baseRevision, commitTimeMillis, author, summary, "", Markup.PLAINTEXT, changes, +334 true); +335 } +336 +337 /** +338 * Adds the specified changes to this {@link Repository}. +339 * +340 * @return the {@link Revision} of the new {@link Commit} +341 */ +342 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +343 Author author, String summary, Change<?>... changes) { +344 return commit(baseRevision, commitTimeMillis, author, summary, "", Markup.PLAINTEXT, changes); +345 } +346 +347 /** +348 * Adds the specified changes to this {@link Repository}. +349 * +350 * @return the {@link Revision} of the new {@link Commit} +351 */ +352 default CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +353 Author author, String summary, String detail, Markup markup, +354 Change<?>... changes) { +355 requireNonNull(changes, "changes"); +356 return commit(baseRevision, commitTimeMillis, author, summary, detail, markup, +357 ImmutableList.copyOf(changes), true); +358 } +359 +360 /** +361 * Adds the specified changes to this {@link Repository}. +362 * +363 * @param baseRevision the base {@link Revision} of this {@link Commit} +364 * @param commitTimeMillis the time and date of this {@link Commit}, represented as the number of +365 * milliseconds since the epoch (midnight, January 1, 1970 UTC) +366 * @param author the {@link Author} of this {@link Commit} +367 * @param summary the human-readable summary of this {@link Commit} +368 * @param detail the human-readable detailed description of this {@link Commit} +369 * @param markup the {@link Markup} language of {@code summary} and {@code detail} +370 * @param changes the changes to be applied +371 * @param directExecution whether this {@link Commit} is received by this server and executed directly. +372 * {@code false} if this commit is delivered by a {@link ReplicationLog}. +373 * +374 * @return the {@link Revision} of the new {@link Commit} +375 */ +376 CompletableFuture<CommitResult> commit(Revision baseRevision, long commitTimeMillis, +377 Author author, String summary, String detail, Markup markup, +378 Iterable<Change<?>> changes, boolean directExecution); +379 +380 /** +381 * Get a list of {@link Commit} for given pathPattern. +382 * +383 * @param from the starting revision (inclusive) +384 * @param to the end revision (inclusive) +385 * +386 * @param pathPattern the path pattern +387 * @return {@link Commit} +388 * +389 * @throws StorageException when any internal error occurs. +390 */ +391 default CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern) { +392 return history(from, to, pathPattern, DEFAULT_MAX_COMMITS); +393 } +394 +395 /** +396 * Get a list of {@link Commit} for given pathPattern. +397 * +398 * @param from the starting revision (inclusive) +399 * @param to the end revision (inclusive) +400 * @param maxCommits the maximum number of {@link Commit}s to return +401 * +402 * @param pathPattern the path pattern +403 * @return {@link Commit} +404 * +405 * @throws StorageException when any internal error occurs. +406 */ +407 CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern, int maxCommits); +408 +409 /** +410 * Returns the latest {@link Revision} if there are any {@link Change}s since {@code lastKnownRevision} +411 * that affected the path matched by the specified {@code pathPattern}. The behavior of this method could +412 * be represented as the following code: +413 * <pre>{@code +414 * RevisionRange range = repository.normalizeNow(lastKnownRevision, Revision.HEAD); +415 * return repository.diff(range.from(), range.to(), pathPattern).thenApply(diff -> { +416 * if (diff.isEmpty()) { +417 * return null; +418 * } else { +419 * return range.to(); +420 * } +421 * }); +422 * }</pre> +423 * .. although it would be implemented more efficiently. 424 * -425 * @param from the starting revision (inclusive) -426 * @param to the end revision (inclusive) -427 * @param maxCommits the maximum number of {@link Commit}s to return -428 * -429 * @param pathPattern the path pattern -430 * @return {@link Commit} -431 * -432 * @throws StorageException when any internal error occurs. -433 */ -434 CompletableFuture<List<Commit>> history(Revision from, Revision to, String pathPattern, int maxCommits); -435 -436 /** -437 * Returns the latest {@link Revision} if there are any {@link Change}s since {@code lastKnownRevision} -438 * that affected the path matched by the specified {@code pathPattern}. The behavior of this method could -439 * be represented as the following code: -440 * <pre>{@code -441 * RevisionRange range = repository.normalizeNow(lastKnownRevision, Revision.HEAD); -442 * return repository.diff(range.from(), range.to(), pathPattern).thenApply(diff -> { -443 * if (diff.isEmpty()) { -444 * return null; -445 * } else { -446 * return range.to(); -447 * } -448 * }); -449 * }</pre> -450 * .. although it would be implemented more efficiently. -451 * -452 * @return the latest {@link Revision} if there's a match, or {@code null} if there's no match or -453 * {@code lastKnownRevision} is the latest {@link Revision} -454 */ -455 default CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern) { -456 return findLatestRevision(lastKnownRevision, pathPattern, false); -457 } -458 -459 /** -460 * Returns the latest {@link Revision} if there are any {@link Change}s since {@code lastKnownRevision} -461 * that affected the path matched by the specified {@code pathPattern}. The behavior of this method could -462 * be represented as the following code: -463 * <pre>{@code -464 * RevisionRange range = repository.normalizeNow(lastKnownRevision, Revision.HEAD); -465 * return repository.diff(range.from(), range.to(), pathPattern).thenApply(diff -> { -466 * if (diff.isEmpty()) { -467 * return null; -468 * } else { -469 * return range.to(); -470 * } -471 * }); -472 * }</pre> -473 * .. although it would be implemented more efficiently. -474 * -475 * @return the latest {@link Revision} if there's a match, or {@code null} if there's no match or -476 * {@code lastKnownRevision} is the latest {@link Revision} -477 */ -478 CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, -479 boolean errorOnEntryNotFound); -480 -481 /** -482 * Awaits and retrieves the latest revision of the commit that changed the file that matches the specified -483 * {@code pathPattern} since the specified last known revision. -484 */ -485 default CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern) { -486 return watch(lastKnownRevision, pathPattern, false); -487 } -488 -489 /** -490 * Awaits and retrieves the latest revision of the commit that changed the file that matches the specified -491 * {@code pathPattern} since the specified last known revision. -492 */ -493 CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, -494 boolean errorOnEntryNotFound); -495 -496 /** -497 * Awaits and retrieves the change in the query result of the specified file asynchronously since the -498 * specified last known revision. -499 */ -500 default <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query) { -501 return watch(lastKnownRevision, query, false); -502 } -503 -504 /** -505 * Awaits and retrieves the change in the query result of the specified file asynchronously since the -506 * specified last known revision. -507 */ -508 default <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query, -509 boolean errorOnEntryNotFound) { -510 return RepositoryUtil.watch(this, lastKnownRevision, query, errorOnEntryNotFound); -511 } -512 -513 /** -514 * Merges the JSON files sequentially as specified in the {@link MergeQuery}. -515 */ -516 default <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { -517 requireNonNull(revision, "revision"); -518 requireNonNull(query, "query"); -519 -520 final List<MergeSource> mergeSources = query.mergeSources(); -521 // Only JSON files can currently be merged. -522 mergeSources.forEach(path -> validateJsonFilePath(path.path(), "path")); -523 -524 final Revision normalizedRevision; -525 try { -526 normalizedRevision = normalizeNow(revision); -527 } catch (Exception e) { -528 return CompletableFutures.exceptionallyCompletedFuture(e); -529 } -530 final List<CompletableFuture<Entry<?>>> entryFutures = new ArrayList<>(mergeSources.size()); -531 mergeSources.forEach(path -> { -532 if (!path.isOptional()) { -533 entryFutures.add(get(normalizedRevision, path.path())); -534 } else { -535 entryFutures.add(getOrNull(normalizedRevision, path.path())); -536 } -537 }); -538 -539 final CompletableFuture<MergedEntry<?>> mergedEntryFuture = mergeEntries(entryFutures, revision, -540 query); -541 final CompletableFuture<MergedEntry<T>> future = new CompletableFuture<>(); -542 mergedEntryFuture.handle((mergedEntry, cause) -> { -543 if (cause != null) { -544 if (!(cause instanceof CentralDogmaException)) { -545 cause = new QueryExecutionException(cause); -546 } -547 future.completeExceptionally(cause); -548 return null; -549 } -550 future.complete(unsafeCast(mergedEntry)); -551 return null; -552 }); -553 -554 return future; -555 } -556 } +425 * @return the latest {@link Revision} if there's a match, or {@code null} if there's no match or +426 * {@code lastKnownRevision} is the latest {@link Revision} +427 */ +428 default CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern) { +429 return findLatestRevision(lastKnownRevision, pathPattern, false); +430 } +431 +432 /** +433 * Returns the latest {@link Revision} if there are any {@link Change}s since {@code lastKnownRevision} +434 * that affected the path matched by the specified {@code pathPattern}. The behavior of this method could +435 * be represented as the following code: +436 * <pre>{@code +437 * RevisionRange range = repository.normalizeNow(lastKnownRevision, Revision.HEAD); +438 * return repository.diff(range.from(), range.to(), pathPattern).thenApply(diff -> { +439 * if (diff.isEmpty()) { +440 * return null; +441 * } else { +442 * return range.to(); +443 * } +444 * }); +445 * }</pre> +446 * .. although it would be implemented more efficiently. +447 * +448 * @return the latest {@link Revision} if there's a match, or {@code null} if there's no match or +449 * {@code lastKnownRevision} is the latest {@link Revision} +450 */ +451 CompletableFuture<Revision> findLatestRevision(Revision lastKnownRevision, String pathPattern, +452 boolean errorOnEntryNotFound); +453 +454 /** +455 * Awaits and retrieves the latest revision of the commit that changed the file that matches the specified +456 * {@code pathPattern} since the specified last known revision. +457 */ +458 default CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern) { +459 return watch(lastKnownRevision, pathPattern, false); +460 } +461 +462 /** +463 * Awaits and retrieves the latest revision of the commit that changed the file that matches the specified +464 * {@code pathPattern} since the specified last known revision. +465 */ +466 CompletableFuture<Revision> watch(Revision lastKnownRevision, String pathPattern, +467 boolean errorOnEntryNotFound); +468 +469 /** +470 * Awaits and retrieves the change in the query result of the specified file asynchronously since the +471 * specified last known revision. +472 */ +473 default <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query) { +474 return watch(lastKnownRevision, query, false); +475 } +476 +477 /** +478 * Awaits and retrieves the change in the query result of the specified file asynchronously since the +479 * specified last known revision. +480 */ +481 default <T> CompletableFuture<Entry<T>> watch(Revision lastKnownRevision, Query<T> query, +482 boolean errorOnEntryNotFound) { +483 return RepositoryUtil.watch(this, lastKnownRevision, query, errorOnEntryNotFound); +484 } +485 +486 /** +487 * Merges the JSON files sequentially as specified in the {@link MergeQuery}. +488 */ +489 default <T> CompletableFuture<MergedEntry<T>> mergeFiles(Revision revision, MergeQuery<T> query) { +490 requireNonNull(revision, "revision"); +491 requireNonNull(query, "query"); +492 +493 final List<MergeSource> mergeSources = query.mergeSources(); +494 // Only JSON files can currently be merged. +495 mergeSources.forEach(path -> validateJsonFilePath(path.path(), "path")); +496 +497 final Revision normalizedRevision; +498 try { +499 normalizedRevision = normalizeNow(revision); +500 } catch (Exception e) { +501 return CompletableFutures.exceptionallyCompletedFuture(e); +502 } +503 final List<CompletableFuture<Entry<?>>> entryFutures = new ArrayList<>(mergeSources.size()); +504 mergeSources.forEach(path -> { +505 if (!path.isOptional()) { +506 entryFutures.add(get(normalizedRevision, path.path())); +507 } else { +508 entryFutures.add(getOrNull(normalizedRevision, path.path())); +509 } +510 }); +511 +512 final CompletableFuture<MergedEntry<?>> mergedEntryFuture = mergeEntries(entryFutures, revision, +513 query); +514 final CompletableFuture<MergedEntry<T>> future = new CompletableFuture<>(); +515 mergedEntryFuture.handle((mergedEntry, cause) -> { +516 if (cause != null) { +517 if (!(cause instanceof CentralDogmaException)) { +518 cause = new QueryExecutionException(cause); +519 } +520 future.completeExceptionally(cause); +521 return null; +522 } +523 future.complete(unsafeCast(mergedEntry)); +524 return null; +525 }); +526 +527 return future; +528 } +529 }
    diff --git a/xref/com/linecorp/centraldogma/server/storage/repository/package-frame.html b/xref/com/linecorp/centraldogma/server/storage/repository/package-frame.html index 74d5579f34..edd7eb99ff 100644 --- a/xref/com/linecorp/centraldogma/server/storage/repository/package-frame.html +++ b/xref/com/linecorp/centraldogma/server/storage/repository/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage.repository + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage.repository @@ -16,9 +16,6 @@

    Classes

    • - DiffResultType -
    • -
    • FindOption
    • diff --git a/xref/com/linecorp/centraldogma/server/storage/repository/package-summary.html b/xref/com/linecorp/centraldogma/server/storage/repository/package-summary.html index c323ddd037..dae138d90c 100644 --- a/xref/com/linecorp/centraldogma/server/storage/repository/package-summary.html +++ b/xref/com/linecorp/centraldogma/server/storage/repository/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.server.storage.repository + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.server.storage.repository @@ -36,11 +36,6 @@

      Package com.linecorp.centraldogma.server.storage.repository

      - - DiffResultType - - - FindOption diff --git a/xref/com/linecorp/centraldogma/testing/internal/package-frame.html b/xref/com/linecorp/centraldogma/testing/internal/package-frame.html index 42af000899..41834e3bfe 100644 --- a/xref/com/linecorp/centraldogma/testing/internal/package-frame.html +++ b/xref/com/linecorp/centraldogma/testing/internal/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.internal diff --git a/xref/com/linecorp/centraldogma/testing/internal/package-summary.html b/xref/com/linecorp/centraldogma/testing/internal/package-summary.html index bee4f1a788..e6d7f674de 100644 --- a/xref/com/linecorp/centraldogma/testing/internal/package-summary.html +++ b/xref/com/linecorp/centraldogma/testing/internal/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.internal diff --git a/xref/com/linecorp/centraldogma/testing/junit/package-frame.html b/xref/com/linecorp/centraldogma/testing/junit/package-frame.html index 6fdb9b0603..8886b50af5 100644 --- a/xref/com/linecorp/centraldogma/testing/junit/package-frame.html +++ b/xref/com/linecorp/centraldogma/testing/junit/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.junit + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.junit diff --git a/xref/com/linecorp/centraldogma/testing/junit/package-summary.html b/xref/com/linecorp/centraldogma/testing/junit/package-summary.html index 17cfbbb9e3..b62d8143fe 100644 --- a/xref/com/linecorp/centraldogma/testing/junit/package-summary.html +++ b/xref/com/linecorp/centraldogma/testing/junit/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.junit + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.junit diff --git a/xref/com/linecorp/centraldogma/testing/junit4/package-frame.html b/xref/com/linecorp/centraldogma/testing/junit4/package-frame.html index 90424e7be1..c86f211477 100644 --- a/xref/com/linecorp/centraldogma/testing/junit4/package-frame.html +++ b/xref/com/linecorp/centraldogma/testing/junit4/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.junit4 + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.junit4 diff --git a/xref/com/linecorp/centraldogma/testing/junit4/package-summary.html b/xref/com/linecorp/centraldogma/testing/junit4/package-summary.html index 8242064fea..d374a3f72f 100644 --- a/xref/com/linecorp/centraldogma/testing/junit4/package-summary.html +++ b/xref/com/linecorp/centraldogma/testing/junit4/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.testing.junit4 + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.testing.junit4 diff --git a/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaSnapshotResources.html b/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaSnapshotResources.html index 0d65596e2a..504bc79c29 100644 --- a/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaSnapshotResources.html +++ b/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaSnapshotResources.html @@ -26,116 +26,95 @@ 18 19 import static com.google.common.collect.ImmutableList.toImmutableList; 20 -21 import java.util.List; -22 import java.util.Map; -23 import java.util.Objects; -24 -25 import com.google.common.collect.ImmutableMap; -26 import com.google.common.hash.Hashing; -27 import com.google.protobuf.Message; -28 -29 import com.linecorp.armeria.common.annotation.Nullable; -30 -31 import io.envoyproxy.controlplane.cache.ResourceVersionResolver; -32 import io.envoyproxy.controlplane.cache.Resources; -33 import io.envoyproxy.controlplane.cache.Resources.ResourceType; +21 import java.util.ArrayList; +22 import java.util.List; +23 import java.util.Map; +24 import java.util.Objects; +25 +26 import com.google.common.collect.ImmutableMap; +27 import com.google.common.hash.Hashing; +28 import com.google.protobuf.Message; +29 +30 import com.linecorp.centraldogma.common.Revision; +31 +32 import io.envoyproxy.controlplane.cache.ResourceVersionResolver; +33 import io.envoyproxy.controlplane.cache.Resources; 34 import io.envoyproxy.controlplane.cache.SnapshotResources; 35 import io.envoyproxy.controlplane.cache.VersionedResource; 36 37 final class CentralDogmaSnapshotResources<T extends Message> extends SnapshotResources<T> { 38 39 public static <T extends Message> SnapshotResources<T> create( -40 Map<String, Map<String, VersionedResource<T>>> resources, ResourceType resourceType) { +40 Iterable<T> resources, Revision revision) { 41 final ImmutableMap.Builder<String, VersionedResource<T>> versionedResourcesMap = ImmutableMap.builder(); 42 final ImmutableMap.Builder<String, T> resourcesMap = ImmutableMap.builder(); -43 for (Map<String, VersionedResource<T>> value : resources.values()) { -44 value.values().forEach(versionedResource -> { -45 final String resourceName = Resources.getResourceName(versionedResource.resource()); -46 versionedResourcesMap.put(resourceName, versionedResource); -47 resourcesMap.put(resourceName, versionedResource.resource()); -48 }); -49 } -50 return new CentralDogmaSnapshotResources<>( -51 versionedResourcesMap.build(), resourcesMap.build(), resourceType); -52 } -53 -54 private final Map<String, VersionedResource<T>> versionedResources; -55 private final Map<String, T> resources; -56 private final ResourceVersionResolver resourceVersionResolver; -57 @Nullable -58 private String allResourceVersion; -59 -60 private CentralDogmaSnapshotResources( -61 Map<String, VersionedResource<T>> versionedResources, ImmutableMap<String, T> resources, -62 ResourceType resourceType) { -63 this.versionedResources = versionedResources; -64 this.resources = resources; -65 resourceVersionResolver = resourceNames -> { -66 if (resourceNames.isEmpty()) { -67 return allResourceOrThrow(resourceType); -68 } -69 if (resourceNames.size() == 1) { -70 final String resourceName = resourceNames.get(0); -71 if ("*".equals(resourceName)) { -72 return allResourceOrThrow(resourceType); -73 } -74 final VersionedResource<T> versionedResource = versionedResources.get(resourceNames.get(0)); -75 if (versionedResource == null) { -76 return ""; -77 } -78 return versionedResource.version(); -79 } -80 -81 final List<VersionedResource<T>> collected = resourceNames.stream().sorted().distinct() -82 .map(versionedResources::get) -83 .filter(Objects::nonNull) -84 .collect(toImmutableList()); -85 if (collected.isEmpty()) { -86 // There is no resource with the given names. -87 return ""; -88 } -89 if (collected.size() == 1) { -90 return collected.get(0).version(); -91 } -92 if (collected.size() == versionedResources.size()) { -93 return allResourceVersion(); -94 } -95 -96 return Hashing.sha256().hashInt(collected.hashCode()).toString(); -97 }; +43 for (T resource : resources) { +44 final String resourceName = Resources.getResourceName(resource); +45 versionedResourcesMap.put(resourceName, VersionedResource.create(resource)); +46 resourcesMap.put(resourceName, resource); +47 } +48 return new CentralDogmaSnapshotResources<>(versionedResourcesMap.build(), resourcesMap.build(), +49 Integer.toString(revision.major())); +50 } +51 +52 private final Map<String, VersionedResource<T>> versionedResources; +53 private final Map<String, T> resources; +54 private final ResourceVersionResolver resourceVersionResolver; +55 +56 private CentralDogmaSnapshotResources( +57 Map<String, VersionedResource<T>> versionedResources, ImmutableMap<String, T> resources, +58 String allResourceVersion) { +59 this.versionedResources = versionedResources; +60 this.resources = resources; +61 resourceVersionResolver = resourceNames -> { +62 if (resourceNames.isEmpty()) { // All resources +63 return allResourceVersion; +64 } +65 if (resourceNames.size() == 1) { +66 final VersionedResource<T> versionedResource = versionedResources.get(resourceNames.get(0)); +67 if (versionedResource == null) { +68 return ""; +69 } +70 return versionedResource.version(); +71 } +72 final ArrayList<String> sorted = new ArrayList<>(resourceNames); +73 sorted.sort(String::compareTo); +74 +75 final List<VersionedResource<T>> collected = sorted.stream().map(versionedResources::get) +76 .filter(Objects::nonNull) +77 .distinct() +78 .collect(toImmutableList()); +79 if (collected.isEmpty()) { +80 // There is no resource with the given names. +81 return ""; +82 } +83 if (collected.size() == 1) { +84 return collected.get(0).version(); +85 } +86 if (collected.size() == versionedResources.size()) { +87 // All resources are included. +88 return allResourceVersion; +89 } +90 +91 return Hashing.sha256().hashInt(collected.hashCode()).toString(); +92 }; +93 } +94 +95 @Override +96 public Map<String, VersionedResource<T>> versionedResources() { +97 return versionedResources; 98 } 99 -100 private String allResourceOrThrow(ResourceType resourceType) { -101 if (resourceType == ResourceType.CLUSTER || resourceType == ResourceType.LISTENER) { -102 return allResourceVersion(); -103 } -104 throw new IllegalArgumentException("Requesting all resource isn't allowed for " + resourceType); -105 } -106 -107 private String allResourceVersion() { -108 if (allResourceVersion != null) { -109 return allResourceVersion; -110 } -111 return allResourceVersion = Hashing.sha256() -112 .hashInt(versionedResources.values().hashCode()) -113 .toString(); -114 } -115 -116 @Override -117 public Map<String, VersionedResource<T>> versionedResources() { -118 return versionedResources; -119 } -120 -121 @Override -122 public Map<String, T> resources() { -123 return resources; -124 } -125 -126 @Override -127 public ResourceVersionResolver resourceVersionResolver() { -128 return resourceVersionResolver; -129 } -130 } +100 @Override +101 public Map<String, T> resources() { +102 return resources; +103 } +104 +105 @Override +106 public ResourceVersionResolver resourceVersionResolver() { +107 return resourceVersionResolver; +108 } +109 }
      diff --git a/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaXdsResources.html b/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaXdsResources.html deleted file mode 100644 index 4b0f2bee3d..0000000000 --- a/xref/com/linecorp/centraldogma/xds/internal/CentralDogmaXdsResources.html +++ /dev/null @@ -1,175 +0,0 @@ - - - -CentralDogmaXdsResources xref - - - -
      -1   /*
      -2    * Copyright 2024 LINE Corporation
      -3    *
      -4    * LINE Corporation licenses this file to you under the Apache License,
      -5    * version 2.0 (the "License"); you may not use this file except in compliance
      -6    * with the License. You may obtain a copy of the License at:
      -7    *
      -8    *   https://www.apache.org/licenses/LICENSE-2.0
      -9    *
      -10   * Unless required by applicable law or agreed to in writing, software
      -11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
      -12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
      -13   * License for the specific language governing permissions and limitations
      -14   * under the License.
      -15   */
      -16  package com.linecorp.centraldogma.xds.internal;
      -17  
      -18  import java.util.HashMap;
      -19  import java.util.Map;
      -20  
      -21  import com.google.common.collect.ImmutableList;
      -22  
      -23  import io.envoyproxy.controlplane.cache.Resources.ResourceType;
      -24  import io.envoyproxy.controlplane.cache.SnapshotResources;
      -25  import io.envoyproxy.controlplane.cache.VersionedResource;
      -26  import io.envoyproxy.envoy.config.cluster.v3.Cluster;
      -27  import io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment;
      -28  import io.envoyproxy.envoy.config.listener.v3.Listener;
      -29  import io.envoyproxy.envoy.config.route.v3.RouteConfiguration;
      -30  import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.Secret;
      -31  
      -32  final class CentralDogmaXdsResources {
      -33  
      -34      private final Map<String, Map<String, VersionedResource<Cluster>>> clusterResources = new HashMap<>();
      -35      private final Map<String, Map<String, VersionedResource<ClusterLoadAssignment>>> endpointResources =
      -36              new HashMap<>();
      -37      private final Map<String, Map<String, VersionedResource<Listener>>> listenerResources = new HashMap<>();
      -38      private final Map<String, Map<String, VersionedResource<RouteConfiguration>>> routeResources =
      -39              new HashMap<>();
      -40      private boolean clusterUpdated;
      -41      private boolean endpointUpdated;
      -42      private boolean listenerUpdated;
      -43      private boolean routeUpdated;
      -44  
      -45      private CentralDogmaSnapshot currentSnapshot;
      -46  
      -47      CentralDogmaXdsResources() {
      -48          final SnapshotResources<?> emptyResources = SnapshotResources.create(ImmutableList.of(),
      -49                                                                               "empty_resources");
      -50          currentSnapshot = new CentralDogmaSnapshot((SnapshotResources<Cluster>) emptyResources,
      -51                                                     (SnapshotResources<ClusterLoadAssignment>) emptyResources,
      -52                                                     (SnapshotResources<Listener>) emptyResources,
      -53                                                     (SnapshotResources<RouteConfiguration>) emptyResources,
      -54                                                     (SnapshotResources<Secret>) emptyResources);
      -55      }
      -56  
      -57      void setCluster(String projectName, Cluster cluster) {
      -58          final Map<String, VersionedResource<Cluster>> projectClusters =
      -59                  clusterResources.computeIfAbsent(projectName, k -> new HashMap<>());
      -60          projectClusters.put(cluster.getName(), VersionedResource.create(cluster));
      -61          clusterUpdated = true;
      -62      }
      -63  
      -64      void setEndpoint(String projectName, ClusterLoadAssignment endpoint) {
      -65          final Map<String, VersionedResource<ClusterLoadAssignment>> projectEndpoints =
      -66                  endpointResources.computeIfAbsent(projectName, k -> new HashMap<>());
      -67          projectEndpoints.put(endpoint.getClusterName(), VersionedResource.create(endpoint));
      -68          endpointUpdated = true;
      -69      }
      -70  
      -71      void setListener(String projectName, Listener listener) {
      -72          final Map<String, VersionedResource<Listener>> projectListeners =
      -73                  listenerResources.computeIfAbsent(projectName, k -> new HashMap<>());
      -74          projectListeners.put(listener.getName(), VersionedResource.create(listener));
      -75          listenerUpdated = true;
      -76      }
      -77  
      -78      void setRoute(String projectName, RouteConfiguration route) {
      -79          final Map<String, VersionedResource<RouteConfiguration>> projectRoutes =
      -80                  routeResources.computeIfAbsent(projectName, k -> new HashMap<>());
      -81          projectRoutes.put(route.getName(), VersionedResource.create(route));
      -82          routeUpdated = true;
      -83      }
      -84  
      -85      void removeCluster(String projectName, String path) {
      -86          final Map<String, VersionedResource<Cluster>> projectClusters = clusterResources.get(projectName);
      -87          if (projectClusters == null) {
      -88              return;
      -89          }
      -90          clusterUpdated |= projectClusters.remove(path) != null;
      -91      }
      -92  
      -93      void removeEndpoint(String projectName, String path) {
      -94          final Map<String, VersionedResource<ClusterLoadAssignment>> projectEndpoints =
      -95                  endpointResources.get(projectName);
      -96          if (projectEndpoints == null) {
      -97              return;
      -98          }
      -99          endpointUpdated |= projectEndpoints.remove(path) != null;
      -100     }
      -101 
      -102     void removeListener(String projectName, String path) {
      -103         final Map<String, VersionedResource<Listener>> projectListeners = listenerResources.get(projectName);
      -104         if (projectListeners == null) {
      -105             return;
      -106         }
      -107         listenerUpdated |= projectListeners.remove(path) != null;
      -108     }
      -109 
      -110     void removeRoute(String projectName, String path) {
      -111         final Map<String, VersionedResource<RouteConfiguration>> projectRoutes =
      -112                 routeResources.get(projectName);
      -113         if (projectRoutes == null) {
      -114             return;
      -115         }
      -116         routeUpdated |= projectRoutes.remove(path) != null;
      -117     }
      -118 
      -119     CentralDogmaSnapshot snapshot() {
      -120         final SnapshotResources<Cluster> clusters;
      -121         if (clusterUpdated) {
      -122             clusters = CentralDogmaSnapshotResources.create(clusterResources, ResourceType.CLUSTER);
      -123             clusterUpdated = false;
      -124         } else {
      -125             clusters = currentSnapshot.clusters();
      -126         }
      -127 
      -128         final SnapshotResources<ClusterLoadAssignment> endpoints;
      -129         if (endpointUpdated) {
      -130             endpoints = CentralDogmaSnapshotResources.create(endpointResources, ResourceType.ENDPOINT);
      -131             endpointUpdated = false;
      -132         } else {
      -133             endpoints = currentSnapshot.endpoints();
      -134         }
      -135 
      -136         final SnapshotResources<Listener> listeners;
      -137         if (listenerUpdated) {
      -138             listeners = CentralDogmaSnapshotResources.create(listenerResources, ResourceType.LISTENER);
      -139             listenerUpdated = false;
      -140         } else {
      -141             listeners = currentSnapshot.listeners();
      -142         }
      -143 
      -144         final SnapshotResources<RouteConfiguration> routes;
      -145         if (routeUpdated) {
      -146             routes = CentralDogmaSnapshotResources.create(routeResources, ResourceType.ROUTE);
      -147             routeUpdated = false;
      -148         } else {
      -149             routes = currentSnapshot.routes();
      -150         }
      -151 
      -152         return currentSnapshot =
      -153                 new CentralDogmaSnapshot(clusters, endpoints, listeners, routes, currentSnapshot.secrets());
      -154     }
      -155 
      -156     void removeProject(String projectName) {
      -157         clusterUpdated |= clusterResources.remove(projectName) != null;
      -158         endpointUpdated |= endpointResources.remove(projectName) != null;
      -159         listenerUpdated |= listenerResources.remove(projectName) != null;
      -160         routeUpdated |= routeResources.remove(projectName) != null;
      -161     }
      -162 }
      -
      -
      - - - diff --git a/xref/com/linecorp/centraldogma/xds/internal/ControlPlanePlugin.html b/xref/com/linecorp/centraldogma/xds/internal/ControlPlanePlugin.html index ffb42137d0..52c084ba92 100644 --- a/xref/com/linecorp/centraldogma/xds/internal/ControlPlanePlugin.html +++ b/xref/com/linecorp/centraldogma/xds/internal/ControlPlanePlugin.html @@ -24,342 +24,322 @@ 16 17 package com.linecorp.centraldogma.xds.internal; 18 -19 import java.util.HashSet; -20 import java.util.Map; -21 import java.util.Set; -22 import java.util.concurrent.CompletableFuture; -23 import java.util.concurrent.CompletionStage; -24 import java.util.concurrent.Executors; -25 import java.util.concurrent.ScheduledExecutorService; -26 import java.util.concurrent.TimeUnit; -27 import java.util.function.BiFunction; -28 -29 import org.slf4j.Logger; -30 import org.slf4j.LoggerFactory; -31 -32 import com.fasterxml.jackson.databind.JsonNode; +19 import static com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer.INTERNAL_PROJECT_DOGMA; +20 +21 import java.util.Collection; +22 import java.util.Map; +23 import java.util.concurrent.CompletableFuture; +24 import java.util.concurrent.CompletionStage; +25 import java.util.concurrent.Executors; +26 import java.util.concurrent.ScheduledExecutorService; +27 import java.util.concurrent.TimeUnit; +28 import java.util.function.BiFunction; +29 +30 import org.slf4j.Logger; +31 import org.slf4j.LoggerFactory; +32 33 import com.google.common.base.MoreObjects; -34 import com.google.protobuf.InvalidProtocolBufferException; -35 -36 import com.linecorp.armeria.common.util.UnmodifiableFuture; -37 import com.linecorp.armeria.server.ServerBuilder; -38 import com.linecorp.armeria.server.grpc.GrpcService; -39 import com.linecorp.centraldogma.common.Change; -40 import com.linecorp.centraldogma.common.Entry; -41 import com.linecorp.centraldogma.common.Query; -42 import com.linecorp.centraldogma.common.RepositoryNotFoundException; -43 import com.linecorp.centraldogma.common.Revision; -44 import com.linecorp.centraldogma.server.metadata.MetadataService; -45 import com.linecorp.centraldogma.server.plugin.AllReplicasPlugin; -46 import com.linecorp.centraldogma.server.plugin.PluginContext; -47 import com.linecorp.centraldogma.server.plugin.PluginInitContext; -48 import com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer; -49 import com.linecorp.centraldogma.server.storage.project.Project; -50 import com.linecorp.centraldogma.server.storage.project.ProjectManager; -51 import com.linecorp.centraldogma.server.storage.repository.DiffResultType; -52 import com.linecorp.centraldogma.server.storage.repository.Repository; -53 import com.linecorp.centraldogma.server.storage.repository.RepositoryManager; -54 -55 import io.envoyproxy.controlplane.cache.v3.SimpleCache; -56 import io.envoyproxy.controlplane.server.DiscoveryServerCallbacks; -57 import io.envoyproxy.controlplane.server.V3DiscoveryServer; -58 import io.envoyproxy.controlplane.server.exception.RequestException; -59 import io.envoyproxy.envoy.config.cluster.v3.Cluster; -60 import io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment; -61 import io.envoyproxy.envoy.config.listener.v3.Listener; -62 import io.envoyproxy.envoy.config.route.v3.RouteConfiguration; -63 import io.envoyproxy.envoy.service.discovery.v3.DeltaDiscoveryRequest; -64 import io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest; -65 import io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse; -66 import io.netty.util.concurrent.DefaultThreadFactory; -67 -68 public final class ControlPlanePlugin extends AllReplicasPlugin { -69 -70 private static final Logger logger = LoggerFactory.getLogger(ControlPlanePlugin.class); -71 -72 static final String XDS_CENTRAL_DOGMA_PROJECT = "@xds"; +34 import com.google.common.collect.ImmutableList; +35 import com.google.common.collect.ImmutableList.Builder; +36 import com.google.protobuf.InvalidProtocolBufferException; +37 +38 import com.linecorp.armeria.common.util.UnmodifiableFuture; +39 import com.linecorp.armeria.server.ServerBuilder; +40 import com.linecorp.armeria.server.grpc.GrpcService; +41 import com.linecorp.centraldogma.common.Entry; +42 import com.linecorp.centraldogma.common.Revision; +43 import com.linecorp.centraldogma.server.plugin.AllReplicasPlugin; +44 import com.linecorp.centraldogma.server.plugin.PluginContext; +45 import com.linecorp.centraldogma.server.plugin.PluginInitContext; +46 import com.linecorp.centraldogma.server.storage.project.InternalProjectInitializer; +47 import com.linecorp.centraldogma.server.storage.repository.Repository; +48 import com.linecorp.centraldogma.server.storage.repository.RepositoryManager; +49 +50 import io.envoyproxy.controlplane.cache.Resources.ResourceType; +51 import io.envoyproxy.controlplane.cache.SnapshotResources; +52 import io.envoyproxy.controlplane.cache.v3.SimpleCache; +53 import io.envoyproxy.controlplane.cache.v3.Snapshot; +54 import io.envoyproxy.controlplane.server.DiscoveryServerCallbacks; +55 import io.envoyproxy.controlplane.server.V3DiscoveryServer; +56 import io.envoyproxy.controlplane.server.exception.RequestException; +57 import io.envoyproxy.envoy.config.cluster.v3.Cluster; +58 import io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment; +59 import io.envoyproxy.envoy.config.listener.v3.Listener; +60 import io.envoyproxy.envoy.config.route.v3.RouteConfiguration; +61 import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.Secret; +62 import io.envoyproxy.envoy.service.discovery.v3.DeltaDiscoveryRequest; +63 import io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest; +64 import io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse; +65 import io.netty.util.concurrent.DefaultThreadFactory; +66 +67 public final class ControlPlanePlugin extends AllReplicasPlugin { +68 +69 private static final Logger logger = LoggerFactory.getLogger(ControlPlanePlugin.class); +70 +71 public static final String CLUSTER_REPO = "clusters"; +72 public static final String CLUSTER_FILE = Cluster.getDescriptor().getFullName() + ".json"; 73 -74 static final String CLUSTERS_DIRECTORY = "/clusters/"; -75 static final String ENDPOINTS_DIRECTORY = "/endpoints/"; -76 static final String LISTENERS_DIRECTORY = "/listeners/"; -77 static final String ROUTES_DIRECTORY = "/routes/"; -78 -79 public static final String DEFAULT_GROUP = "default_group"; -80 -81 public static final long BACKOFF_SECONDS = 10; +74 public static final String ENDPOINT_REPO = "endpoints"; +75 public static final String ENDPOINT_FILE = ClusterLoadAssignment.getDescriptor().getFullName() + ".json"; +76 +77 public static final String LISTENER_REPO = "listeners"; +78 public static final String LISTENER_FILE = Listener.getDescriptor().getFullName() + ".json"; +79 +80 public static final String ROUTE_REPO = "routes"; +81 public static final String ROUTE_FILE = RouteConfiguration.getDescriptor().getFullName() + ".json"; 82 -83 private static final ScheduledExecutorService CONTROL_PLANE_EXECUTOR = -84 Executors.newSingleThreadScheduledExecutor( -85 new DefaultThreadFactory("control-plane-executor", true)); +83 public static final String DEFAULT_GROUP = "default_group"; +84 +85 public static final long BACKOFF_SECONDS = 60; // Should we use backoff? 86 -87 private volatile boolean stop; -88 -89 // TODO(minwoox): Implement better cache implementation that updates only changed resources -90 // instead of this snapshot based implementation. -91 private final SimpleCache<String> cache = new SimpleCache<>(node -> DEFAULT_GROUP); +87 private static final ScheduledExecutorService CONTROL_PLANE_EXECUTOR = +88 Executors.newSingleThreadScheduledExecutor( +89 new DefaultThreadFactory("control-plane-executor", true)); +90 +91 private volatile boolean stop; 92 -93 // Accessed only from CONTROL_PLANE_EXECUTOR. -94 private final Set<String> watchingXdsProjects = new HashSet<>(); -95 private final CentralDogmaXdsResources centralDogmaXdsResources = new CentralDogmaXdsResources(); -96 -97 @Override -98 public void init(PluginInitContext pluginInitContext) { -99 final InternalProjectInitializer projectInitializer = pluginInitContext.internalProjectInitializer(); -100 projectInitializer.initialize(XDS_CENTRAL_DOGMA_PROJECT); -101 -102 try { -103 CONTROL_PLANE_EXECUTOR.submit(() -> init0(pluginInitContext)) -104 .get(BACKOFF_SECONDS, TimeUnit.SECONDS); -105 } catch (Throwable t) { -106 throw new RuntimeException("Failed to init control plane plugin in " + BACKOFF_SECONDS + -107 " seconds.", t); -108 } -109 } -110 -111 private void init0(PluginInitContext pluginInitContext) { -112 final ServerBuilder sb = pluginInitContext.serverBuilder(); -113 final ProjectManager projectManager = pluginInitContext.projectManager(); -114 final RepositoryManager repositoryManager = projectManager.get(XDS_CENTRAL_DOGMA_PROJECT).repos(); -115 for (Repository repository : repositoryManager.list().values()) { -116 final String repoName = repository.name(); -117 if (Project.REPO_META.equals(repoName) || Project.REPO_DOGMA.equals(repoName)) { -118 continue; -119 } -120 // A Central Dogma repository is an xDS project. -121 watchingXdsProjects.add(repoName); -122 -123 final Revision normalizedRevision = repository.normalizeNow(Revision.HEAD); -124 logger.info("Creating xDS resources from {} project at revision: {}", repoName, normalizedRevision); -125 final Map<String, Entry<?>> entries = repository.find(normalizedRevision, "/**").join(); -126 for (Entry<?> entry : entries.values()) { -127 final String path = entry.path(); -128 final String contentAsText = entry.contentAsText(); -129 try { -130 setXdsResources(path, contentAsText, repoName); -131 } catch (Throwable t) { -132 throw new RuntimeException("Unexpected exception while building an xDS resource from " + -133 repoName + path, t); -134 } -135 } -136 -137 watchXdsProject(repository, normalizedRevision); -138 } -139 -140 // Watch dogma repository to add newly created xDS projects. -141 watchDogmaRepository(repositoryManager, Revision.INIT); -142 final V3DiscoveryServer server = new V3DiscoveryServer(new LoggingDiscoveryServerCallbacks(), cache); -143 final GrpcService grpcService = GrpcService.builder() -144 .addService(server.getClusterDiscoveryServiceImpl()) -145 .addService(server.getEndpointDiscoveryServiceImpl()) -146 .addService(server.getListenerDiscoveryServiceImpl()) -147 .addService(server.getRouteDiscoveryServiceImpl()) -148 .addService(server.getAggregatedDiscoveryServiceImpl()) -149 .useBlockingTaskExecutor(true) -150 .build(); -151 sb.route().build(grpcService); -152 } -153 -154 private void setXdsResources(String path, String contentAsText, String repoName) -155 throws InvalidProtocolBufferException { -156 if (path.startsWith(CLUSTERS_DIRECTORY)) { -157 final Cluster.Builder builder = Cluster.newBuilder(); -158 JsonFormatUtil.parser().merge(contentAsText, builder); -159 centralDogmaXdsResources.setCluster(repoName, builder.build()); -160 } else if (path.startsWith(ENDPOINTS_DIRECTORY)) { -161 final ClusterLoadAssignment.Builder builder = -162 ClusterLoadAssignment.newBuilder(); -163 JsonFormatUtil.parser().merge(contentAsText, builder); -164 centralDogmaXdsResources.setEndpoint(repoName, builder.build()); -165 } else if (path.startsWith(LISTENERS_DIRECTORY)) { -166 final Listener.Builder builder = Listener.newBuilder(); -167 JsonFormatUtil.parser().merge(contentAsText, builder); -168 centralDogmaXdsResources.setListener(repoName, builder.build()); -169 } else if (path.startsWith(ROUTES_DIRECTORY)) { -170 final RouteConfiguration.Builder builder = RouteConfiguration.newBuilder(); -171 JsonFormatUtil.parser().merge(contentAsText, builder); -172 centralDogmaXdsResources.setRoute(repoName, builder.build()); -173 } else { -174 // ignore -175 } -176 } -177 -178 private void watchDogmaRepository(RepositoryManager repositoryManager, Revision lastKnownRevision) { -179 final Repository dogmaRepository = repositoryManager.get(Project.REPO_DOGMA); -180 // TODO(minwoox): Use different file because metadata.json contains other information than repo's names. -181 dogmaRepository.watch(lastKnownRevision, Query.ofJson(MetadataService.METADATA_JSON)) -182 .handleAsync((entry, cause) -> { -183 if (cause != null) { -184 logger.warn("Failed to watch {} in xDS. Try watching after {} seconds.", -185 MetadataService.METADATA_JSON, BACKOFF_SECONDS, cause); -186 CONTROL_PLANE_EXECUTOR.schedule( -187 () -> watchDogmaRepository(repositoryManager, lastKnownRevision), -188 BACKOFF_SECONDS, TimeUnit.SECONDS); -189 return null; -190 } -191 final JsonNode content = entry.content(); -192 final JsonNode repos = content.get("repos"); -193 if (repos == null) { -194 logger.warn("Failed to find repos in {} in xDS. Try watching after {} seconds.", -195 MetadataService.METADATA_JSON, BACKOFF_SECONDS); -196 CONTROL_PLANE_EXECUTOR.schedule( -197 () -> watchDogmaRepository(repositoryManager, lastKnownRevision), -198 BACKOFF_SECONDS, TimeUnit.SECONDS); -199 return null; -200 } -201 repos.fieldNames().forEachRemaining(repoName -> { -202 if (Project.REPO_META.equals(repoName)) { -203 return; -204 } -205 final boolean added = watchingXdsProjects.add(repoName); -206 if (!added) { -207 // Already watching. -208 return; -209 } -210 final Repository repository = repositoryManager.get(repoName); -211 if (repository == null) { -212 // Ignore if the repository is removed. This can happen when multiple -213 // updates occurred after the actual repository is removed from the file -214 // system but before the repository is removed from the metadata file. -215 watchingXdsProjects.remove(repoName); -216 return; -217 } -218 watchXdsProject(repository, Revision.INIT); -219 }); -220 // Watch dogma repository again to catch up newly created xDS projects. -221 watchDogmaRepository(repositoryManager, entry.revision()); -222 return null; -223 }, CONTROL_PLANE_EXECUTOR); -224 } -225 -226 private void watchXdsProject(Repository repository, Revision lastKnownRevision) { -227 final CompletableFuture<Revision> watchFuture = repository.watch(lastKnownRevision, "/**"); -228 watchFuture.handleAsync((BiFunction<Revision, Throwable, Void>) (newRevision, cause) -> { -229 if (stop) { -230 return null; -231 } -232 if (cause != null) { -233 if (cause instanceof RepositoryNotFoundException) { -234 // Repository is removed. -235 watchingXdsProjects.remove(repository.name()); -236 centralDogmaXdsResources.removeProject(repository.name()); -237 cache.setSnapshot(DEFAULT_GROUP, centralDogmaXdsResources.snapshot()); -238 return null; -239 } -240 logger.warn("Unexpected exception while watching {} at {}. Try watching after {} seconds.", -241 repository.name(), lastKnownRevision, BACKOFF_SECONDS, cause); -242 CONTROL_PLANE_EXECUTOR.schedule(() -> watchXdsProject(repository, lastKnownRevision), -243 BACKOFF_SECONDS, TimeUnit.SECONDS); -244 return null; -245 } -246 final CompletableFuture<Map<String, Change<?>>> diffFuture = -247 repository.diff(lastKnownRevision, newRevision, "/**", DiffResultType.PATCH_TO_UPSERT); -248 handleDiff(repository, newRevision, diffFuture, lastKnownRevision); -249 return null; -250 }, CONTROL_PLANE_EXECUTOR); -251 } -252 -253 private void handleDiff(Repository repository, Revision newRevision, -254 CompletableFuture<Map<String, Change<?>>> diffFuture, Revision lastKnownRevision) { -255 diffFuture.handleAsync((BiFunction<Map<String, Change<?>>, Throwable, Void>) (changes, cause) -> { -256 if (stop) { -257 return null; -258 } -259 final String repoName = repository.name(); -260 if (cause != null) { -261 logger.warn("Unexpected exception while diffing {} from {} to {}. Building from the first.", -262 repoName, lastKnownRevision, newRevision, cause); -263 centralDogmaXdsResources.removeProject(repoName); -264 // Do not call cache.setSnapshot(). Let watchXdsProject() create a new snapshot. -265 watchXdsProject(repository, Revision.INIT); -266 return null; -267 } -268 -269 logger.info("Creating xDS resources from {} project using {} to {}. The number of changes: {}", -270 repoName, lastKnownRevision, newRevision, changes.size()); -271 for (Change<?> change : changes.values()) { -272 final String path = change.path(); -273 switch (change.type()) { -274 case UPSERT_JSON: -275 try { -276 setXdsResources(path, change.contentAsText(), repoName); -277 } catch (Throwable t) { -278 logger.warn("Unexpected exception while building an xDS resource from {}.", -279 repoName + path, t); -280 } -281 break; -282 case REMOVE: -283 if (path.startsWith(CLUSTERS_DIRECTORY)) { -284 centralDogmaXdsResources.removeCluster(repoName, path); -285 } else if (path.startsWith(ENDPOINTS_DIRECTORY)) { -286 centralDogmaXdsResources.removeEndpoint(repoName, path); -287 } else if (path.startsWith(LISTENERS_DIRECTORY)) { -288 centralDogmaXdsResources.removeListener(repoName, path); -289 } else if (path.startsWith(ROUTES_DIRECTORY)) { -290 centralDogmaXdsResources.removeRoute(repoName, path); -291 } -292 break; -293 default: -294 // Ignore other types of changes. -295 // No APPLY_JSON_PATCH because the diff option. -296 // No RENAME because the resource name in the content always have to be -297 // changed if the file is renamed. -298 if (lastKnownRevision.major() != 1) { -299 logger.warn("Unexpected change type: {} from {} to {} at {}.", -300 change.type(), lastKnownRevision, newRevision, path); -301 } -302 break; -303 } -304 } -305 cache.setSnapshot(DEFAULT_GROUP, centralDogmaXdsResources.snapshot()); -306 watchXdsProject(repository, newRevision); -307 return null; -308 }, CONTROL_PLANE_EXECUTOR); -309 } -310 -311 @Override -312 public CompletionStage<Void> start(PluginContext context) { -313 return UnmodifiableFuture.completedFuture(null); -314 } -315 -316 @Override -317 public CompletionStage<Void> stop(PluginContext context) { -318 stop = true; -319 return UnmodifiableFuture.completedFuture(null); -320 } -321 -322 @Override -323 public Class<?> configType() { -324 return ControlPlanePluginConfig.class; -325 } -326 -327 @Override -328 public String toString() { -329 return MoreObjects.toStringHelper(this) -330 .add("configType", configType()) -331 .add("target", target()) -332 .toString(); +93 @Override +94 public void init(PluginInitContext pluginInitContext) { +95 final InternalProjectInitializer projectInitializer = pluginInitContext.internalProjectInitializer(); +96 projectInitializer.initializeInternalRepos( +97 ImmutableList.of(CLUSTER_REPO, ENDPOINT_REPO, LISTENER_REPO, ROUTE_REPO)); +98 +99 final ServerBuilder sb = pluginInitContext.serverBuilder(); +100 +101 // TODO(minwoox): Implement better cache implementation that updates only changed resources. +102 final SimpleCache<String> cache = new SimpleCache<>(node -> DEFAULT_GROUP); +103 final RepositoryManager repositoryManager = pluginInitContext.projectManager() +104 .get(INTERNAL_PROJECT_DOGMA) +105 .repos(); +106 watchRepository(repositoryManager.get(CLUSTER_REPO), CLUSTER_FILE, Revision.INIT, +107 (entries, revision) -> updateClusters(entries, revision, cache)); +108 watchRepository(repositoryManager.get(ENDPOINT_REPO), ENDPOINT_FILE, Revision.INIT, +109 (entries, revision) -> updateEndpoints(entries, revision, cache)); +110 watchRepository(repositoryManager.get(LISTENER_REPO), LISTENER_FILE, Revision.INIT, +111 (entries, revision) -> updateListeners(entries, revision, cache)); +112 watchRepository(repositoryManager.get(ROUTE_REPO), ROUTE_FILE, Revision.INIT, +113 (entries, revision) -> routes(entries, revision, cache)); +114 final V3DiscoveryServer server = new V3DiscoveryServer(new LoggingDiscoveryServerCallbacks(), cache); +115 // xDS, ADS +116 final GrpcService grpcService = GrpcService.builder() +117 .addService(server.getClusterDiscoveryServiceImpl()) +118 .addService(server.getEndpointDiscoveryServiceImpl()) +119 .addService(server.getListenerDiscoveryServiceImpl()) +120 .addService(server.getRouteDiscoveryServiceImpl()) +121 .addService(server.getSecretDiscoveryServiceImpl()) +122 .addService(server.getAggregatedDiscoveryServiceImpl()) +123 .useBlockingTaskExecutor(true) +124 .build(); +125 sb.route().build(grpcService); +126 } +127 +128 private void watchRepository(Repository repository, String fileName, Revision revision, +129 ThrowingBiConsumer<Collection<Entry<?>>, Revision> updatingSnapshotFunction) { +130 final CompletableFuture<Revision> future = repository.watch(revision, "/**"); +131 future.handleAsync((BiFunction<Revision, Throwable, Void>) (watchedRevision, cause) -> { +132 if (stop) { +133 return null; +134 } +135 if (cause != null) { +136 logger.warn("Unexpected exception is raised while watching {}. Try watching after {} seconds..", +137 repository, BACKOFF_SECONDS, cause); +138 CONTROL_PLANE_EXECUTOR.schedule( +139 () -> watchRepository(repository, fileName, revision, updatingSnapshotFunction), +140 BACKOFF_SECONDS, TimeUnit.SECONDS); +141 return null; +142 } +143 final CompletableFuture<Map<String, Entry<?>>> entriesFuture = +144 repository.find(watchedRevision, "/**/" + fileName); +145 entriesFuture.handleAsync( +146 (BiFunction<Map<String, Entry<?>>, Throwable, Void>) (entries, findCause) -> { +147 if (stop) { +148 return null; +149 } +150 if (findCause != null) { +151 logger.warn( +152 "Unexpected exception is raised while finding {}" + +153 " with revision {} from {}. Try watching after {} seconds..", +154 fileName, watchedRevision, repository, BACKOFF_SECONDS, findCause); +155 CONTROL_PLANE_EXECUTOR.schedule( +156 () -> watchRepository(repository, fileName, +157 watchedRevision, updatingSnapshotFunction), +158 BACKOFF_SECONDS, TimeUnit.SECONDS); +159 return null; +160 } +161 try { +162 updatingSnapshotFunction.accept(entries.values(), watchedRevision); +163 CONTROL_PLANE_EXECUTOR.execute(() -> watchRepository( +164 repository, fileName, watchedRevision, updatingSnapshotFunction)); +165 } catch (Throwable t) { +166 logger.warn("Unexpected exception is raised while building from {} using {}" + +167 ". Try watching after {} seconds..", +168 repository.name(), entries.values(), BACKOFF_SECONDS, t); +169 CONTROL_PLANE_EXECUTOR.schedule( +170 () -> watchRepository( +171 repository, fileName, watchedRevision, updatingSnapshotFunction), +172 BACKOFF_SECONDS, TimeUnit.SECONDS); +173 } +174 return null; +175 }, +176 CONTROL_PLANE_EXECUTOR); +177 return null; +178 }, CONTROL_PLANE_EXECUTOR); +179 } +180 +181 private static boolean updateClusters(Collection<Entry<?>> entries, Revision revision, +182 SimpleCache<String> cache) throws InvalidProtocolBufferException { +183 final Builder<Cluster> clustersBuilder = ImmutableList.builder(); +184 for (Entry<?> entry : entries) { +185 final Cluster.Builder clusterBuilder = Cluster.newBuilder(); +186 JsonFormatUtil.parser().merge(entry.contentAsText(), clusterBuilder); +187 clustersBuilder.add(clusterBuilder.build()); +188 } +189 +190 setNewSnapshot(cache, ResourceType.CLUSTER, +191 CentralDogmaSnapshotResources.create(clustersBuilder.build(), revision)); +192 return true; +193 } +194 +195 private static boolean updateEndpoints(Collection<Entry<?>> entries, Revision revision, +196 SimpleCache<String> cache) throws InvalidProtocolBufferException { +197 final Builder<ClusterLoadAssignment> endpointsBuilder = ImmutableList.builder(); +198 for (Entry<?> entry : entries) { +199 final ClusterLoadAssignment.Builder endpointBuilder = ClusterLoadAssignment.newBuilder(); +200 JsonFormatUtil.parser().merge(entry.contentAsText(), endpointBuilder); +201 endpointsBuilder.add(endpointBuilder.build()); +202 } +203 +204 setNewSnapshot(cache, ResourceType.ENDPOINT, +205 CentralDogmaSnapshotResources.create(endpointsBuilder.build(), revision)); +206 return true; +207 } +208 +209 private static boolean updateListeners(Collection<Entry<?>> entries, Revision revision, +210 SimpleCache<String> cache) throws InvalidProtocolBufferException { +211 final Builder<Listener> listenersBuilder = ImmutableList.builder(); +212 for (Entry<?> entry : entries) { +213 final Listener.Builder listenerBuilder = Listener.newBuilder(); +214 JsonFormatUtil.parser().merge(entry.contentAsText(), listenerBuilder); +215 listenersBuilder.add(listenerBuilder.build()); +216 } +217 +218 setNewSnapshot(cache, ResourceType.LISTENER, +219 CentralDogmaSnapshotResources.create(listenersBuilder.build(), revision)); +220 return true; +221 } +222 +223 private static boolean routes(Collection<Entry<?>> entries, Revision revision, SimpleCache<String> cache) +224 throws InvalidProtocolBufferException { +225 final Builder<RouteConfiguration> routesBuilder = ImmutableList.builder(); +226 for (Entry<?> entry : entries) { +227 final RouteConfiguration.Builder routeBuilder = RouteConfiguration.newBuilder(); +228 JsonFormatUtil.parser().merge(entry.contentAsText(), routeBuilder); +229 routesBuilder.add(routeBuilder.build()); +230 } +231 +232 setNewSnapshot(cache, ResourceType.ROUTE, +233 CentralDogmaSnapshotResources.create(routesBuilder.build(), revision)); +234 return true; +235 } +236 +237 @SuppressWarnings("unchecked") +238 private static void setNewSnapshot(SimpleCache<String> cache, ResourceType resourceType, +239 SnapshotResources<?> resources) { +240 SnapshotResources<Cluster> clusters; +241 SnapshotResources<ClusterLoadAssignment> endpoints; +242 SnapshotResources<Listener> listeners; +243 SnapshotResources<RouteConfiguration> routes; +244 SnapshotResources<Secret> secrets; +245 final Snapshot previousSnapshot = cache.getSnapshot(DEFAULT_GROUP); +246 if (previousSnapshot == null) { +247 final SnapshotResources<?> emptyResources = +248 SnapshotResources.create(ImmutableList.of(), "empty_resources"); +249 clusters = (SnapshotResources<Cluster>) emptyResources; +250 endpoints = (SnapshotResources<ClusterLoadAssignment>) emptyResources; +251 listeners = (SnapshotResources<Listener>) emptyResources; +252 routes = (SnapshotResources<RouteConfiguration>) emptyResources; +253 secrets = (SnapshotResources<Secret>) emptyResources; +254 } else { +255 clusters = previousSnapshot.clusters(); +256 endpoints = previousSnapshot.endpoints(); +257 listeners = previousSnapshot.listeners(); +258 routes = previousSnapshot.routes(); +259 secrets = previousSnapshot.secrets(); +260 } +261 switch (resourceType) { +262 case CLUSTER: +263 clusters = (SnapshotResources<Cluster>) resources; +264 break; +265 case ENDPOINT: +266 endpoints = (SnapshotResources<ClusterLoadAssignment>) resources; +267 break; +268 case LISTENER: +269 listeners = (SnapshotResources<Listener>) resources; +270 break; +271 case ROUTE: +272 routes = (SnapshotResources<RouteConfiguration>) resources; +273 break; +274 case SECRET: +275 secrets = (SnapshotResources<Secret>) resources; +276 break; +277 default: +278 // Should never reach here. +279 throw new Error(); +280 } +281 +282 cache.setSnapshot(DEFAULT_GROUP, +283 new CentralDogmaSnapshot(clusters, endpoints, listeners, routes, secrets)); +284 } +285 +286 @Override +287 public CompletionStage<Void> start(PluginContext context) { +288 return UnmodifiableFuture.completedFuture(null); +289 } +290 +291 @Override +292 public CompletionStage<Void> stop(PluginContext context) { +293 stop = true; +294 return UnmodifiableFuture.completedFuture(null); +295 } +296 +297 @Override +298 public Class<?> configType() { +299 return ControlPlanePluginConfig.class; +300 } +301 +302 @Override +303 public String toString() { +304 return MoreObjects.toStringHelper(this) +305 .add("configType", configType()) +306 .add("target", target()) +307 .toString(); +308 } +309 +310 @FunctionalInterface +311 interface ThrowingBiConsumer<A, B> { +312 void accept(A a, B b) throws Exception; +313 } +314 +315 private static final class LoggingDiscoveryServerCallbacks implements DiscoveryServerCallbacks { +316 @Override +317 public void onV3StreamRequest(long streamId, DiscoveryRequest request) throws RequestException { +318 logger.debug("Received v3 stream request. streamId: {}, version: {}, resource_names: {}, " + +319 "response_nonce: {}, type_url: {}", +320 streamId, request.getVersionInfo(), request.getResourceNamesList(), +321 request.getResponseNonce(), request.getTypeUrl()); +322 } +323 +324 @Override +325 public void onV3StreamDeltaRequest(long streamId, DeltaDiscoveryRequest request) +326 throws RequestException {} +327 +328 @Override +329 public void onV3StreamResponse(long streamId, DiscoveryRequest request, +330 DiscoveryResponse response) { +331 logger.debug("Sent v3 stream response. streamId: {}, onV3StreamResponse: {}", streamId, response); +332 } 333 } -334 -335 private static final class LoggingDiscoveryServerCallbacks implements DiscoveryServerCallbacks { -336 @Override -337 public void onV3StreamRequest(long streamId, DiscoveryRequest request) throws RequestException { -338 logger.debug("Received v3 stream request. streamId: {}, version: {}, resource_names: {}, " + -339 "response_nonce: {}, type_url: {}", streamId, request.getVersionInfo(), -340 request.getResourceNamesList(), request.getResponseNonce(), request.getTypeUrl()); -341 } -342 -343 @Override -344 public void onV3StreamDeltaRequest(long streamId, DeltaDiscoveryRequest request) -345 throws RequestException {} -346 -347 @Override -348 public void onV3StreamResponse(long streamId, DiscoveryRequest request, DiscoveryResponse response) { -349 logger.debug("Sent v3 stream response. streamId: {}, version: {}, " + -350 "response_nonce: {}, type_url: {}", streamId, response.getVersionInfo(), -351 response.getNonce(), response.getTypeUrl()); -352 } -353 } -354 } +334 }
      diff --git a/xref/com/linecorp/centraldogma/xds/internal/package-frame.html b/xref/com/linecorp/centraldogma/xds/internal/package-frame.html index 7eff8fab8d..ea1496c906 100644 --- a/xref/com/linecorp/centraldogma/xds/internal/package-frame.html +++ b/xref/com/linecorp/centraldogma/xds/internal/package-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.xds.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.xds.internal @@ -20,9 +20,6 @@

      Classes

    • CentralDogmaSnapshotResources -
    • -
    • - CentralDogmaXdsResources
    • ControlPlanePlugin @@ -35,6 +32,9 @@

      Classes

    • LoggingDiscoveryServerCallbacks +
    • +
    • + ThrowingBiConsumer
    diff --git a/xref/com/linecorp/centraldogma/xds/internal/package-summary.html b/xref/com/linecorp/centraldogma/xds/internal/package-summary.html index d3cc776574..969a8fe707 100644 --- a/xref/com/linecorp/centraldogma/xds/internal/package-summary.html +++ b/xref/com/linecorp/centraldogma/xds/internal/package-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference Package com.linecorp.centraldogma.xds.internal + Central Dogma 0.67.3 cross-reference Package com.linecorp.centraldogma.xds.internal @@ -44,11 +44,6 @@

    Package com.linecorp.centraldogma.xds.internal

    CentralDogmaSnapshotResources - - - - CentralDogmaXdsResources - @@ -69,6 +64,11 @@

    Package com.linecorp.centraldogma.xds.internal

    LoggingDiscoveryServerCallbacks + + + + ThrowingBiConsumer + diff --git a/xref/index.html b/xref/index.html index e28cf90364..255eca2730 100644 --- a/xref/index.html +++ b/xref/index.html @@ -4,7 +4,7 @@ - Central Dogma 0.68.0 cross-reference + Central Dogma 0.67.3 cross-reference diff --git a/xref/overview-frame.html b/xref/overview-frame.html index 5aea70f341..6305690abd 100644 --- a/xref/overview-frame.html +++ b/xref/overview-frame.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference + Central Dogma 0.67.3 cross-reference diff --git a/xref/overview-summary.html b/xref/overview-summary.html index 5ca6bee0a2..af03b53c97 100644 --- a/xref/overview-summary.html +++ b/xref/overview-summary.html @@ -3,7 +3,7 @@ - Central Dogma 0.68.0 cross-reference + Central Dogma 0.67.3 cross-reference @@ -24,7 +24,7 @@
  • -

    Central Dogma 0.68.0 cross-reference

    +

    Central Dogma 0.67.3 cross-reference