diff options
Diffstat (limited to 'java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java')
-rw-r--r-- | java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java b/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java new file mode 100644 index 0000000000..5aa4cf13ad --- /dev/null +++ b/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java @@ -0,0 +1,248 @@ +// Copyright (C) 2017 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.api.changes; + +import static com.google.gerrit.server.api.ApiUtil.asRestApiException; + +import com.google.gerrit.extensions.api.changes.ChangeEditApi; +import com.google.gerrit.extensions.api.changes.PublishChangeEditInput; +import com.google.gerrit.extensions.client.ChangeEditDetailOption; +import com.google.gerrit.extensions.common.EditInfo; +import com.google.gerrit.extensions.common.Input; +import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.extensions.restapi.BinaryResult; +import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.RawInput; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.Response; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.server.change.ChangeEditResource; +import com.google.gerrit.server.change.ChangeResource; +import com.google.gerrit.server.restapi.change.ChangeEdits; +import com.google.gerrit.server.restapi.change.DeleteChangeEdit; +import com.google.gerrit.server.restapi.change.PublishChangeEdit; +import com.google.gerrit.server.restapi.change.RebaseChangeEdit; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.assistedinject.Assisted; +import java.io.IOException; +import java.util.Optional; + +public class ChangeEditApiImpl implements ChangeEditApi { + interface Factory { + ChangeEditApiImpl create(ChangeResource changeResource); + } + + private final Provider<ChangeEdits.Detail> editDetailProvider; + private final ChangeEdits.Post changeEditsPost; + private final DeleteChangeEdit deleteChangeEdit; + private final RebaseChangeEdit rebaseChangeEdit; + private final PublishChangeEdit publishChangeEdit; + private final Provider<ChangeEdits.Get> changeEditsGetProvider; + private final ChangeEdits.Put changeEditsPut; + private final ChangeEdits.DeleteContent changeEditDeleteContent; + private final Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider; + private final ChangeEdits.EditMessage modifyChangeEditCommitMessage; + private final ChangeEdits changeEdits; + private final ChangeResource changeResource; + + @Inject + public ChangeEditApiImpl( + Provider<ChangeEdits.Detail> editDetailProvider, + ChangeEdits.Post changeEditsPost, + DeleteChangeEdit deleteChangeEdit, + RebaseChangeEdit rebaseChangeEdit, + PublishChangeEdit publishChangeEdit, + Provider<ChangeEdits.Get> changeEditsGetProvider, + ChangeEdits.Put changeEditsPut, + ChangeEdits.DeleteContent changeEditDeleteContent, + Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider, + ChangeEdits.EditMessage modifyChangeEditCommitMessage, + ChangeEdits changeEdits, + @Assisted ChangeResource changeResource) { + this.editDetailProvider = editDetailProvider; + this.changeEditsPost = changeEditsPost; + this.deleteChangeEdit = deleteChangeEdit; + this.rebaseChangeEdit = rebaseChangeEdit; + this.publishChangeEdit = publishChangeEdit; + this.changeEditsGetProvider = changeEditsGetProvider; + this.changeEditsPut = changeEditsPut; + this.changeEditDeleteContent = changeEditDeleteContent; + this.getChangeEditCommitMessageProvider = getChangeEditCommitMessageProvider; + this.modifyChangeEditCommitMessage = modifyChangeEditCommitMessage; + this.changeEdits = changeEdits; + this.changeResource = changeResource; + } + + @Override + public ChangeEditDetailRequest detail() throws RestApiException { + try { + return new ChangeEditDetailRequest() { + @Override + public Optional<EditInfo> get() throws RestApiException { + return ChangeEditApiImpl.this.get(this); + } + }; + } catch (Exception e) { + throw asRestApiException("Cannot retrieve change edit", e); + } + } + + private Optional<EditInfo> get(ChangeEditDetailRequest r) throws RestApiException { + try { + ChangeEdits.Detail editDetail = editDetailProvider.get(); + editDetail.setBase(r.getBase()); + editDetail.setList(r.options().contains(ChangeEditDetailOption.LIST_FILES)); + editDetail.setDownloadCommands( + r.options().contains(ChangeEditDetailOption.DOWNLOAD_COMMANDS)); + Response<EditInfo> edit = editDetail.apply(changeResource); + return edit.isNone() ? Optional.empty() : Optional.of(edit.value()); + } catch (Exception e) { + throw asRestApiException("Cannot retrieve change edit", e); + } + } + + @Override + public Optional<EditInfo> get() throws RestApiException { + try { + Response<EditInfo> edit = editDetailProvider.get().apply(changeResource); + return edit.isNone() ? Optional.empty() : Optional.of(edit.value()); + } catch (Exception e) { + throw asRestApiException("Cannot retrieve change edit", e); + } + } + + @Override + public void create() throws RestApiException { + try { + changeEditsPost.apply(changeResource, null); + } catch (Exception e) { + throw asRestApiException("Cannot create change edit", e); + } + } + + @Override + public void delete() throws RestApiException { + try { + deleteChangeEdit.apply(changeResource, new Input()); + } catch (Exception e) { + throw asRestApiException("Cannot delete change edit", e); + } + } + + @Override + public void rebase() throws RestApiException { + try { + rebaseChangeEdit.apply(changeResource, null); + } catch (Exception e) { + throw asRestApiException("Cannot rebase change edit", e); + } + } + + @Override + public void publish() throws RestApiException { + publish(null); + } + + @Override + public void publish(PublishChangeEditInput publishChangeEditInput) throws RestApiException { + try { + publishChangeEdit.apply(changeResource, publishChangeEditInput); + } catch (Exception e) { + throw asRestApiException("Cannot publish change edit", e); + } + } + + @Override + public Optional<BinaryResult> getFile(String filePath) throws RestApiException { + try { + ChangeEditResource changeEditResource = getChangeEditResource(filePath); + Response<BinaryResult> fileResponse = changeEditsGetProvider.get().apply(changeEditResource); + return fileResponse.isNone() ? Optional.empty() : Optional.of(fileResponse.value()); + } catch (Exception e) { + throw asRestApiException("Cannot retrieve file of change edit", e); + } + } + + @Override + public void renameFile(String oldFilePath, String newFilePath) throws RestApiException { + try { + ChangeEdits.Post.Input renameInput = new ChangeEdits.Post.Input(); + renameInput.oldPath = oldFilePath; + renameInput.newPath = newFilePath; + changeEditsPost.apply(changeResource, renameInput); + } catch (Exception e) { + throw asRestApiException("Cannot rename file of change edit", e); + } + } + + @Override + public void restoreFile(String filePath) throws RestApiException { + try { + ChangeEdits.Post.Input restoreInput = new ChangeEdits.Post.Input(); + restoreInput.restorePath = filePath; + changeEditsPost.apply(changeResource, restoreInput); + } catch (Exception e) { + throw asRestApiException("Cannot restore file of change edit", e); + } + } + + @Override + public void modifyFile(String filePath, RawInput newContent) throws RestApiException { + try { + changeEditsPut.apply(changeResource, filePath, newContent); + } catch (Exception e) { + throw asRestApiException("Cannot modify file of change edit", e); + } + } + + @Override + public void deleteFile(String filePath) throws RestApiException { + try { + changeEditDeleteContent.apply(changeResource, filePath); + } catch (Exception e) { + throw asRestApiException("Cannot delete file of change edit", e); + } + } + + @Override + public String getCommitMessage() throws RestApiException { + try { + try (BinaryResult binaryResult = + getChangeEditCommitMessageProvider.get().apply(changeResource)) { + return binaryResult.asString(); + } + } catch (Exception e) { + throw asRestApiException("Cannot get commit message of change edit", e); + } + } + + @Override + public void modifyCommitMessage(String newCommitMessage) throws RestApiException { + ChangeEdits.EditMessage.Input input = new ChangeEdits.EditMessage.Input(); + input.message = newCommitMessage; + try { + modifyChangeEditCommitMessage.apply(changeResource, input); + } catch (Exception e) { + throw asRestApiException("Cannot modify commit message of change edit", e); + } + } + + private ChangeEditResource getChangeEditResource(String filePath) + throws ResourceNotFoundException, AuthException, IOException, OrmException { + return changeEdits.parse(changeResource, IdString.fromDecoded(filePath)); + } +} |