| // Copyright (C) 2019 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.googlesource.gerrit.plugins.multisite.validation.dfsrefdb; |
| |
| import java.io.IOException; |
| import org.eclipse.jgit.lib.ObjectId; |
| import org.eclipse.jgit.lib.ObjectIdRef; |
| import org.eclipse.jgit.lib.Ref; |
| |
| public interface SharedRefDatabase { |
| Ref NULL_REF = |
| new Ref() { |
| |
| @Override |
| public String getName() { |
| return null; |
| } |
| |
| @Override |
| public boolean isSymbolic() { |
| return false; |
| } |
| |
| @Override |
| public Ref getLeaf() { |
| return null; |
| } |
| |
| @Override |
| public Ref getTarget() { |
| return null; |
| } |
| |
| @Override |
| public ObjectId getObjectId() { |
| return null; |
| } |
| |
| @Override |
| public ObjectId getPeeledObjectId() { |
| return null; |
| } |
| |
| @Override |
| public boolean isPeeled() { |
| return false; |
| } |
| |
| @Override |
| public Storage getStorage() { |
| return Storage.NEW; |
| } |
| }; |
| |
| /** |
| * Create a new in-memory Ref name associated with an objectId. |
| * |
| * @param refName ref name |
| * @param objectId object id |
| */ |
| default Ref newRef(String refName, ObjectId objectId) { |
| return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId); |
| } |
| |
| /** |
| * Utility method for new refs. |
| * |
| * @param project project name of the ref |
| * @param newRef new reference to store. |
| * @return true if the operation was successful; false otherwise. |
| * @throws IOException |
| */ |
| default boolean compareAndCreate(String project, Ref newRef) throws IOException { |
| return compareAndPut(project, NULL_REF, newRef); |
| } |
| |
| /** |
| * Compare a reference, and put if it matches. |
| * |
| * <p>Two reference match if and only if they satisfy the following: |
| * |
| * <ul> |
| * <li>If one reference is a symbolic ref, the other one should be a symbolic ref. |
| * <li>If both are symbolic refs, the target names should be same. |
| * <li>If both are object ID refs, the object IDs should be same. |
| * </ul> |
| * |
| * @param project project name of the ref |
| * @param oldRef old value to compare to. If the reference is expected to not exist the old value |
| * has a storage of {@link org.eclipse.jgit.lib.Ref.Storage#NEW} and an ObjectId value of |
| * {@code null}. |
| * @param newRef new reference to store. |
| * @return true if the put was successful; false otherwise. |
| * @throws java.io.IOException the reference cannot be put due to a system error. |
| */ |
| boolean compareAndPut(String project, Ref oldRef, Ref newRef) throws IOException; |
| |
| /** |
| * Compare a reference, and delete if it matches. |
| * |
| * @param project project name of the ref |
| * @param oldRef the old reference information that was previously read. |
| * @return true if the remove was successful; false otherwise. |
| * @throws java.io.IOException the reference could not be removed due to a system error. |
| */ |
| boolean compareAndRemove(String project, Ref oldRef) throws IOException; |
| } |