diff --git a/build.gradle.kts b/build.gradle.kts index a86cafd..7d5d05f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,11 +50,11 @@ subprojects { targetCompatibility = javaVersion } - val implementation by configurations + val api by configurations val testImplementation by configurations dependencies { - implementation("org.jetbrains:annotations:17.0.0") + api("com.google.code.findbugs:jsr305:3.0.2") testImplementation("com.google.guava:guava:28.1-jre") testImplementation("org.testng:testng:7.0.0") diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/AuthHelper.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/AuthHelper.java index 32f5ac8..26ec651 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/AuthHelper.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/AuthHelper.java @@ -1,10 +1,10 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.client.auth.AuthProvider; import ru.bozaro.gitlfs.client.auth.BasicAuthProvider; import ru.bozaro.gitlfs.client.auth.ExternalAuthProvider; +import javax.annotation.Nonnull; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -34,7 +34,8 @@ private AuthHelper() { * @param gitURL URL to repository. * @return Created auth provider. */ - public static AuthProvider create(@NotNull String gitURL) throws MalformedURLException { + @Nonnull + public static AuthProvider create(@Nonnull String gitURL) throws MalformedURLException { if (gitURL.contains("://")) { final URI uri = URI.create(gitURL); final String path = uri.getPath(); @@ -52,8 +53,8 @@ public static AuthProvider create(@NotNull String gitURL) throws MalformedURLExc return new ExternalAuthProvider(gitURL); } - @NotNull - public static URI join(@NotNull URI href, @NotNull String... path) { + @Nonnull + public static URI join(@Nonnull URI href, @Nonnull String... path) { try { URI uri = new URI(href.getScheme(), href.getAuthority(), href.getPath() + (href.getPath().endsWith("/") ? "" : "/"), null, null); for (String fragment : path) diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchDownloader.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchDownloader.java index 49207b8..13d11de 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchDownloader.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchDownloader.java @@ -1,7 +1,5 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.client.internal.BatchWorker; import ru.bozaro.gitlfs.client.internal.Work; import ru.bozaro.gitlfs.client.io.StreamHandler; @@ -10,6 +8,8 @@ import ru.bozaro.gitlfs.common.data.Meta; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -20,22 +20,22 @@ * @author Artem V. Navrotskiy */ public class BatchDownloader extends BatchWorker, Object> { - public BatchDownloader(@NotNull Client client, @NotNull ExecutorService pool) { + public BatchDownloader(@Nonnull Client client, @Nonnull ExecutorService pool) { this(client, pool, new BatchSettings()); } - public BatchDownloader(@NotNull Client client, @NotNull ExecutorService pool, @NotNull BatchSettings settings) { + public BatchDownloader(@Nonnull Client client, @Nonnull ExecutorService pool, @Nonnull BatchSettings settings) { super(client, pool, settings, Operation.Download); } @SuppressWarnings("unchecked") - @NotNull - public CompletableFuture download(@NotNull final Meta meta, @NotNull StreamHandler callback) { + @Nonnull + public CompletableFuture download(@Nonnull final Meta meta, @Nonnull StreamHandler callback) { return (CompletableFuture) enqueue(meta, callback); } - @Nullable - protected Work objectTask(@NotNull State, Object> state, @NotNull BatchItem item) { + @CheckForNull + protected Work objectTask(@Nonnull State, Object> state, @Nonnull BatchItem item) { // Invalid links data if (!item.getLinks().containsKey(LinkType.Download)) { state.getFuture().completeExceptionally(new IOException("Download link not found")); diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchSettings.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchSettings.java index 041177f..a581a48 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchSettings.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchSettings.java @@ -1,6 +1,6 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import static ru.bozaro.gitlfs.common.Constants.BATCH_SIZE; @@ -36,7 +36,7 @@ public int getLimit() { return limit; } - @NotNull + @Nonnull public BatchSettings setLimit(int limit) { this.limit = Math.min(limit, 1); return this; @@ -46,7 +46,7 @@ public int getThreshold() { return threshold; } - @NotNull + @Nonnull public BatchSettings setThreshold(int threshold) { this.threshold = Math.max(threshold, 0); return this; @@ -56,7 +56,7 @@ public int getRetryCount() { return retryCount; } - @NotNull + @Nonnull public BatchSettings setRetryCount(int retryCount) { this.retryCount = Math.max(retryCount, 1); return this; diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchUploader.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchUploader.java index b188760..5335d87 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchUploader.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/BatchUploader.java @@ -1,7 +1,5 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.client.internal.BatchWorker; import ru.bozaro.gitlfs.client.internal.Work; import ru.bozaro.gitlfs.client.io.StreamProvider; @@ -10,6 +8,8 @@ import ru.bozaro.gitlfs.common.data.Meta; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -19,11 +19,11 @@ * @author Artem V. Navrotskiy */ public class BatchUploader extends BatchWorker { - public BatchUploader(@NotNull Client client, @NotNull ExecutorService pool) { + public BatchUploader(@Nonnull Client client, @Nonnull ExecutorService pool) { this(client, pool, new BatchSettings()); } - public BatchUploader(@NotNull Client client, @NotNull ExecutorService pool, @NotNull BatchSettings settings) { + public BatchUploader(@Nonnull Client client, @Nonnull ExecutorService pool, @Nonnull BatchSettings settings) { super(client, pool, settings, Operation.Upload); } @@ -33,8 +33,8 @@ public BatchUploader(@NotNull Client client, @NotNull ExecutorService pool, @Not * @param streamProvider Stream provider. * @return Return future with upload result. */ - @NotNull - public CompletableFuture upload(@NotNull final StreamProvider streamProvider) { + @Nonnull + public CompletableFuture upload(@Nonnull final StreamProvider streamProvider) { final CompletableFuture future = new CompletableFuture<>(); getPool().submit(() -> { try { @@ -53,13 +53,13 @@ public CompletableFuture upload(@NotNull final StreamProvider streamProvid * @param streamProvider Stream provider. * @return Return future with upload result. For same objects can return same future. */ - @NotNull - public CompletableFuture upload(@NotNull final Meta meta, @NotNull final StreamProvider streamProvider) { + @Nonnull + public CompletableFuture upload(@Nonnull final Meta meta, @Nonnull final StreamProvider streamProvider) { return enqueue(meta, streamProvider); } - @Nullable - protected Work objectTask(@NotNull State state, @NotNull BatchItem item) { + @CheckForNull + protected Work objectTask(@Nonnull State state, @Nonnull BatchItem item) { if (item.getLinks().containsKey(LinkType.Upload)) { // Wait for upload. return auth -> { diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/Client.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/Client.java index 51891dd..9858c39 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/Client.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/Client.java @@ -7,8 +7,6 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.client.auth.AuthProvider; import ru.bozaro.gitlfs.client.exceptions.ForbiddenException; import ru.bozaro.gitlfs.client.exceptions.RequestException; @@ -22,6 +20,8 @@ import ru.bozaro.gitlfs.common.data.*; import ru.bozaro.gitlfs.common.io.InputStreamValidator; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.*; import java.net.URI; import java.net.URLEncoder; @@ -42,28 +42,28 @@ public class Client implements Closeable { private static final int MAX_AUTH_COUNT = 1; private static final int MAX_RETRY_COUNT = 2; private static final int MAX_REDIRECT_COUNT = 5; - @NotNull + @Nonnull private final ObjectMapper mapper; - @NotNull + @Nonnull private final AuthProvider authProvider; - @NotNull + @Nonnull private final HttpExecutor http; - public Client(@NotNull AuthProvider authProvider) { + public Client(@Nonnull AuthProvider authProvider) { this(authProvider, HttpClients.createDefault()); } - public Client(@NotNull AuthProvider authProvider, @NotNull final CloseableHttpClient http) { + public Client(@Nonnull AuthProvider authProvider, @Nonnull final CloseableHttpClient http) { this(authProvider, new HttpClientExecutor(http)); } - public Client(@NotNull AuthProvider authProvider, @NotNull HttpExecutor http) { + public Client(@Nonnull AuthProvider authProvider, @Nonnull HttpExecutor http) { this.authProvider = authProvider; this.mapper = JsonHelper.mapper; this.http = http; } - @NotNull + @Nonnull public AuthProvider getAuthProvider() { return authProvider; } @@ -73,10 +73,9 @@ public AuthProvider getAuthProvider() { * * @param hash Object hash. * @return Object metadata or null, if object not found. - * @throws IOException */ - @Nullable - public ObjectRes getMeta(@NotNull final String hash) throws IOException { + @CheckForNull + public ObjectRes getMeta(@Nonnull final String hash) throws IOException { return doWork(auth -> doRequest( auth, new MetaGet(), @@ -85,7 +84,7 @@ public ObjectRes getMeta(@NotNull final String hash) throws IOException { ), Operation.Download); } - protected T doWork(@NotNull Work work, @NotNull Operation operation) throws IOException { + protected T doWork(@Nonnull Work work, @Nonnull Operation operation) throws IOException { Link auth = authProvider.getAuth(operation); int authCount = 0; while (true) { @@ -107,7 +106,7 @@ protected T doWork(@NotNull Work work, @NotNull Operation operation) thro } } - public R doRequest(@Nullable Link link, @NotNull Request task, @NotNull URI url, @NotNull Client.ConnectionClosePolicy autoClose) throws IOException { + public R doRequest(@CheckForNull Link link, @Nonnull Request task, @Nonnull URI url, @Nonnull Client.ConnectionClosePolicy autoClose) throws IOException { int redirectCount = 0; int retryCount = 0; while (true) { @@ -162,7 +161,7 @@ public R doRequest(@Nullable Link link, @NotNull Request task, @NotNull U } } - protected void addHeaders(@NotNull HttpUriRequest req, @Nullable Link link) { + protected void addHeaders(@Nonnull HttpUriRequest req, @CheckForNull Link link) { if (link != null) { for (Map.Entry entry : link.getHeader().entrySet()) { req.setHeader(entry.getKey(), entry.getValue()); @@ -179,7 +178,7 @@ protected void addHeaders(@NotNull HttpUriRequest req, @Nullable Link link) { * @return Return true is object is uploaded successfully and false if object is already uploaded. * @throws IOException On some errors. */ - public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull final String hash, final long size) throws IOException { + public boolean putObject(@Nonnull final StreamProvider streamProvider, @Nonnull final String hash, final long size) throws IOException { return putObject(streamProvider, new Meta(hash, size)); } @@ -191,7 +190,7 @@ public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull * @return Return true is object is uploaded successfully and false if object is already uploaded. * @throws IOException On some errors. */ - public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull final Meta meta) throws IOException { + public boolean putObject(@Nonnull final StreamProvider streamProvider, @Nonnull final Meta meta) throws IOException { return doWork(auth -> { final ObjectRes links = doRequest(auth, new MetaPost(meta), AuthHelper.join(auth.getHref(), PATH_OBJECTS), ConnectionClosePolicy.Close); return links != null && putObject(streamProvider, meta, links); @@ -207,7 +206,7 @@ public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull * @return Return true is object is uploaded successfully and false if object is already uploaded. * @throws IOException On some errors. */ - public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull final Meta meta, @NotNull final Links links) throws IOException { + public boolean putObject(@Nonnull final StreamProvider streamProvider, @Nonnull final Meta meta, @Nonnull final Links links) throws IOException { final Link uploadLink = links.getLinks().get(LinkType.Upload); if (uploadLink == null) return false; @@ -227,10 +226,9 @@ public boolean putObject(@NotNull final StreamProvider streamProvider, @NotNull * @param hash Object hash. * @param size Object size. * @return Object metadata or null, if object not found. - * @throws IOException */ - @Nullable - public ObjectRes postMeta(@NotNull final String hash, final long size) throws IOException { + @CheckForNull + public ObjectRes postMeta(@Nonnull final String hash, final long size) throws IOException { return postMeta(new Meta(hash, size)); } @@ -239,10 +237,9 @@ public ObjectRes postMeta(@NotNull final String hash, final long size) throws IO * * @param meta Object meta. * @return Object metadata or null, if object not found. - * @throws IOException */ - @Nullable - public ObjectRes postMeta(@NotNull final Meta meta) throws IOException { + @CheckForNull + public ObjectRes postMeta(@Nonnull final Meta meta) throws IOException { return doWork(auth -> doRequest( auth, new MetaPost(meta), @@ -257,10 +254,9 @@ public ObjectRes postMeta(@NotNull final Meta meta) throws IOException { * * @param batchReq Batch request. * @return Object metadata. - * @throws IOException */ - @NotNull - public BatchRes postBatch(@NotNull final BatchReq batchReq) throws IOException { + @Nonnull + public BatchRes postBatch(@Nonnull final BatchReq batchReq) throws IOException { return doWork(auth -> doRequest( auth, new JsonPost<>(batchReq, BatchRes.class), @@ -279,16 +275,16 @@ public BatchRes postBatch(@NotNull final BatchReq batchReq) throws IOException { * @throws FileNotFoundException File not found exception if object don't exists on LFS server. * @throws IOException On some errors. */ - @NotNull - public T getObject(@NotNull final String hash, @NotNull final StreamHandler handler) throws IOException { + @Nonnull + public T getObject(@Nonnull final String hash, @Nonnull final StreamHandler handler) throws IOException { return doWork(auth -> { final ObjectRes links = getLinks(hash, auth); return getObject(links.getMeta() == null ? new Meta(hash, -1) : links.getMeta(), links, handler); }, Operation.Download); } - @NotNull - private ObjectRes getLinks(@NotNull String hash, @NotNull Link auth) throws IOException { + @Nonnull + private ObjectRes getLinks(@Nonnull String hash, @Nonnull Link auth) throws IOException { final ObjectRes links = doRequest( auth, new MetaGet(), @@ -311,8 +307,8 @@ private ObjectRes getLinks(@NotNull String hash, @NotNull Link auth) throws IOEx * @throws FileNotFoundException File not found exception if object don't exists on LFS server. * @throws IOException On some errors. */ - @NotNull - public T getObject(@Nullable final Meta meta, @NotNull final Links links, @NotNull final StreamHandler handler) throws IOException { + @Nonnull + public T getObject(@CheckForNull final Meta meta, @Nonnull final Links links, @Nonnull final StreamHandler handler) throws IOException { final Link link = links.getLinks().get(LinkType.Download); if (link == null) { throw new FileNotFoundException(); @@ -320,16 +316,16 @@ public T getObject(@Nullable final Meta meta, @NotNull final Links links, @N return doRequest(link, new ObjectGet<>(inputStream -> handler.accept(meta == null ? inputStream : new InputStreamValidator(inputStream, meta))), link.getHref(), ConnectionClosePolicy.Close); } - @NotNull - public InputStream openObject(@NotNull final String hash) throws IOException { + @Nonnull + public InputStream openObject(@Nonnull final String hash) throws IOException { return doWork(auth -> { final ObjectRes links = getLinks(hash, auth); return openObject(links.getMeta() == null ? new Meta(hash, -1) : links.getMeta(), links); }, Operation.Download); } - @NotNull - public InputStream openObject(@Nullable final Meta meta, @NotNull final Links links) throws IOException { + @Nonnull + public InputStream openObject(@CheckForNull final Meta meta, @Nonnull final Links links) throws IOException { final Link link = links.getLinks().get(LinkType.Download); if (link == null) throw new FileNotFoundException(); @@ -344,7 +340,7 @@ public InputStream openObject(@Nullable final Meta meta, @NotNull final Links li * @return Return true is object is uploaded successfully and false if object is already uploaded. * @throws IOException On some errors. */ - public boolean putObject(@NotNull final StreamProvider streamProvider) throws IOException { + public boolean putObject(@Nonnull final StreamProvider streamProvider) throws IOException { return putObject(streamProvider, generateMeta(streamProvider)); } @@ -355,7 +351,7 @@ public boolean putObject(@NotNull final StreamProvider streamProvider) throws IO * @return Return object metadata. * @throws IOException On some errors. */ - public static Meta generateMeta(@NotNull final StreamProvider streamProvider) throws IOException { + public static Meta generateMeta(@Nonnull final StreamProvider streamProvider) throws IOException { final MessageDigest digest = sha256(); final byte[] buffer = new byte[0x10000]; long size = 0; @@ -378,8 +374,8 @@ protected static MessageDigest sha256() { } } - @NotNull - public Lock lock(@NotNull String path, @Nullable Ref ref) throws IOException, LockConflictException { + @Nonnull + public Lock lock(@Nonnull String path, @CheckForNull Ref ref) throws IOException, LockConflictException { final LockCreate.Res res = doWork(auth -> doRequest( auth, new LockCreate(path, ref), @@ -394,13 +390,13 @@ public Lock lock(@NotNull String path, @Nullable Ref ref) throws IOException, Lo throw new LockConflictException(res.getMessage(), res.getLock()); } - @Nullable - public Lock unlock(@NotNull Lock lock, boolean force, @Nullable Ref ref) throws IOException { + @CheckForNull + public Lock unlock(@Nonnull Lock lock, boolean force, @CheckForNull Ref ref) throws IOException { return unlock(lock.getId(), force, ref); } - @Nullable - public Lock unlock(@NotNull String lockId, boolean force, @Nullable Ref ref) throws IOException { + @CheckForNull + public Lock unlock(@Nonnull String lockId, boolean force, @CheckForNull Ref ref) throws IOException { return doWork(auth -> doRequest( auth, new LockDelete(force, ref), @@ -410,8 +406,8 @@ public Lock unlock(@NotNull String lockId, boolean force, @Nullable Ref ref) thr ); } - @NotNull - public List listLocks(@Nullable String path, @Nullable String id, @Nullable Ref ref) throws IOException { + @Nonnull + public List listLocks(@CheckForNull String path, @CheckForNull String id, @CheckForNull Ref ref) throws IOException { final List result = new ArrayList<>(); final StringBuffer baseParams = new StringBuffer(); @@ -441,7 +437,7 @@ public List listLocks(@Nullable String path, @Nullable String id, @Nullabl return result; } - private static void appendOptionalParam(@NotNull StringBuffer buffer, @NotNull String paramName, @Nullable String paramValue) throws UnsupportedEncodingException { + private static void appendOptionalParam(@Nonnull StringBuffer buffer, @Nonnull String paramName, @CheckForNull String paramValue) throws UnsupportedEncodingException { if (paramValue != null) { buffer .append(buffer.length() == 0 ? '?' : '&') @@ -451,8 +447,8 @@ private static void appendOptionalParam(@NotNull StringBuffer buffer, @NotNull S } } - @NotNull - public VerifyLocksResult verifyLocks(@Nullable Ref ref) throws IOException { + @Nonnull + public VerifyLocksResult verifyLocks(@CheckForNull Ref ref) throws IOException { final VerifyLocksResult result = new VerifyLocksResult(new ArrayList<>(), new ArrayList<>()); String cursor = null; diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/HttpExecutor.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/HttpExecutor.java index 64567c2..fec16d8 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/HttpExecutor.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/HttpExecutor.java @@ -2,8 +2,8 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.io.Closeable; import java.io.IOException; @@ -13,6 +13,6 @@ * @author Artem V. Navrotskiy */ public interface HttpExecutor extends Closeable { - @NotNull - CloseableHttpResponse executeMethod(@NotNull HttpUriRequest request) throws IOException; + @Nonnull + CloseableHttpResponse executeMethod(@Nonnull HttpUriRequest request) throws IOException; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/AuthProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/AuthProvider.java index a83e4d0..56bfbef 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/AuthProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/AuthProvider.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.client.auth; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Link; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -19,10 +19,9 @@ public interface AuthProvider { * * @param operation Operation type. * @return Auth data. - * @throws IOException */ - @NotNull - Link getAuth(@NotNull Operation operation) throws IOException; + @Nonnull + Link getAuth(@Nonnull Operation operation) throws IOException; /** * Set auth as expired. @@ -30,5 +29,5 @@ public interface AuthProvider { * @param operation Operation type. * @param auth Expired auth data. */ - void invalidateAuth(@NotNull Operation operation, @NotNull Link auth); + void invalidateAuth(@Nonnull Operation operation, @Nonnull Link auth); } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/BasicAuthProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/BasicAuthProvider.java index ea79ae1..2d521f3 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/BasicAuthProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/BasicAuthProvider.java @@ -1,12 +1,11 @@ package ru.bozaro.gitlfs.client.auth; import org.apache.commons.codec.binary.Base64; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.data.Link; import ru.bozaro.gitlfs.common.data.Operation; -import java.io.IOException; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; @@ -21,14 +20,14 @@ * @author Artem V. Navrotskiy */ public class BasicAuthProvider implements AuthProvider { - @NotNull + @Nonnull private final Link auth; - public BasicAuthProvider(@NotNull URI href) { + public BasicAuthProvider(@Nonnull URI href) { this(href, null, null); } - public BasicAuthProvider(@NotNull URI href, @Nullable String login, @Nullable String password) { + public BasicAuthProvider(@Nonnull URI href, @CheckForNull String login, @CheckForNull String password) { final String authLogin; if (isEmpty(login)) { authLogin = extractLogin(href.getUserInfo()); @@ -52,31 +51,31 @@ public BasicAuthProvider(@NotNull URI href, @Nullable String login, @Nullable St } } - @NotNull - @Override - public Link getAuth(@NotNull Operation operation) throws IOException { - return auth; - } - - @Override - public void invalidateAuth(@NotNull Operation operation, @NotNull Link auth) { - } - - private static boolean isEmpty(@Nullable String value) { + private static boolean isEmpty(@CheckForNull String value) { return value == null || value.isEmpty(); } - @NotNull - private static String extractLogin(@Nullable String userInfo) { + @Nonnull + private static String extractLogin(@CheckForNull String userInfo) { if (userInfo == null) return ""; final int separator = userInfo.indexOf(':'); return (separator >= 0) ? userInfo.substring(0, separator) : userInfo; } - @NotNull - private static String extractPassword(@Nullable String userInfo) { + @Nonnull + private static String extractPassword(@CheckForNull String userInfo) { if (userInfo == null) return ""; final int separator = userInfo.indexOf(':'); return (separator >= 0) ? userInfo.substring(separator + 1) : ""; } + + @Nonnull + @Override + public Link getAuth(@Nonnull Operation operation) { + return auth; + } + + @Override + public void invalidateAuth(@Nonnull Operation operation, @Nonnull Link auth) { + } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/CachedAuthProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/CachedAuthProvider.java index fe0c75f..113fbbc 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/CachedAuthProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/CachedAuthProvider.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.client.auth; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Link; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.EnumMap; import java.util.concurrent.ConcurrentHashMap; @@ -16,9 +16,9 @@ * @author Artem V. Navrotskiy */ public abstract class CachedAuthProvider implements AuthProvider { - @NotNull + @Nonnull private final ConcurrentMap authCache; - @NotNull + @Nonnull private final EnumMap locks; public CachedAuthProvider() { @@ -26,9 +26,18 @@ public CachedAuthProvider() { this.authCache = new ConcurrentHashMap<>(Operation.values().length); } - @NotNull + @Nonnull + private static EnumMap createLocks() { + final EnumMap result = new EnumMap<>(Operation.class); + for (Operation value : Operation.values()) { + result.put(value, new Object()); + } + return result; + } + + @Nonnull @Override - public final Link getAuth(@NotNull Operation operation) throws IOException { + public final Link getAuth(@Nonnull Operation operation) throws IOException { Link auth = authCache.get(operation); if (auth == null) { synchronized (locks.get(operation)) { @@ -46,20 +55,11 @@ public final Link getAuth(@NotNull Operation operation) throws IOException { return auth; } - @NotNull - private static EnumMap createLocks() { - final EnumMap result = new EnumMap<>(Operation.class); - for (Operation value : Operation.values()) { - result.put(value, new Object()); - } - return result; - } - - @NotNull - protected abstract Link getAuthUncached(@NotNull Operation operation) throws IOException, InterruptedException; + @Nonnull + protected abstract Link getAuthUncached(@Nonnull Operation operation) throws IOException, InterruptedException; @Override - public final void invalidateAuth(@NotNull Operation operation, @NotNull Link auth) { + public final void invalidateAuth(@Nonnull Operation operation, @Nonnull Link auth) { authCache.remove(operation, auth); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/ExternalAuthProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/ExternalAuthProvider.java index 15e68c1..285f34f 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/ExternalAuthProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/auth/ExternalAuthProvider.java @@ -1,10 +1,10 @@ package ru.bozaro.gitlfs.client.auth; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.JsonHelper; import ru.bozaro.gitlfs.common.data.Link; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.Nonnull; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -18,9 +18,9 @@ * @author Artem V. Navrotskiy */ public class ExternalAuthProvider extends CachedAuthProvider { - @NotNull + @Nonnull private final String authority; - @NotNull + @Nonnull private final String path; /** @@ -28,7 +28,7 @@ public class ExternalAuthProvider extends CachedAuthProvider { * * @param gitUrl Git URL like: git@github.com:bozaro/git-lfs-java.git */ - public ExternalAuthProvider(@NotNull String gitUrl) throws MalformedURLException { + public ExternalAuthProvider(@Nonnull String gitUrl) throws MalformedURLException { final int separator = gitUrl.indexOf(':'); if (separator < 0) { throw new MalformedURLException("Can't find separator ':' in gitUrl: " + gitUrl); @@ -43,26 +43,13 @@ public ExternalAuthProvider(@NotNull String gitUrl) throws MalformedURLException * @param authority SSH server authority with user name * @param path Repostiry path */ - public ExternalAuthProvider(@NotNull String authority, @NotNull String path) { + public ExternalAuthProvider(@Nonnull String authority, @Nonnull String path) { this.authority = authority; this.path = path; } - @NotNull - protected String[] getCommand(@NotNull Operation operation) { - return new String[]{ - "ssh", - getAuthority(), - "-oBatchMode=yes", - "-C", - "git-lfs-authenticate", - getPath(), - operation.toValue() - }; - } - - @NotNull - protected Link getAuthUncached(@NotNull Operation operation) throws IOException, InterruptedException { + @Nonnull + protected Link getAuthUncached(@Nonnull Operation operation) throws IOException, InterruptedException { final ProcessBuilder builder = new ProcessBuilder() .command(getCommand(operation)) .redirectError(ProcessBuilder.Redirect.PIPE) @@ -84,12 +71,25 @@ protected Link getAuthUncached(@NotNull Operation operation) throws IOException, return JsonHelper.mapper.readValue(stdoutData.toByteArray(), Link.class); } - @NotNull + @Nonnull + protected String[] getCommand(@Nonnull Operation operation) { + return new String[]{ + "ssh", + getAuthority(), + "-oBatchMode=yes", + "-C", + "git-lfs-authenticate", + getPath(), + operation.toValue() + }; + } + + @Nonnull public String getAuthority() { return authority; } - @NotNull + @Nonnull public String getPath() { return path; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/ForbiddenException.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/ForbiddenException.java index 634d5fa..294aa4f 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/ForbiddenException.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/ForbiddenException.java @@ -2,7 +2,8 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; /** * Forbidden HTTP exception. @@ -10,7 +11,7 @@ * @author Artem V. Navrotskiy */ public class ForbiddenException extends RequestException { - public ForbiddenException(@NotNull HttpUriRequest request, @NotNull HttpResponse response) { + public ForbiddenException(@Nonnull HttpUriRequest request, @Nonnull HttpResponse response) { super(request, response); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/RequestException.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/RequestException.java index 3a6e5b1..c4640b3 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/RequestException.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/RequestException.java @@ -3,8 +3,8 @@ import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -13,12 +13,12 @@ * @author Artem V. Navrotskiy */ public class RequestException extends IOException { - @NotNull + @Nonnull private final HttpUriRequest request; - @NotNull + @Nonnull private final HttpResponse response; - public RequestException(@NotNull HttpUriRequest request, @NotNull HttpResponse response) { + public RequestException(@Nonnull HttpUriRequest request, @Nonnull HttpResponse response) { this.request = request; this.response = response; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/UnauthorizedException.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/UnauthorizedException.java index 94a1507..07c8de3 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/UnauthorizedException.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/exceptions/UnauthorizedException.java @@ -2,7 +2,8 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; /** * Unauthorized HTTP exception. @@ -10,7 +11,7 @@ * @author Artem V. Navrotskiy */ public class UnauthorizedException extends RequestException { - public UnauthorizedException(@NotNull HttpUriRequest request, @NotNull HttpResponse response) { + public UnauthorizedException(@Nonnull HttpUriRequest request, @Nonnull HttpResponse response) { super(request, response); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/BatchWorker.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/BatchWorker.java index 01c31ca..646129e 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/BatchWorker.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/BatchWorker.java @@ -1,8 +1,6 @@ package ru.bozaro.gitlfs.client.internal; import org.apache.http.HttpStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.bozaro.gitlfs.client.AuthHelper; @@ -13,6 +11,8 @@ import ru.bozaro.gitlfs.common.data.Error; import ru.bozaro.gitlfs.common.data.*; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; @@ -35,28 +35,28 @@ public abstract class BatchWorker { private final Logger log = LoggerFactory.getLogger(BatchWorker.class); - @NotNull + @Nonnull private final Client client; - @NotNull + @Nonnull private final ExecutorService pool; - @NotNull + @Nonnull private final AtomicInteger batchSequence = new AtomicInteger(0); - @NotNull + @Nonnull private final AtomicInteger batchInProgress = new AtomicInteger(); - @NotNull + @Nonnull private final ConcurrentMap> objectQueue = new ConcurrentHashMap<>(); - @NotNull + @Nonnull private final AtomicInteger objectInProgress = new AtomicInteger(0); - @NotNull + @Nonnull private final AtomicReference currentAuth = new AtomicReference<>(null); - @NotNull + @Nonnull private final BatchSettings settings; - @NotNull + @Nonnull private final Operation operation; - public BatchWorker(@NotNull Client client, @NotNull ExecutorService pool, @NotNull BatchSettings settings, @NotNull Operation operation) { + public BatchWorker(@Nonnull Client client, @Nonnull ExecutorService pool, @Nonnull BatchSettings settings, @Nonnull Operation operation) { this.settings = settings; this.client = client; this.pool = pool; @@ -70,8 +70,8 @@ public BatchWorker(@NotNull Client client, @NotNull ExecutorService pool, @NotNu * @param meta Object metadata. * @return Return future with result. For same objects can return same future. */ - @NotNull - protected CompletableFuture enqueue(@NotNull final Meta meta, @NotNull final T context) { + @Nonnull + protected CompletableFuture enqueue(@Nonnull final Meta meta, @Nonnull final T context) { State state = objectQueue.get(meta.getOid()); if (state != null) { if (state.future.isCancelled()) { @@ -90,12 +90,12 @@ protected CompletableFuture enqueue(@NotNull final Meta meta, @NotNull final return state.future; } - @NotNull + @Nonnull protected ExecutorService getPool() { return pool; } - @NotNull + @Nonnull protected Client getClient() { return client; } @@ -143,7 +143,7 @@ private boolean tryBatchRequest(int batchId, boolean pooled) { return false; } - private void invalidateAuth(@NotNull Link auth) { + private void invalidateAuth(@Nonnull Link auth) { if (currentAuth.compareAndSet(auth, null)) { client.getAuthProvider().invalidateAuth(operation, auth); } @@ -172,7 +172,7 @@ private void submitBatchTask() { } } } - for (State value : batch.values()) { + for (State value : batch.values()) { value.future.completeExceptionally(new IOException("Requested object not found in server response: " + value.meta.getOid())); } } @@ -181,22 +181,22 @@ private void submitBatchTask() { invalidateAuth(auth); } } catch (IOException e) { - for (State state : batch.values()) { + for (State state : batch.values()) { state.onException(e, state.retry); } } } - @NotNull - protected Throwable createError(@NotNull Error error) { + @Nonnull + protected Throwable createError(@Nonnull Error error) { if (error.getCode() == HttpStatus.SC_NOT_FOUND) { return new FileNotFoundException(error.getMessage()); } return new IOException("Can't process object (code " + error.getCode() + "): " + error.getMessage()); } - @Nullable - protected abstract Work objectTask(@NotNull State state, @NotNull BatchItem item); + @CheckForNull + protected abstract Work objectTask(@Nonnull State state, @Nonnull BatchItem item); /** * Submit object processing task. @@ -205,7 +205,7 @@ protected Throwable createError(@NotNull Error error) { * @param item Metadata information with upload/download urls. * @param auth Urls authentication state. */ - private void submitTask(@NotNull State state, @NotNull BatchItem item, @NotNull Link auth) { + private void submitTask(@Nonnull State state, @Nonnull BatchItem item, @Nonnull Link auth) { // Submit task final StateHolder holder = new StateHolder(state); try { @@ -230,7 +230,7 @@ private void submitTask(@NotNull State state, @NotNull BatchItem item, @No } } - @NotNull + @Nonnull private Map> takeBatch() { final Map> batch = new HashMap<>(); final List> completed = new ArrayList<>(); @@ -252,7 +252,7 @@ private Map> takeBatch() { return batch; } - private void processObject(@NotNull State state, @NotNull Link auth, @NotNull Work worker) { + private void processObject(@Nonnull State state, @Nonnull Link auth, @Nonnull Work worker) { if (currentAuth.get() != auth) { state.auth = null; return; @@ -284,7 +284,7 @@ private void processObject(@NotNull State state, @NotNull Link auth, @NotN * @param task Task runnable * @param finalizer Finalizer to execute like 'try-final' block */ - private void executeInPool(@NotNull String name, @NotNull Runnable task, @Nullable Runnable finalizer, boolean pooled) { + private void executeInPool(@Nonnull String name, @Nonnull Runnable task, @CheckForNull Runnable finalizer, boolean pooled) { if (pool.isShutdown()) { log.warn("Thread pool is shutdown"); if (finalizer != null) { @@ -338,23 +338,23 @@ public String toString() { } public final static class State { - @NotNull + @Nonnull private final Meta meta; - @NotNull + @Nonnull private final T context; - @NotNull + @Nonnull private final CompletableFuture future = new CompletableFuture<>(); - @Nullable + @CheckForNull private volatile Link auth; private int retry; - public State(@NotNull Meta meta, @NotNull T context) { + public State(@Nonnull Meta meta, @Nonnull T context) { this.context = context; this.meta = meta; this.auth = null; } - public void onException(@NotNull Throwable e, int maxRetryCount) { + public void onException(@Nonnull Throwable e, int maxRetryCount) { retry++; if (retry >= maxRetryCount) { future.completeExceptionally(e); @@ -362,27 +362,27 @@ public void onException(@NotNull Throwable e, int maxRetryCount) { auth = null; } - @NotNull + @Nonnull public Meta getMeta() { return meta; } - @NotNull + @Nonnull public T getContext() { return context; } - @NotNull + @Nonnull public CompletableFuture getFuture() { return future; } } private final class StateHolder implements AutoCloseable { - @NotNull + @Nonnull private AtomicReference> stateRef; - public StateHolder(@NotNull State state) { + public StateHolder(@Nonnull State state) { this.stateRef = new AtomicReference<>(state); objectInProgress.incrementAndGet(); } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/HttpClientExecutor.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/HttpClientExecutor.java index 00bc112..238a264 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/HttpClientExecutor.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/HttpClientExecutor.java @@ -3,9 +3,9 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.CloseableHttpClient; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.client.HttpExecutor; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -14,16 +14,16 @@ * @author Artem V. Navrotskiy */ public final class HttpClientExecutor implements HttpExecutor { - @NotNull + @Nonnull private final CloseableHttpClient http; - public HttpClientExecutor(@NotNull CloseableHttpClient http) { + public HttpClientExecutor(@Nonnull CloseableHttpClient http) { this.http = http; } - @NotNull + @Nonnull @Override - public CloseableHttpResponse executeMethod(@NotNull HttpUriRequest request) throws IOException { + public CloseableHttpResponse executeMethod(@Nonnull HttpUriRequest request) throws IOException { return http.execute(request); } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/JsonPost.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/JsonPost.java index e8f8ea9..7686b10 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/JsonPost.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/JsonPost.java @@ -6,8 +6,8 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.ByteArrayEntity; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; @@ -19,19 +19,19 @@ * @author Artem V. Navrotskiy */ public class JsonPost implements Request { - @NotNull + @Nonnull private final Class type; - @NotNull + @Nonnull private final Req req; - public JsonPost(@NotNull Req req, @NotNull Class type) { + public JsonPost(@Nonnull Req req, @Nonnull Class type) { this.req = req; this.type = type; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws JsonProcessingException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws JsonProcessingException { final HttpPost method = new HttpPost(url); method.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); final ByteArrayEntity entity = new ByteArrayEntity(mapper.writeValueAsBytes(req)); @@ -41,7 +41,7 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public Res processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public Res processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { return mapper.readValue(response.getEntity().getContent(), type); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockCreate.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockCreate.java index f93c94b..f060245 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockCreate.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockCreate.java @@ -8,29 +8,29 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ByteArrayEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.data.*; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; import static ru.bozaro.gitlfs.common.Constants.MIME_LFS_JSON; public final class LockCreate implements Request { - @NotNull + @Nonnull private final String path; - @Nullable + @CheckForNull private final Ref ref; - public LockCreate(@NotNull String path, @Nullable Ref ref) { + public LockCreate(@Nonnull String path, @CheckForNull Ref ref) { this.path = path; this.ref = ref; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws JsonProcessingException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws JsonProcessingException { final HttpPost req = new HttpPost(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); @@ -43,7 +43,7 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public LockCreate.Res processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public LockCreate.Res processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_CREATED: return new Res(true, mapper.readValue(response.getEntity().getContent(), CreateLockRes.class).getLock(), null); @@ -55,7 +55,7 @@ public LockCreate.Res processResponse(@NotNull ObjectMapper mapper, @NotNull Htt } } - @NotNull + @Nonnull @Override public int[] statusCodes() { return new int[]{ @@ -67,12 +67,12 @@ public int[] statusCodes() { public static final class Res { private final boolean success; - @Nullable + @CheckForNull private final String message; - @NotNull + @Nonnull private final Lock lock; - private Res(boolean success, @NotNull Lock lock, @Nullable String message) { + private Res(boolean success, @Nonnull Lock lock, @CheckForNull String message) { this.success = success; this.lock = lock; this.message = message; @@ -82,12 +82,12 @@ public boolean isSuccess() { return success; } - @NotNull + @Nonnull public Lock getLock() { return lock; } - @Nullable + @CheckForNull public String getMessage() { return message; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockDelete.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockDelete.java index d24c652..9d097ae 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockDelete.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LockDelete.java @@ -8,13 +8,13 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ByteArrayEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.data.DeleteLockReq; import ru.bozaro.gitlfs.common.data.DeleteLockRes; import ru.bozaro.gitlfs.common.data.Lock; import ru.bozaro.gitlfs.common.data.Ref; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; @@ -22,17 +22,17 @@ public final class LockDelete implements Request { private final boolean force; - @Nullable + @CheckForNull private final Ref ref; - public LockDelete(boolean force, @Nullable Ref ref) { + public LockDelete(boolean force, @CheckForNull Ref ref) { this.force = force; this.ref = ref; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws JsonProcessingException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws JsonProcessingException { final HttpPost req = new HttpPost(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); @@ -45,7 +45,7 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public Lock processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public Lock processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: return mapper.readValue(response.getEntity().getContent(), DeleteLockRes.class).getLock(); @@ -56,7 +56,7 @@ public Lock processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse } } - @NotNull + @Nonnull @Override public int[] statusCodes() { return new int[]{ diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LocksList.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LocksList.java index 6448b1f..c980bc2 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LocksList.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/LocksList.java @@ -4,25 +4,25 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.LocksRes; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; import static ru.bozaro.gitlfs.common.Constants.MIME_LFS_JSON; public final class LocksList implements Request { - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) { final HttpGet req = new HttpGet(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); return req; } @Override - public LocksRes processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public LocksRes processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { return mapper.readValue(response.getEntity().getContent(), LocksRes.class); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaGet.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaGet.java index 682d9f6..4562d4d 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaGet.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaGet.java @@ -5,9 +5,9 @@ import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.ObjectRes; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; @@ -19,16 +19,16 @@ * @author Artem V. Navrotskiy */ public class MetaGet implements Request { - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) { final HttpGet req = new HttpGet(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); return req; } @Override - public ObjectRes processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public ObjectRes processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: return mapper.readValue(response.getEntity().getContent(), ObjectRes.class); @@ -39,7 +39,7 @@ public ObjectRes processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResp } } - @NotNull + @Nonnull @Override public int[] statusCodes() { return new int[]{ diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaPost.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaPost.java index 8dee7ee..cc9cf3b 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaPost.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/MetaPost.java @@ -8,10 +8,10 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ByteArrayEntity; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Meta; import ru.bozaro.gitlfs.common.data.ObjectRes; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; @@ -23,16 +23,16 @@ * @author Artem V. Navrotskiy */ public class MetaPost implements Request { - @NotNull + @Nonnull private final Meta meta; - public MetaPost(@NotNull Meta meta) { + public MetaPost(@Nonnull Meta meta) { this.meta = meta; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws JsonProcessingException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws JsonProcessingException { final HttpPost req = new HttpPost(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); final AbstractHttpEntity entity = new ByteArrayEntity(mapper.writeValueAsBytes(meta)); @@ -42,7 +42,7 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public ObjectRes processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public ObjectRes processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: return null; @@ -53,7 +53,7 @@ public ObjectRes processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResp } } - @NotNull + @Nonnull @Override public int[] statusCodes() { return new int[]{ diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectGet.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectGet.java index e960c7a..d67174e 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectGet.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectGet.java @@ -4,9 +4,9 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.client.io.StreamHandler; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -15,21 +15,21 @@ * @author Artem V. Navrotskiy */ public class ObjectGet implements Request { - @NotNull + @Nonnull private final StreamHandler handler; - public ObjectGet(@NotNull StreamHandler handler) { + public ObjectGet(@Nonnull StreamHandler handler) { this.handler = handler; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) { return new HttpGet(url); } @Override - public T processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public T processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException { return handler.accept(response.getEntity().getContent()); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectPut.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectPut.java index 86c4864..f7e8379 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectPut.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectPut.java @@ -7,9 +7,9 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.InputStreamEntity; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.client.io.StreamProvider; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.MIME_BINARY; @@ -28,9 +28,9 @@ public ObjectPut(StreamProvider streamProvider, long size) { this.size = size; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws IOException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws IOException { final HttpPut req = new HttpPut(url); final AbstractHttpEntity entity = new InputStreamEntity(streamProvider.getStream(), size); entity.setContentType(MIME_BINARY); @@ -39,11 +39,11 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public Void processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException { + public Void processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) { return null; } - @NotNull + @Nonnull @Override public int[] statusCodes() { return new int[]{ diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectVerify.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectVerify.java index 640d348..32d4861 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectVerify.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/ObjectVerify.java @@ -6,9 +6,9 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ByteArrayEntity; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Meta; +import javax.annotation.Nonnull; import java.io.IOException; import static ru.bozaro.gitlfs.common.Constants.HEADER_ACCEPT; @@ -20,16 +20,16 @@ * @author Artem V. Navrotskiy */ public class ObjectVerify implements Request { - @NotNull + @Nonnull private final Meta meta; - public ObjectVerify(@NotNull Meta meta) { + public ObjectVerify(@Nonnull Meta meta) { this.meta = meta; } - @NotNull + @Nonnull @Override - public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws IOException { + public HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws IOException { final HttpPost req = new HttpPost(url); req.addHeader(HEADER_ACCEPT, MIME_LFS_JSON); final byte[] content = mapper.writeValueAsBytes(meta); @@ -40,7 +40,7 @@ public HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull Strin } @Override - public Void processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) { + public Void processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) { return null; } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Request.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Request.java index 9210bdb..c241f47 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Request.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Request.java @@ -4,8 +4,8 @@ import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -14,17 +14,17 @@ * @author Artem V. Navrotskiy */ public interface Request { - @NotNull - HttpUriRequest createRequest(@NotNull ObjectMapper mapper, @NotNull String url) throws IOException; + @Nonnull + HttpUriRequest createRequest(@Nonnull ObjectMapper mapper, @Nonnull String url) throws IOException; - R processResponse(@NotNull ObjectMapper mapper, @NotNull HttpResponse response) throws IOException; + R processResponse(@Nonnull ObjectMapper mapper, @Nonnull HttpResponse response) throws IOException; /** * Success status codes. * * @return Success status codes. */ - @NotNull + @Nonnull default int[] statusCodes() { return new int[]{HttpStatus.SC_OK}; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Work.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Work.java index b1f90ce..3d9de50 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Work.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/internal/Work.java @@ -1,8 +1,8 @@ package ru.bozaro.gitlfs.client.internal; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Link; +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -11,5 +11,5 @@ * @author Artem V. Navrotskiy */ public interface Work { - R exec(@NotNull Link auth) throws IOException; + R exec(@Nonnull Link auth) throws IOException; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/ByteArrayStreamProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/ByteArrayStreamProvider.java index 190d863..285ff0b 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/ByteArrayStreamProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/ByteArrayStreamProvider.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -11,14 +10,14 @@ * @author Artem V. Navrotskiy */ public class ByteArrayStreamProvider implements StreamProvider { - @NotNull + @Nonnull private final byte[] data; - public ByteArrayStreamProvider(@NotNull byte[] data) { + public ByteArrayStreamProvider(@Nonnull byte[] data) { this.data = data; } - @NotNull + @Nonnull @Override public InputStream getStream() { return new ByteArrayInputStream(data); diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/FileStreamProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/FileStreamProvider.java index dc820f7..1a9362b 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/FileStreamProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/FileStreamProvider.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -13,14 +12,14 @@ * @author Artem V. Navrotskiy */ public class FileStreamProvider implements StreamProvider { - @NotNull + @Nonnull private final File file; - public FileStreamProvider(@NotNull File file) { + public FileStreamProvider(@Nonnull File file) { this.file = file; } - @NotNull + @Nonnull @Override public InputStream getStream() throws IOException { return new FileInputStream(file); diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamHandler.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamHandler.java index 9e1e303..a0ddd07 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamHandler.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamHandler.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; @@ -12,6 +11,6 @@ */ @FunctionalInterface public interface StreamHandler { - @NotNull - T accept(@NotNull InputStream inputStream) throws IOException; + @Nonnull + T accept(@Nonnull InputStream inputStream) throws IOException; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamProvider.java index 05d768f..dea4937 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StreamProvider.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; @@ -12,6 +11,6 @@ */ @FunctionalInterface public interface StreamProvider { - @NotNull + @Nonnull InputStream getStream() throws IOException; } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StringStreamProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StringStreamProvider.java index 204f04a..d0d68c5 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StringStreamProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/StringStreamProvider.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.nio.charset.StandardCharsets; /** @@ -10,7 +9,7 @@ * @author Artem V. Navrotskiy */ public class StringStreamProvider extends ByteArrayStreamProvider { - public StringStreamProvider(@NotNull String data) { + public StringStreamProvider(@Nonnull String data) { super(data.getBytes(StandardCharsets.UTF_8)); } } diff --git a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/UrlStreamProvider.java b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/UrlStreamProvider.java index 2bad4a5..db438b5 100644 --- a/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/UrlStreamProvider.java +++ b/gitlfs-client/src/main/java/ru/bozaro/gitlfs/client/io/UrlStreamProvider.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.client.io; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; import java.net.URL; @@ -12,14 +11,14 @@ * @author Artem V. Navrotskiy */ public class UrlStreamProvider implements StreamProvider { - @NotNull + @Nonnull private final URL url; - public UrlStreamProvider(@NotNull URL url) { + public UrlStreamProvider(@Nonnull URL url) { this.url = url; } - @NotNull + @Nonnull @Override public InputStream getStream() throws IOException { return url.openStream(); diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/AuthHelperTest.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/AuthHelperTest.java index 8a06878..c267f40 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/AuthHelperTest.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/AuthHelperTest.java @@ -1,10 +1,10 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import javax.annotation.Nonnull; import java.net.URI; /** @@ -25,7 +25,7 @@ public static Object[][] joinUrlProvider() { } @Test(dataProvider = "joinUrlProvider") - public void joinUrl(@NotNull String base, @NotNull String str, @NotNull String expected) { + public void joinUrl(@Nonnull String base, @Nonnull String str, @Nonnull String expected) { Assert.assertEquals(AuthHelper.join(URI.create(base), str), URI.create(expected)); } } diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/ClientBatchTest.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/ClientBatchTest.java index 42a94a3..7fc867b 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/ClientBatchTest.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/ClientBatchTest.java @@ -1,13 +1,13 @@ package ru.bozaro.gitlfs.client; import com.google.common.collect.ImmutableMap; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; import org.testng.annotations.Test; import ru.bozaro.gitlfs.common.JsonHelper; import ru.bozaro.gitlfs.common.data.Error; import ru.bozaro.gitlfs.common.data.*; +import javax.annotation.Nonnull; import java.io.IOException; import java.net.URI; import java.util.Arrays; @@ -34,7 +34,7 @@ public void batchUpload02() throws IOException { batchUpload("/ru/bozaro/gitlfs/client/batch-upload-02.yml"); } - private void batchUpload(@NotNull String path) throws IOException { + private void batchUpload(@Nonnull String path) throws IOException { final HttpReplay replay = YamlHelper.createReplay(path); final Client client = new Client(new FakeAuthProvider(), replay); final BatchRes result = client.postBatch(new BatchReq( @@ -94,7 +94,7 @@ public void batchDownload02() throws IOException { batchDownload("/ru/bozaro/gitlfs/client/batch-download-02.yml"); } - private void batchDownload(@NotNull String path) throws IOException { + private void batchDownload(@Nonnull String path) throws IOException { final HttpReplay replay = YamlHelper.createReplay(path); final Client client = new Client(new FakeAuthProvider(), replay); final BatchRes result = client.postBatch(new BatchReq( diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/FakeAuthProvider.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/FakeAuthProvider.java index 1f1fc0a..25d70f1 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/FakeAuthProvider.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/FakeAuthProvider.java @@ -1,13 +1,12 @@ package ru.bozaro.gitlfs.client; import com.google.common.collect.ImmutableMap; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.client.auth.AuthProvider; import ru.bozaro.gitlfs.common.data.Link; import ru.bozaro.gitlfs.common.data.Operation; -import java.io.IOException; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.net.URI; import java.util.concurrent.atomic.AtomicInteger; @@ -17,16 +16,16 @@ * @author Artem V. Navrotskiy */ public class FakeAuthProvider implements AuthProvider { - @NotNull + @Nonnull private final Object lock = new Object(); - @NotNull + @Nonnull private final AtomicInteger id = new AtomicInteger(0); - @Nullable + @CheckForNull private Link auth = null; - @NotNull + @Nonnull @Override - public Link getAuth(@NotNull Operation operation) throws IOException { + public Link getAuth(@Nonnull Operation operation) { synchronized (lock) { if (auth == null) { auth = createAuth(); @@ -36,7 +35,7 @@ public Link getAuth(@NotNull Operation operation) throws IOException { } @Override - public void invalidateAuth(@NotNull Operation operation, @NotNull Link auth) { + public void invalidateAuth(@Nonnull Operation operation, @Nonnull Link auth) { synchronized (lock) { if (this.auth == auth) { this.auth = null; @@ -44,7 +43,7 @@ public void invalidateAuth(@NotNull Operation operation, @NotNull Link auth) { } } - @NotNull + @Nonnull private Link createAuth() { return new Link(URI.create("http://gitlfs.local/test.git/info/lfs"), ImmutableMap.builder() .put("Authorization", "RemoteAuth Token-" + id.incrementAndGet()) diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecord.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecord.java index b00b22f..195ccf6 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecord.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecord.java @@ -8,9 +8,9 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.message.BasicHttpResponse; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -23,12 +23,12 @@ * @author Artem V. Navrotskiy */ public class HttpRecord { - @NotNull + @Nonnull private final Request request; - @NotNull + @Nonnull private final Response response; - public HttpRecord(@NotNull HttpUriRequest request, @NotNull HttpResponse response) throws IOException { + public HttpRecord(@Nonnull HttpUriRequest request, @Nonnull HttpResponse response) throws IOException { this.request = new Request(request); this.response = new Response(response); } @@ -38,8 +38,8 @@ protected HttpRecord() { this.response = new Response(); } - @NotNull - private static String asString(@NotNull byte[] data) { + @Nonnull + private static String asString(@Nonnull byte[] data) { if (Utf8.isWellFormed(data)) { return new String(data, StandardCharsets.UTF_8); } else { @@ -47,23 +47,23 @@ private static String asString(@NotNull byte[] data) { } } - @NotNull + @Nonnull public Request getRequest() { return request; } - @NotNull + @Nonnull public Response getResponse() { return response; } public static class Response { private final int statusCode; - @NotNull + @Nonnull private final String statusText; - @NotNull + @Nonnull private final TreeMap headers; - @Nullable + @CheckForNull private final byte[] body; Response() { @@ -73,7 +73,7 @@ public static class Response { this.body = null; } - Response(@NotNull HttpResponse response) throws IOException { + Response(@Nonnull HttpResponse response) throws IOException { this.statusCode = response.getStatusLine().getStatusCode(); this.statusText = response.getStatusLine().getReasonPhrase(); this.headers = new TreeMap<>(); @@ -87,7 +87,8 @@ public static class Response { } } - @NotNull CloseableHttpResponse toHttpResponse() { + @Nonnull + CloseableHttpResponse toHttpResponse() { final CloseableBasicHttpResponse response = new CloseableBasicHttpResponse(new ProtocolVersion("HTTP", 1, 0), statusCode, statusText); for (Map.Entry header : headers.entrySet()) @@ -115,7 +116,7 @@ public String toString() { } private static final class CloseableBasicHttpResponse extends BasicHttpResponse implements CloseableHttpResponse { - private CloseableBasicHttpResponse(@NotNull final ProtocolVersion ver, + private CloseableBasicHttpResponse(@Nonnull final ProtocolVersion ver, final int code, final String reason) { super(ver, code, reason); @@ -128,13 +129,13 @@ public void close() { } public static class Request { - @NotNull + @Nonnull private final String href; - @NotNull + @Nonnull private final String method; - @NotNull + @Nonnull private final TreeMap headers; - @Nullable + @CheckForNull private final byte[] body; Request() { @@ -144,7 +145,7 @@ public static class Request { body = null; } - Request(@NotNull HttpUriRequest request) throws IOException { + Request(@Nonnull HttpUriRequest request) throws IOException { this.href = request.getURI().toString(); this.method = request.getMethod(); this.headers = new TreeMap<>(); diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecorder.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecorder.java index 703b1dc..a738b86 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecorder.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpRecorder.java @@ -2,8 +2,8 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -14,24 +14,24 @@ * @author Artem V. Navrotskiy */ public class HttpRecorder implements HttpExecutor { - @NotNull + @Nonnull private final HttpExecutor executor; - @NotNull + @Nonnull private final List records = new ArrayList<>(); - public HttpRecorder(@NotNull HttpExecutor executor) { + public HttpRecorder(@Nonnull HttpExecutor executor) { this.executor = executor; } - @NotNull + @Nonnull @Override - public CloseableHttpResponse executeMethod(@NotNull HttpUriRequest request) throws IOException { + public CloseableHttpResponse executeMethod(@Nonnull HttpUriRequest request) throws IOException { final CloseableHttpResponse response = executor.executeMethod(request); records.add(new HttpRecord(request, response)); return response; } - @NotNull + @Nonnull public List getRecords() { return records; } diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpReplay.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpReplay.java index 5859332..f1b8ba7 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpReplay.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/HttpReplay.java @@ -2,9 +2,9 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; @@ -16,16 +16,16 @@ * @author Artem V. Navrotskiy */ public class HttpReplay implements HttpExecutor { - @NotNull + @Nonnull private final Deque records; - public HttpReplay(@NotNull List records) { + public HttpReplay(@Nonnull List records) { this.records = new ArrayDeque<>(records); } - @NotNull + @Nonnull @Override - public CloseableHttpResponse executeMethod(@NotNull HttpUriRequest request) throws IOException { + public CloseableHttpResponse executeMethod(@Nonnull HttpUriRequest request) throws IOException { final HttpRecord record = records.pollFirst(); Assert.assertNotNull(record); diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/Recorder.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/Recorder.java index fc3a7cc..1f6d89a 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/Recorder.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/Recorder.java @@ -2,7 +2,6 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.jetbrains.annotations.NotNull; import org.yaml.snakeyaml.Yaml; import ru.bozaro.gitlfs.client.auth.AuthProvider; import ru.bozaro.gitlfs.client.internal.HttpClientExecutor; @@ -10,6 +9,7 @@ import ru.bozaro.gitlfs.common.data.Meta; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.Nonnull; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -20,7 +20,7 @@ * @author Artem V. Navrotskiy */ public class Recorder { - public static void main(@NotNull String[] args) throws IOException { + public static void main(@Nonnull String[] args) throws IOException { final AuthProvider auth = AuthHelper.create("git@github.com:bozaro/test.git"); try (final CloseableHttpClient httpClient = HttpClients.createDefault()) { final HttpRecorder recorder = new HttpRecorder(new HttpClientExecutor(httpClient)); @@ -37,7 +37,7 @@ public static void main(@NotNull String[] args) throws IOException { } } - private static void doWork(@NotNull Client client) throws IOException { + private static void doWork(@Nonnull Client client) throws IOException { client.postBatch(new BatchReq( Operation.Upload, Arrays.asList( diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlConstructor.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlConstructor.java index a98eec9..993ab84 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlConstructor.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlConstructor.java @@ -1,6 +1,5 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; import org.yaml.snakeyaml.constructor.AbstractConstruct; import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; @@ -8,6 +7,7 @@ import org.yaml.snakeyaml.nodes.ScalarNode; import org.yaml.snakeyaml.nodes.Tag; +import javax.annotation.Nonnull; import java.nio.charset.StandardCharsets; /** @@ -22,17 +22,17 @@ public YamlConstructor() { } private class ConstructBlob extends AbstractConstruct { - @NotNull - public Object construct(@NotNull Node node) { - final String value = constructScalar((ScalarNode) node).toString(); + @Nonnull + public Object construct(@Nonnull Node node) { + final String value = constructScalar((ScalarNode) node); return value.getBytes(StandardCharsets.UTF_8); } } private class ConstructBinary extends AbstractConstruct { - @NotNull - public Object construct(@NotNull Node node) { - final String value = constructScalar((ScalarNode) node).toString(); + @Nonnull + public Object construct(@Nonnull Node node) { + final String value = constructScalar((ScalarNode) node); return Base64Coder.decodeLines(value); } } diff --git a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlHelper.java b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlHelper.java index 2188ae3..e42f566 100644 --- a/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlHelper.java +++ b/gitlfs-client/src/test/java/ru/bozaro/gitlfs/client/YamlHelper.java @@ -1,10 +1,10 @@ package ru.bozaro.gitlfs.client; -import org.jetbrains.annotations.NotNull; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.introspector.BeanAccess; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; @@ -14,15 +14,10 @@ * @author Artem V. Navrotskiy */ public class YamlHelper { - @NotNull + @Nonnull private static final Yaml YAML = createYaml(); - @NotNull - public static Yaml get() { - return YAML; - } - - @NotNull + @Nonnull private static Yaml createYaml() { final DumperOptions options = new DumperOptions(); options.setLineBreak(DumperOptions.LineBreak.UNIX); @@ -32,12 +27,17 @@ private static Yaml createYaml() { return yaml; } - @NotNull - public static HttpReplay createReplay(@NotNull String resource) { + @Nonnull + public static HttpReplay createReplay(@Nonnull String resource) { final List records = new ArrayList<>(); for (Object item : YamlHelper.get().loadAll(YamlHelper.class.getResourceAsStream(resource))) { records.add((HttpRecord) item); } return new HttpReplay(records); } + + @Nonnull + public static Yaml get() { + return YAML; + } } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/Constants.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/Constants.java index d72bf25..55ed255 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/Constants.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/Constants.java @@ -1,6 +1,6 @@ package ru.bozaro.gitlfs.common; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; /** * Git-lfs constants. @@ -11,22 +11,22 @@ public final class Constants { /** * See {@link HTTP/1.1 documentation}. */ - @NotNull + @Nonnull public static final String HEADER_AUTHORIZATION = "Authorization"; - @NotNull + @Nonnull public static final String HEADER_ACCEPT = "Accept"; - @NotNull + @Nonnull public static final String HEADER_LOCATION = "Location"; - @NotNull + @Nonnull public static final String MIME_LFS_JSON = "application/vnd.git-lfs+json"; - @NotNull + @Nonnull public static final String MIME_BINARY = "application/octet-stream"; - @NotNull + @Nonnull public static final String PATH_OBJECTS = "objects"; - @NotNull + @Nonnull public static final String PATH_BATCH = "objects/batch"; - @NotNull + @Nonnull public static final String PATH_LOCKS = "locks"; /** diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/JsonHelper.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/JsonHelper.java index 9600147..60f9137 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/JsonHelper.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/JsonHelper.java @@ -7,8 +7,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.util.StdDateFormat; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.text.DateFormat; import static com.fasterxml.jackson.core.util.DefaultPrettyPrinter.DEFAULT_ROOT_VALUE_SEPARATOR; @@ -26,10 +26,10 @@ public final class JsonHelper { *

* See https://github.com/git-lfs/git-lfs/issues/3660 */ - @NotNull + @Nonnull public static final DateFormat dateFormat = StdDateFormat.instance.withColonInTimeZone(true); - @NotNull + @Nonnull public static final ObjectMapper mapper = new ObjectMapper(); static { diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/LockConflictException.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/LockConflictException.java index e624627..8eb9856 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/LockConflictException.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/LockConflictException.java @@ -1,24 +1,25 @@ package ru.bozaro.gitlfs.common; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.data.Lock; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + public final class LockConflictException extends Exception { - @NotNull + @Nonnull private final Lock lock; - public LockConflictException(@NotNull Lock lock) { + public LockConflictException(@Nonnull Lock lock) { this("Lock exists", lock); } - public LockConflictException(@Nullable String message, @NotNull Lock lock) { + public LockConflictException(@CheckForNull String message, @Nonnull Lock lock) { super(message); this.lock = lock; } - @NotNull + @Nonnull public Lock getLock() { return lock; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/VerifyLocksResult.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/VerifyLocksResult.java index 50b2a0c..5dfa877 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/VerifyLocksResult.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/VerifyLocksResult.java @@ -1,27 +1,27 @@ package ru.bozaro.gitlfs.common; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Lock; +import javax.annotation.Nonnull; import java.util.List; public final class VerifyLocksResult { - @NotNull + @Nonnull private final List ourLocks; - @NotNull + @Nonnull private final List theirLocks; - public VerifyLocksResult(@NotNull List ourLocks, @NotNull List theirLocks) { + public VerifyLocksResult(@Nonnull List ourLocks, @Nonnull List theirLocks) { this.ourLocks = ourLocks; this.theirLocks = theirLocks; } - @NotNull + @Nonnull public List getOurLocks() { return ourLocks; } - @NotNull + @Nonnull public List getTheirLocks() { return theirLocks; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchItem.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchItem.java index 6ad2093..44559b0 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchItem.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchItem.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.Collections; import java.util.Map; import java.util.TreeMap; @@ -15,30 +15,30 @@ */ public final class BatchItem extends Meta implements Links { @JsonProperty(value = "actions") - @NotNull + @Nonnull private final Map links; @JsonProperty(value = "error") - @Nullable + @CheckForNull private final Error error; - public BatchItem(@NotNull Meta meta, @NotNull Map links) { + public BatchItem(@Nonnull Meta meta, @Nonnull Map links) { this(meta.getOid(), meta.getSize(), links, null, null); } public BatchItem( - @JsonProperty(value = "oid", required = true) @NotNull String oid, + @JsonProperty(value = "oid", required = true) @Nonnull String oid, @JsonProperty(value = "size", required = true) long size, - @JsonProperty(value = "actions") @Nullable Map links1, - @JsonProperty(value = "_links") @Nullable Map links2, - @JsonProperty(value = "error") @Nullable Error error + @JsonProperty(value = "actions") @CheckForNull Map links1, + @JsonProperty(value = "_links") @CheckForNull Map links2, + @JsonProperty(value = "error") @CheckForNull Error error ) { super(oid, size); this.links = combine(links1, links2); this.error = error; } - @NotNull - private static Map combine(@Nullable Map a, @Nullable Map b) { + @Nonnull + private static Map combine(@CheckForNull Map a, @CheckForNull Map b) { Map r = null; if (a != null && !a.isEmpty()) { r = a; @@ -54,17 +54,17 @@ private static Map combine(@Nullable Map a, @Nullable Map getLinks() { return links; } - @Nullable + @CheckForNull public Error getError() { return error; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchReq.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchReq.java index 54aa15a..d678422 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchReq.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchReq.java @@ -1,8 +1,8 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -14,27 +14,27 @@ */ public final class BatchReq { @JsonProperty(value = "operation", required = true) - @NotNull + @Nonnull private final Operation operation; @JsonProperty(value = "objects", required = true) - @NotNull + @Nonnull private final List objects; public BatchReq( - @JsonProperty(value = "operation", required = true) @NotNull Operation operation, - @JsonProperty(value = "objects", required = true) @NotNull List objects + @JsonProperty(value = "operation", required = true) @Nonnull Operation operation, + @JsonProperty(value = "objects", required = true) @Nonnull List objects ) { this.operation = operation; this.objects = Collections.unmodifiableList(new ArrayList<>(objects)); } - @NotNull + @Nonnull public Operation getOperation() { return operation; } - @NotNull + @Nonnull public List getObjects() { return objects; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchRes.java index 0fbabeb..9d4cb5d 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/BatchRes.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -15,17 +15,17 @@ */ public final class BatchRes { @JsonProperty(value = "objects", required = true) - @NotNull + @Nonnull private final List objects; @JsonCreator public BatchRes( - @JsonProperty(value = "objects", required = true) @NotNull List objects + @JsonProperty(value = "objects", required = true) @Nonnull List objects ) { this.objects = Collections.unmodifiableList(new ArrayList<>(objects)); } - @NotNull + @Nonnull public List getObjects() { return objects; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockReq.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockReq.java index 3d5ec7f..6f05f4e 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockReq.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockReq.java @@ -1,8 +1,9 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; public final class CreateLockReq { @@ -10,29 +11,29 @@ public final class CreateLockReq { * String path name of the locked file. */ @JsonProperty(value = "path", required = true) - @NotNull + @Nonnull private final String path; /** * Optional object describing the server ref that the locks belong to. */ @JsonProperty(value = "ref") - @Nullable + @CheckForNull private final Ref ref; public CreateLockReq( - @JsonProperty(value = "path", required = true) @NotNull String path, - @JsonProperty(value = "ref") @Nullable Ref ref) { + @JsonProperty(value = "path", required = true) @Nonnull String path, + @JsonProperty(value = "ref") @CheckForNull Ref ref) { this.path = path; this.ref = ref; } - @NotNull + @Nonnull public String getPath() { return path; } - @Nullable + @CheckForNull public Ref getRef() { return ref; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockRes.java index 43b9084..3d47796 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/CreateLockRes.java @@ -1,21 +1,22 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; public final class CreateLockRes { @JsonProperty(value = "lock", required = true) - @NotNull + @Nonnull private final Lock lock; public CreateLockRes( - @JsonProperty(value = "lock", required = true) @NotNull Lock lock + @JsonProperty(value = "lock", required = true) @Nonnull Lock lock ) { this.lock = lock; } - @NotNull + @Nonnull public Lock getLock() { return lock; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockReq.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockReq.java index 9cb113b..ac7c1dd 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockReq.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockReq.java @@ -1,7 +1,8 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.Nullable; + +import javax.annotation.CheckForNull; public final class DeleteLockReq { @@ -9,19 +10,19 @@ public final class DeleteLockReq { * Optional boolean specifying that the user is deleting another user's lock. */ @JsonProperty(value = "force") - @Nullable + @CheckForNull private final Boolean force; /** * Optional object describing the server ref that the locks belong to. */ @JsonProperty(value = "ref") - @Nullable + @CheckForNull private final Ref ref; public DeleteLockReq( - @JsonProperty(value = "force") @Nullable Boolean force, - @JsonProperty(value = "ref") @Nullable Ref ref) { + @JsonProperty(value = "force") @CheckForNull Boolean force, + @JsonProperty(value = "ref") @CheckForNull Ref ref) { this.force = force; this.ref = ref; } @@ -30,7 +31,7 @@ public boolean isForce() { return force != null && force; } - @Nullable + @CheckForNull public Ref getRef() { return ref; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockRes.java index 17681ef..0ca0a2d 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/DeleteLockRes.java @@ -1,21 +1,22 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; public final class DeleteLockRes { @JsonProperty(value = "lock", required = true) - @NotNull + @Nonnull private final Lock lock; public DeleteLockRes( - @JsonProperty(value = "lock", required = true) @NotNull Lock lock + @JsonProperty(value = "lock", required = true) @Nonnull Lock lock ) { this.lock = lock; } - @NotNull + @Nonnull public Lock getLock() { return lock; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Error.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Error.java index 63b1639..6825734 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Error.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Error.java @@ -2,7 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.Nullable; + +import javax.annotation.CheckForNull; /** * LFS error description. @@ -13,14 +14,14 @@ public final class Error { @JsonProperty(value = "code", required = true) private final int code; - @JsonProperty(value = "message", required = false) - @Nullable + @JsonProperty(value = "message") + @CheckForNull private final String message; @JsonCreator public Error( @JsonProperty(value = "code") int code, - @JsonProperty(value = "message") @Nullable String message + @JsonProperty(value = "message") @CheckForNull String message ) { this.code = code; this.message = message; @@ -30,7 +31,7 @@ public int getCode() { return code; } - @Nullable + @CheckForNull public String getMessage() { return message; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Link.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Link.java index 46da484..529ce72 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Link.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Link.java @@ -2,9 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.net.URI; import java.util.Collections; import java.util.Date; @@ -18,37 +18,37 @@ */ public class Link { @JsonProperty(value = "href", required = true) - @NotNull + @Nonnull private final URI href; @JsonProperty("header") - @NotNull + @Nonnull private final Map header; @JsonProperty("expires_at") - @Nullable + @CheckForNull private final Date expiresAt; @JsonCreator public Link( - @JsonProperty(value = "href", required = true) @NotNull URI href, - @JsonProperty("header") @Nullable Map header, - @JsonProperty("expires_at") @Nullable Date expiresAt + @JsonProperty(value = "href", required = true) @Nonnull URI href, + @JsonProperty("header") @CheckForNull Map header, + @JsonProperty("expires_at") @CheckForNull Date expiresAt ) { this.href = href; this.header = header == null ? Collections.emptyMap() : new TreeMap<>(header); this.expiresAt = expiresAt != null ? new Date(expiresAt.getTime()) : null; } - @NotNull + @Nonnull public URI getHref() { return href; } - @NotNull + @Nonnull public Map getHeader() { return header; } - @Nullable + @CheckForNull public Date getExpiresAt() { return expiresAt != null ? new Date(expiresAt.getTime()) : null; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LinkType.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LinkType.java index 8d4a666..236045c 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LinkType.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LinkType.java @@ -2,7 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; /** * LFSP operation type. @@ -17,7 +18,7 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitDownload(); } }, @@ -28,7 +29,7 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitUpload(); } }, @@ -39,7 +40,7 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitVerify(); } }, @@ -50,13 +51,13 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitSelf(); } }; @JsonCreator - public static LinkType forValue(@NotNull String value) { + public static LinkType forValue(@Nonnull String value) { for (LinkType item : values()) { if (item.toValue().equals(value)) { return item; @@ -68,7 +69,7 @@ public static LinkType forValue(@NotNull String value) { @JsonValue public abstract String toValue(); - public abstract R visit(@NotNull Visitor visitor); + public abstract R visit(@Nonnull Visitor visitor); public interface Visitor { R visitDownload(); diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Links.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Links.java index 28459e3..4971b52 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Links.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Links.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.common.data; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import java.util.Map; /** @@ -10,6 +9,6 @@ * @author Artem V. Navrotskiy */ public interface Links { - @NotNull + @Nonnull Map getLinks(); } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Lock.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Lock.java index 9dfec5d..0e4704a 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Lock.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Lock.java @@ -1,16 +1,16 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.Comparator; import java.util.Date; import java.util.Objects; public final class Lock implements Comparable { - @NotNull + @Nonnull public static final Comparator lockComparator = Comparator .comparing(Lock::getLockedAt) .thenComparing(Lock::getId); @@ -19,35 +19,35 @@ public final class Lock implements Comparable { * String ID of the Lock. */ @JsonProperty(value = "id", required = true) - @NotNull + @Nonnull private final String id; /** * String path name of the locked file. */ @JsonProperty(value = "path", required = true) - @NotNull + @Nonnull private final String path; /** * The timestamp the lock was created, as an ISO 8601 formatted string. */ @JsonProperty(value = "locked_at", required = true) - @NotNull + @Nonnull private final Date lockedAt; /** * The name of the user that created the Lock. This should be set from the user credentials posted when creating the lock. */ @JsonProperty(value = "owner") - @Nullable + @CheckForNull private final User owner; public Lock( - @JsonProperty(value = "id", required = true) @NotNull String id, - @JsonProperty(value = "path", required = true) @NotNull String path, - @JsonProperty(value = "locked_at") @NotNull Date lockedAt, - @JsonProperty(value = "owner") @Nullable User owner + @JsonProperty(value = "id", required = true) @Nonnull String id, + @JsonProperty(value = "path", required = true) @Nonnull String path, + @JsonProperty(value = "locked_at") @Nonnull Date lockedAt, + @JsonProperty(value = "owner") @CheckForNull User owner ) { this.id = id; this.path = path; @@ -55,12 +55,12 @@ public Lock( this.owner = owner; } - @NotNull + @Nonnull public String getPath() { return path; } - @Nullable + @CheckForNull public User getOwner() { return owner; } @@ -79,16 +79,16 @@ public boolean equals(Object o) { } @Override - public int compareTo(@NotNull Lock o) { + public int compareTo(@Nonnull Lock o) { return lockComparator.compare(this, o); } - @NotNull + @Nonnull public Date getLockedAt() { return lockedAt; } - @NotNull + @Nonnull public String getId() { return id; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LockConflictRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LockConflictRes.java index 74f9492..09225c3 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LockConflictRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LockConflictRes.java @@ -2,33 +2,34 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; public final class LockConflictRes { @JsonProperty(value = "lock", required = true) - @NotNull + @Nonnull private final Lock lock; @JsonProperty(value = "message", required = true) - @NotNull + @Nonnull private final String message; @JsonCreator public LockConflictRes( - @JsonProperty(value = "message", required = true) @NotNull String message, - @JsonProperty(value = "lock", required = true) @NotNull Lock lock + @JsonProperty(value = "message", required = true) @Nonnull String message, + @JsonProperty(value = "lock", required = true) @Nonnull Lock lock ) { this.lock = lock; this.message = message; } - @NotNull + @Nonnull public Lock getLock() { return lock; } - @NotNull + @Nonnull public String getMessage() { return message; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LocksRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LocksRes.java index e53cb53..eecc7e9 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LocksRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/LocksRes.java @@ -1,33 +1,33 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.List; public final class LocksRes { @JsonProperty(value = "locks", required = true) - @NotNull + @Nonnull private final List locks; @JsonProperty(value = "next_cursor") - @Nullable + @CheckForNull private final String nextCursor; public LocksRes( - @JsonProperty(value = "locks", required = true) @NotNull List locks, - @JsonProperty(value = "next_cursor") @Nullable String nextCursor) { + @JsonProperty(value = "locks", required = true) @Nonnull List locks, + @JsonProperty(value = "next_cursor") @CheckForNull String nextCursor) { this.locks = locks; this.nextCursor = nextCursor; } - @NotNull + @Nonnull public List getLocks() { return locks; } - @Nullable + @CheckForNull public String getNextCursor() { return nextCursor; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Meta.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Meta.java index de4c06b..7fb2435 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Meta.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Meta.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.util.Objects; /** @@ -13,7 +13,7 @@ */ public class Meta { @JsonProperty(value = "oid", required = true) - @NotNull + @Nonnull private final String oid; @JsonProperty(value = "size", required = true) @@ -21,14 +21,14 @@ public class Meta { @JsonCreator public Meta( - @JsonProperty(value = "oid", required = true) @NotNull String oid, + @JsonProperty(value = "oid", required = true) @Nonnull String oid, @JsonProperty(value = "size", required = true) long size ) { this.oid = oid; this.size = size; } - @NotNull + @Nonnull public String getOid() { return oid; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/ObjectRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/ObjectRes.java index 85d8e48..4de1427 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/ObjectRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/ObjectRes.java @@ -2,9 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.Collections; import java.util.Map; import java.util.TreeMap; @@ -16,28 +16,28 @@ */ public final class ObjectRes implements Links { @JsonProperty(value = "_links", required = true) - @NotNull + @Nonnull private final Map links; - @Nullable + @CheckForNull private final Meta meta; @JsonCreator public ObjectRes( - @JsonProperty(value = "oid") @Nullable String oid, + @JsonProperty(value = "oid") @CheckForNull String oid, @JsonProperty(value = "size") long size, - @JsonProperty(value = "_links", required = true) @NotNull Map links + @JsonProperty(value = "_links", required = true) @Nonnull Map links ) { this.meta = oid == null ? null : new Meta(oid, size); this.links = Collections.unmodifiableMap(new TreeMap<>(links)); } - @Nullable + @CheckForNull public Meta getMeta() { return meta; } @Override - @NotNull + @Nonnull public Map getLinks() { return links; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Operation.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Operation.java index dbad3de..4a7dcd6 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Operation.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Operation.java @@ -2,7 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; /** * LFSP operation type. @@ -17,7 +18,7 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitDownload(); } }, @@ -28,13 +29,13 @@ public String toValue() { } @Override - public R visit(@NotNull Visitor visitor) { + public R visit(@Nonnull Visitor visitor) { return visitor.visitUpload(); } }; @JsonCreator - public static Operation forValue(@NotNull String value) { + public static Operation forValue(@Nonnull String value) { for (Operation item : values()) { if (item.toValue().equals(value)) { return item; @@ -46,7 +47,7 @@ public static Operation forValue(@NotNull String value) { @JsonValue public abstract String toValue(); - public abstract R visit(@NotNull Visitor visitor); + public abstract R visit(@Nonnull Visitor visitor); public interface Visitor { R visitDownload(); diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Ref.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Ref.java index d8f2b1a..acfb453 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Ref.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/Ref.java @@ -1,8 +1,9 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; public final class Ref { @@ -10,19 +11,19 @@ public final class Ref { * Fully-qualified server refspec. */ @JsonProperty(value = "name", required = true) - @NotNull + @Nonnull private final String name; - public Ref(@JsonProperty(value = "name", required = true) @NotNull String name) { + public Ref(@JsonProperty(value = "name", required = true) @Nonnull String name) { this.name = name; } - @Nullable - public static Ref create(@Nullable String ref) { + @CheckForNull + public static Ref create(@CheckForNull String ref) { return ref == null ? null : new Ref(ref); } - @NotNull + @Nonnull public String getName() { return name; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/User.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/User.java index b9825e9..1fba981 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/User.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/User.java @@ -1,21 +1,22 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; public final class User { @JsonProperty(value = "name", required = true) - @NotNull + @Nonnull private final String name; public User( - @JsonProperty(value = "name", required = true) @NotNull String name + @JsonProperty(value = "name", required = true) @Nonnull String name ) { this.name = name; } - @NotNull + @Nonnull public String getName() { return name; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksReq.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksReq.java index 194fe81..c3a0bac 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksReq.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksReq.java @@ -1,7 +1,8 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.Nullable; + +import javax.annotation.CheckForNull; public final class VerifyLocksReq { @@ -9,43 +10,43 @@ public final class VerifyLocksReq { * Optional cursor to allow pagination. */ @JsonProperty(value = "cursor") - @Nullable + @CheckForNull private final String cursor; /** * Optional object describing the server ref that the locks belong to. */ @JsonProperty(value = "ref") - @Nullable + @CheckForNull private final Ref ref; /** * Optional limit to how many locks to return. */ @JsonProperty(value = "limit") - @Nullable + @CheckForNull private final Integer limit; public VerifyLocksReq( - @JsonProperty(value = "cursor") @Nullable String cursor, - @JsonProperty(value = "ref") @Nullable Ref ref, - @JsonProperty(value = "limit") @Nullable Integer limit) { + @JsonProperty(value = "cursor") @CheckForNull String cursor, + @JsonProperty(value = "ref") @CheckForNull Ref ref, + @JsonProperty(value = "limit") @CheckForNull Integer limit) { this.cursor = cursor; this.ref = ref; this.limit = limit; } - @Nullable + @CheckForNull public String getCursor() { return cursor; } - @Nullable + @CheckForNull public Ref getRef() { return ref; } - @Nullable + @CheckForNull public Integer getLimit() { return limit; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksRes.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksRes.java index e954d07..3dec2b2 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksRes.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/data/VerifyLocksRes.java @@ -1,43 +1,43 @@ package ru.bozaro.gitlfs.common.data; import com.fasterxml.jackson.annotation.JsonProperty; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.util.List; public final class VerifyLocksRes { @JsonProperty(value = "ours", required = true) - @NotNull + @Nonnull private final List ours; @JsonProperty(value = "theirs", required = true) - @NotNull + @Nonnull private final List theirs; @JsonProperty(value = "next_cursor") - @Nullable + @CheckForNull private final String nextCursor; public VerifyLocksRes( - @JsonProperty(value = "ours", required = true) @NotNull List ours, - @JsonProperty(value = "theirs", required = true) @NotNull List theirs, - @JsonProperty(value = "next_cursor") @Nullable String nextCursor) { + @JsonProperty(value = "ours", required = true) @Nonnull List ours, + @JsonProperty(value = "theirs", required = true) @Nonnull List theirs, + @JsonProperty(value = "next_cursor") @CheckForNull String nextCursor) { this.ours = ours; this.theirs = theirs; this.nextCursor = nextCursor; } - @NotNull + @Nonnull public List getOurs() { return ours; } - @NotNull + @Nonnull public List getTheirs() { return theirs; } - @Nullable + @CheckForNull public String getNextCursor() { return nextCursor; } diff --git a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/io/InputStreamValidator.java b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/io/InputStreamValidator.java index d5dc83d..1166357 100644 --- a/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/io/InputStreamValidator.java +++ b/gitlfs-common/src/main/java/ru/bozaro/gitlfs/common/io/InputStreamValidator.java @@ -1,8 +1,8 @@ package ru.bozaro.gitlfs.common.io; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.Meta; +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; @@ -14,18 +14,18 @@ * @author Artem V. Navrotskiy */ public class InputStreamValidator extends InputStream { - @NotNull + @Nonnull private static final char[] hexDigits = "0123456789abcdef".toCharArray(); - @NotNull + @Nonnull private final MessageDigest digest; - @NotNull + @Nonnull private final InputStream stream; - @NotNull + @Nonnull private final Meta meta; private boolean eof; private long totalSize; - public InputStreamValidator(@NotNull InputStream stream, @NotNull Meta meta) throws IOException { + public InputStreamValidator(@Nonnull InputStream stream, @Nonnull Meta meta) throws IOException { try { this.digest = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { @@ -71,8 +71,8 @@ private void checkSize(int size) throws IOException { } } - @NotNull - private static String toHexString(@NotNull byte[] bytes) { + @Nonnull + private static String toHexString(@Nonnull byte[] bytes) { StringBuilder sb = new StringBuilder(2 * bytes.length); for (byte b : bytes) { sb.append(hexDigits[(b >> 4) & 0xf]).append(hexDigits[b & 0xf]); @@ -81,7 +81,7 @@ private static String toHexString(@NotNull byte[] bytes) { } @Override - public int read(@NotNull byte[] buffer, int off, int len) throws IOException { + public int read(@Nonnull byte[] buffer, int off, int len) throws IOException { if (eof) { return -1; } diff --git a/gitlfs-common/src/test/java/ru/bozaro/gitlfs/common/data/SerializeTester.java b/gitlfs-common/src/test/java/ru/bozaro/gitlfs/common/data/SerializeTester.java index 82e3417..4dab49a 100644 --- a/gitlfs-common/src/test/java/ru/bozaro/gitlfs/common/data/SerializeTester.java +++ b/gitlfs-common/src/test/java/ru/bozaro/gitlfs/common/data/SerializeTester.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.common.data; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; import ru.bozaro.gitlfs.common.JsonHelper; +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; @@ -13,7 +13,7 @@ * @author Artem V. Navrotskiy */ public class SerializeTester { - public static T deserialize(@NotNull String path, @NotNull Class type) throws IOException { + public static T deserialize(@Nonnull String path, @Nonnull Class type) throws IOException { try (InputStream stream = SerializeTester.class.getResourceAsStream(path)) { Assert.assertNotNull(stream); diff --git a/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Constants.java b/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Constants.java index a5f310a..53a52df 100644 --- a/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Constants.java +++ b/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Constants.java @@ -1,6 +1,6 @@ package ru.bozaro.gitlfs.pointer; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; /** * Git-lfs constants. @@ -9,12 +9,12 @@ */ public class Constants { public static final int POINTER_MAX_SIZE = 1024; - @NotNull + @Nonnull public static final String VERSION_URL = "https://git-lfs.github.com/spec/v1"; - @NotNull + @Nonnull public static final String OID = "oid"; - @NotNull + @Nonnull public static final String SIZE = "size"; - @NotNull + @Nonnull public static final String VERSION = "version"; } diff --git a/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Pointer.java b/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Pointer.java index 81fb4af..0e798af 100644 --- a/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Pointer.java +++ b/gitlfs-pointer/src/main/java/ru/bozaro/gitlfs/pointer/Pointer.java @@ -1,8 +1,7 @@ package ru.bozaro.gitlfs.pointer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; @@ -22,34 +21,22 @@ * @author Artem V. Navrotskiy */ public class Pointer { - @NotNull + @Nonnull private static final byte[] PREFIX = (VERSION + ' ').getBytes(StandardCharsets.UTF_8); - @NotNull + @Nonnull private static final RequiredKey[] REQUIRED = new RequiredKey[]{ new RequiredKey(OID, Pattern.compile("^[0-9a-z]+:[0-9a-f]+$")), new RequiredKey(SIZE, Pattern.compile("^\\d+$")), }; - private static final class RequiredKey { - @NotNull - private final String name; - @NotNull - private final Pattern pattern; - - public RequiredKey(@NotNull String name, @NotNull Pattern pattern) { - this.name = name; - this.pattern = pattern; - } - } - /** * Serialize pointer map. * * @param pointer Pointer data. * @return Pointer content bytes. */ - @NotNull - public static byte[] serializePointer(@NotNull Map pointer) { + @Nonnull + public static byte[] serializePointer(@Nonnull Map pointer) { final Map data = new TreeMap<>(pointer); final StringBuilder buffer = new StringBuilder(); // Write version. @@ -73,8 +60,8 @@ public static byte[] serializePointer(@NotNull Map pointer) { * @param size Object size. * @return Return pointer data. */ - @NotNull - public static Map createPointer(@NotNull String oid, long size) { + @Nonnull + public static Map createPointer(@Nonnull String oid, long size) { final Map pointer = new TreeMap<>(); pointer.put(VERSION, VERSION_URL); pointer.put(OID, oid); @@ -88,8 +75,8 @@ public static Map createPointer(@NotNull String oid, long size) * @param stream Input stream. * @return Return pointer info or null if blob is not a pointer data. */ - @Nullable - public static Map parsePointer(@NotNull InputStream stream) throws IOException { + @CheckForNull + public static Map parsePointer(@Nonnull InputStream stream) throws IOException { byte[] buffer = new byte[Constants.POINTER_MAX_SIZE]; int size = 0; while (size < buffer.length) { @@ -108,19 +95,8 @@ public static Map parsePointer(@NotNull InputStream stream) thro * @param blob Blob data. * @return Return pointer info or null if blob is not a pointer data. */ - @Nullable - public static Map parsePointer(@NotNull byte[] blob) { - return parsePointer(blob, 0, blob.length); - } - - /** - * Read pointer data. - * - * @param blob Blob data. - * @return Return pointer info or null if blob is not a pointer data. - */ - @Nullable - public static Map parsePointer(@NotNull byte[] blob, final int offset, final int length) { + @CheckForNull + public static Map parsePointer(@Nonnull byte[] blob, final int offset, final int length) { // Check prefix if (length < PREFIX.length) return null; for (int i = 0; i < PREFIX.length; ++i) { @@ -132,10 +108,7 @@ public static Map parsePointer(@NotNull byte[] blob, final int o String lastKey = null; int keyOffset = offset; int required = 0; - while (true) { - if (keyOffset >= length) { - break; - } + while (keyOffset < length) { int valueOffset = keyOffset; // Key while (true) { @@ -153,12 +126,11 @@ public static Map parsePointer(@NotNull byte[] blob, final int o } int endOffset = valueOffset; // Value - while (true) { + do { endOffset++; if (endOffset >= length) return null; // Values MUST NOT contain return or newline characters. - if (blob[endOffset] == '\n') break; - } + } while (blob[endOffset] != '\n'); final String key = new String(blob, keyOffset, valueOffset - keyOffset, StandardCharsets.UTF_8); final String value; @@ -190,4 +162,27 @@ public static Map parsePointer(@NotNull byte[] blob, final int o } return result; } + + /** + * Read pointer data. + * + * @param blob Blob data. + * @return Return pointer info or null if blob is not a pointer data. + */ + @CheckForNull + public static Map parsePointer(@Nonnull byte[] blob) { + return parsePointer(blob, 0, blob.length); + } + + private static final class RequiredKey { + @Nonnull + private final String name; + @Nonnull + private final Pattern pattern; + + public RequiredKey(@Nonnull String name, @Nonnull Pattern pattern) { + this.name = name; + this.pattern = pattern; + } + } } diff --git a/gitlfs-pointer/src/test/java/ru/bozaro/gitlfs/pointer/PointerTest.java b/gitlfs-pointer/src/test/java/ru/bozaro/gitlfs/pointer/PointerTest.java index d28b8a0..24eac57 100644 --- a/gitlfs-pointer/src/test/java/ru/bozaro/gitlfs/pointer/PointerTest.java +++ b/gitlfs-pointer/src/test/java/ru/bozaro/gitlfs/pointer/PointerTest.java @@ -1,11 +1,11 @@ package ru.bozaro.gitlfs.pointer; import com.google.common.collect.ImmutableMap; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; import java.util.Map; @@ -51,8 +51,24 @@ public static Object[][] parseValidProvider() { }; } + @DataProvider(name = "parseInvalidProvider") + public static Object[][] parseInvalidProvider() { + return new Object[][]{ + new Object[]{"pointer-invalid-01.dat", "Version is not in first line"}, + new Object[]{"pointer-invalid-02.dat", "Two empty lines at end of file"}, + new Object[]{"pointer-invalid-03.dat", "Size not found"}, + new Object[]{"pointer-invalid-04.dat", "Oid not found"}, + new Object[]{"pointer-invalid-05.dat", "Version not found"}, + new Object[]{"pointer-invalid-06.dat", "Invalid items order"}, + new Object[]{"pointer-invalid-07.dat", "Non utf-8"}, + new Object[]{"pointer-invalid-08.dat", "Size is not number"}, + new Object[]{"pointer-invalid-09.dat", "Duplicate line"}, + new Object[]{"pointer-invalid-10.dat", "Duplicate version"}, + }; + } + @Test(dataProvider = "parseValidProvider") - public void parseValid(@NotNull String fileName, @NotNull Map expected) throws IOException { + public void parseValid(@Nonnull String fileName, @Nonnull Map expected) throws IOException { try (InputStream stream = getClass().getResourceAsStream(fileName)) { Assert.assertNotNull(stream); Assert.assertEquals(Pointer.parsePointer(stream), expected); @@ -70,24 +86,8 @@ public void parseAndSerialize() { Assert.assertEquals(parsed, pointer); } - @DataProvider(name = "parseInvalidProvider") - public static Object[][] parseInvalidProvider() { - return new Object[][]{ - new Object[]{"pointer-invalid-01.dat", "Version is not in first line"}, - new Object[]{"pointer-invalid-02.dat", "Two empty lines at end of file"}, - new Object[]{"pointer-invalid-03.dat", "Size not found"}, - new Object[]{"pointer-invalid-04.dat", "Oid not found"}, - new Object[]{"pointer-invalid-05.dat", "Version not found"}, - new Object[]{"pointer-invalid-06.dat", "Invalid items order"}, - new Object[]{"pointer-invalid-07.dat", "Non utf-8"}, - new Object[]{"pointer-invalid-08.dat", "Size is not number"}, - new Object[]{"pointer-invalid-09.dat", "Duplicate line"}, - new Object[]{"pointer-invalid-10.dat", "Duplicate version"}, - }; - } - @Test(dataProvider = "parseInvalidProvider") - public void parseInvalid(@NotNull String fileName, @NotNull String description) throws IOException { + public void parseInvalid(@Nonnull String fileName, @Nonnull String description) throws IOException { try (InputStream stream = getClass().getResourceAsStream(fileName)) { Assert.assertNotNull(stream); Assert.assertNull(Pointer.parsePointer(stream), description); diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentManager.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentManager.java index dadeff4..dd8054c 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentManager.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentManager.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.data.Meta; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; @@ -15,6 +15,33 @@ * @author Artem V. Navrotskiy */ public interface ContentManager { + /** + * Check access for requested operation and return some user information. + * + * @param request HTTP request. + * @return Object for send object. + */ + @Nonnull + Downloader checkDownloadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; + + /** + * Check access for requested operation and return some user information. + * + * @param request HTTP request. + * @return Object for receive object. + */ + @Nonnull + Uploader checkUploadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; + + /** + * Get metadata of uploaded object. + * + * @param hash Object metadata (hash and size). + * @return Return metadata of uploaded object. + */ + @CheckForNull + Meta getMetadata(@Nonnull String hash) throws IOException; + interface HeaderProvider { /** * Generate pointer header information (for example: replace transit Basic auth by Toker auth). @@ -22,8 +49,8 @@ interface HeaderProvider { * @param header Default header. Can be modified. * @return Pointer header information. */ - @NotNull - default Map createHeader(@NotNull Map header) { + @Nonnull + default Map createHeader(@Nonnull Map header) { return header; } } @@ -35,8 +62,8 @@ interface Downloader extends HeaderProvider { * @param hash Object metadata (hash and size). * @return Return object stream. */ - @NotNull - InputStream openObject(@NotNull String hash) throws IOException; + @Nonnull + InputStream openObject(@Nonnull String hash) throws IOException; /** * Get gzip-compressed object from storage. @@ -44,8 +71,8 @@ interface Downloader extends HeaderProvider { * @param hash Object metadata (hash and size). * @return Return gzip-compressed object stream. If gzip-stream is not available return null. */ - @Nullable - InputStream openObjectGzipped(@NotNull String hash) throws IOException; + @CheckForNull + InputStream openObjectGzipped(@Nonnull String hash) throws IOException; } interface Uploader extends HeaderProvider { @@ -56,33 +83,6 @@ interface Uploader extends HeaderProvider { * @param meta Object metadata (hash and size). * @param content Stream with object data. */ - void saveObject(@NotNull Meta meta, @NotNull InputStream content) throws IOException; + void saveObject(@Nonnull Meta meta, @Nonnull InputStream content) throws IOException; } - - /** - * Check access for requested operation and return some user information. - * - * @param request HTTP request. - * @return Object for send object. - */ - @NotNull - Downloader checkDownloadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; - - /** - * Check access for requested operation and return some user information. - * - * @param request HTTP request. - * @return Object for receive object. - */ - @NotNull - Uploader checkUploadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; - - /** - * Get metadata of uploaded object. - * - * @param hash Object metadata (hash and size). - * @return Return metadata of uploaded object. - */ - @Nullable - Meta getMetadata(@NotNull String hash) throws IOException; } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentServlet.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentServlet.java index f4e811d..97b9e07 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentServlet.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ContentServlet.java @@ -1,6 +1,5 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.Constants; import ru.bozaro.gitlfs.common.JsonHelper; import ru.bozaro.gitlfs.common.data.Meta; @@ -8,6 +7,7 @@ import ru.bozaro.gitlfs.server.internal.ObjectResponse; import ru.bozaro.gitlfs.server.internal.ResponseWriter; +import javax.annotation.Nonnull; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -24,12 +24,12 @@ * @author Artem V. Navrotskiy */ public class ContentServlet extends HttpServlet { - @NotNull + @Nonnull private final Pattern PATTERN_OID = Pattern.compile("^/[0-9a-f]{64}$"); - @NotNull + @Nonnull private final ContentManager manager; - public ContentServlet(@NotNull ContentManager manager) { + public ContentServlet(@Nonnull ContentManager manager) { this.manager = manager; } @@ -62,8 +62,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I super.doPost(req, resp); } - @NotNull - private ResponseWriter processObjectVerify(@NotNull HttpServletRequest req, @NotNull String oid) throws IOException, ServerError { + @Nonnull + private ResponseWriter processObjectVerify(@Nonnull HttpServletRequest req, @Nonnull String oid) throws IOException, ServerError { manager.checkUploadAccess(req); final Meta expectedMeta = JsonHelper.mapper.readValue(req.getInputStream(), Meta.class); final Meta actualMeta = manager.getMetadata(oid); @@ -87,22 +87,21 @@ protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws Se super.doPut(req, resp); } - @NotNull - private ResponseWriter processPut(@NotNull HttpServletRequest req, @NotNull String oid) throws ServerError, IOException { + @Nonnull + private ResponseWriter processPut(@Nonnull HttpServletRequest req, @Nonnull String oid) throws ServerError, IOException { final ContentManager.Uploader uploader = manager.checkUploadAccess(req); final Meta meta = new Meta(oid, -1); uploader.saveObject(meta, new InputStreamValidator(req.getInputStream(), meta)); return new ObjectResponse(HttpServletResponse.SC_OK, meta); } - @NotNull - private ResponseWriter processGet(@NotNull HttpServletRequest req, @NotNull String oid) throws ServerError, IOException { + @Nonnull + private ResponseWriter processGet(@Nonnull HttpServletRequest req, @Nonnull String oid) throws ServerError, IOException { final ContentManager.Downloader downloader = manager.checkDownloadAccess(req); final InputStream stream = downloader.openObject(oid); return response -> { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(Constants.MIME_BINARY); - //noinspection TryFinallyCanBeTryWithResources try { byte[] buffer = new byte[0x10000]; while (true) { diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ForbiddenError.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ForbiddenError.java index d6220ff..7194a2f 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ForbiddenError.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ForbiddenError.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletResponse; /** @@ -14,7 +13,7 @@ public ForbiddenError() { this("Access forbidden"); } - public ForbiddenError(@NotNull String message) { + public ForbiddenError(@Nonnull String message) { super(HttpServletResponse.SC_FORBIDDEN, message); } } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/HeaderProvider.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/HeaderProvider.java deleted file mode 100644 index d8c6780..0000000 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/HeaderProvider.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.bozaro.gitlfs.server; - -import org.jetbrains.annotations.Nullable; - -import java.util.Map; - -/** - * Header provider for authorization data. - * - * @author Artem V. Navrotskiy - */ -public interface HeaderProvider { - @Nullable - Map createHeader(); -} diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocalPointerManager.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocalPointerManager.java index 5aec7da..a9af0b9 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocalPointerManager.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocalPointerManager.java @@ -1,11 +1,11 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.Constants; import ru.bozaro.gitlfs.common.data.Error; import ru.bozaro.gitlfs.common.data.*; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.URI; @@ -19,9 +19,9 @@ * @author Artem V. Navrotskiy */ public class LocalPointerManager implements PointerManager { - @NotNull + @Nonnull private final ContentManager manager; - @NotNull + @Nonnull private final String contentLocation; /** @@ -30,31 +30,31 @@ public class LocalPointerManager implements PointerManager { * @param manager Content manager. * @param contentLocation Absolute or relative URL to ContentServlet. */ - public LocalPointerManager(@NotNull ContentManager manager, @NotNull String contentLocation) { + public LocalPointerManager(@Nonnull ContentManager manager, @Nonnull String contentLocation) { this.manager = manager; this.contentLocation = contentLocation.endsWith("/") ? contentLocation : contentLocation + "/"; } - @NotNull + @Nonnull @Override - public Locator checkUploadAccess(@NotNull HttpServletRequest request, @NotNull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError { + public Locator checkUploadAccess(@Nonnull HttpServletRequest request, @Nonnull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError { final ContentManager.HeaderProvider headerProvider = manager.checkUploadAccess(request); return createLocator(request, headerProvider, selfUrl); } - @NotNull + @Nonnull @Override - public Locator checkDownloadAccess(@NotNull HttpServletRequest request, @NotNull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError { + public Locator checkDownloadAccess(@Nonnull HttpServletRequest request, @Nonnull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError { final ContentManager.HeaderProvider headerProvider = manager.checkDownloadAccess(request); return createLocator(request, headerProvider, selfUrl); } - protected Locator createLocator(@NotNull HttpServletRequest request, @NotNull ContentManager.HeaderProvider headerProvider, @NotNull final URI selfUrl) { + protected Locator createLocator(@Nonnull HttpServletRequest request, @Nonnull ContentManager.HeaderProvider headerProvider, @Nonnull final URI selfUrl) { final Map header = headerProvider.createHeader(createDefaultHeader(request)); return new Locator() { - @NotNull + @Nonnull @Override - public BatchItem[] getLocations(@NotNull Meta[] metas) throws IOException { + public BatchItem[] getLocations(@Nonnull Meta[] metas) throws IOException { final BatchItem[] result = new BatchItem[metas.length]; for (int i = 0; i < metas.length; ++i) { result[i] = getLocation(header, selfUrl, metas[i]); @@ -62,8 +62,8 @@ public BatchItem[] getLocations(@NotNull Meta[] metas) throws IOException { return result; } - @NotNull - public BatchItem getLocation(@Nullable Map header, @NotNull URI selfUrl, @NotNull Meta meta) throws IOException { + @Nonnull + public BatchItem getLocation(@CheckForNull Map header, @Nonnull URI selfUrl, @Nonnull Meta meta) throws IOException { final Meta storageMeta = manager.getMetadata(meta.getOid()); if (storageMeta != null && meta.getSize() >= 0 && storageMeta.getSize() != meta.getSize()) @@ -84,8 +84,8 @@ public BatchItem getLocation(@Nullable Map header, @NotNull URI }; } - @NotNull - protected Map createDefaultHeader(@NotNull HttpServletRequest request) { + @Nonnull + protected Map createDefaultHeader(@Nonnull HttpServletRequest request) { final String auth = request.getHeader(Constants.HEADER_AUTHORIZATION); final Map header = new HashMap<>(); if (auth != null) { diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LockManager.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LockManager.java index ad085e2..5f65f4f 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LockManager.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LockManager.java @@ -1,37 +1,37 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.LockConflictException; import ru.bozaro.gitlfs.common.VerifyLocksResult; import ru.bozaro.gitlfs.common.data.Lock; import ru.bozaro.gitlfs.common.data.Ref; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; public interface LockManager { - @NotNull - LockRead checkDownloadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; + @Nonnull + LockRead checkDownloadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; - @NotNull - LockWrite checkUploadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; + @Nonnull + LockWrite checkUploadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError; interface LockRead { - @NotNull - List getLocks(@Nullable String path, @Nullable String lockId, @Nullable Ref ref) throws IOException; + @Nonnull + List getLocks(@CheckForNull String path, @CheckForNull String lockId, @CheckForNull Ref ref) throws IOException; } interface LockWrite extends LockRead { - @NotNull - Lock lock(@NotNull String path, @Nullable Ref ref) throws LockConflictException, IOException; + @Nonnull + Lock lock(@Nonnull String path, @CheckForNull Ref ref) throws LockConflictException, IOException; - @Nullable - Lock unlock(@NotNull String lockId, boolean force, @Nullable Ref ref) throws LockConflictException, IOException; + @CheckForNull + Lock unlock(@Nonnull String lockId, boolean force, @CheckForNull Ref ref) throws LockConflictException, IOException; - @NotNull - VerifyLocksResult verifyLocks(@Nullable Ref ref) throws IOException; + @Nonnull + VerifyLocksResult verifyLocks(@CheckForNull Ref ref) throws IOException; } } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocksServlet.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocksServlet.java index 672862b..538ae64 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocksServlet.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/LocksServlet.java @@ -1,6 +1,5 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.JsonHelper; import ru.bozaro.gitlfs.common.LockConflictException; import ru.bozaro.gitlfs.common.VerifyLocksResult; @@ -8,6 +7,7 @@ import ru.bozaro.gitlfs.server.internal.ObjectResponse; import ru.bozaro.gitlfs.server.internal.ResponseWriter; +import javax.annotation.Nonnull; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -19,10 +19,10 @@ public class LocksServlet extends HttpServlet { - @NotNull + @Nonnull private final LockManager lockManager; - public LocksServlet(@NotNull LockManager lockManager) { + public LocksServlet(@Nonnull LockManager lockManager) { this.lockManager = lockManager; } @@ -66,8 +66,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S super.doPost(req, resp); } - @NotNull - private ResponseWriter createLock(@NotNull HttpServletRequest req, @NotNull LockManager.LockWrite lockWrite) throws IOException { + @Nonnull + private ResponseWriter createLock(@Nonnull HttpServletRequest req, @Nonnull LockManager.LockWrite lockWrite) throws IOException { final CreateLockReq createLockReq = JsonHelper.mapper.readValue(req.getInputStream(), CreateLockReq.class); try { final Lock lock = lockWrite.lock(createLockReq.getPath(), createLockReq.getRef()); @@ -77,15 +77,15 @@ private ResponseWriter createLock(@NotNull HttpServletRequest req, @NotNull Lock } } - @NotNull - private ResponseWriter verifyLocks(@NotNull HttpServletRequest req, @NotNull LockManager.LockWrite lockWrite) throws IOException { + @Nonnull + private ResponseWriter verifyLocks(@Nonnull HttpServletRequest req, @Nonnull LockManager.LockWrite lockWrite) throws IOException { final VerifyLocksReq verifyLocksReq = JsonHelper.mapper.readValue(req.getInputStream(), VerifyLocksReq.class); final VerifyLocksResult result = lockWrite.verifyLocks(verifyLocksReq.getRef()); return new ObjectResponse(HttpServletResponse.SC_OK, new VerifyLocksRes(result.getOurLocks(), result.getTheirLocks(), null)); } - @NotNull - private ResponseWriter deleteLock(@NotNull HttpServletRequest req, @NotNull LockManager.LockWrite lockWrite, @NotNull String lockId) throws IOException, ServerError { + @Nonnull + private ResponseWriter deleteLock(@Nonnull HttpServletRequest req, @Nonnull LockManager.LockWrite lockWrite, @Nonnull String lockId) throws IOException, ServerError { final DeleteLockReq deleteLockReq = JsonHelper.mapper.readValue(req.getInputStream(), DeleteLockReq.class); try { final Lock lock = lockWrite.unlock(lockId, deleteLockReq.isForce(), deleteLockReq.getRef()); @@ -98,8 +98,8 @@ private ResponseWriter deleteLock(@NotNull HttpServletRequest req, @NotNull Lock } } - @NotNull - private ResponseWriter listLocks(@NotNull HttpServletRequest req, @NotNull LockManager.LockRead lockRead) throws IOException { + @Nonnull + private ResponseWriter listLocks(@Nonnull HttpServletRequest req, @Nonnull LockManager.LockRead lockRead) throws IOException { final String refName = req.getParameter("refspec"); final String path = req.getParameter("path"); diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerManager.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerManager.java index f090c83..7ef67be 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerManager.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerManager.java @@ -1,9 +1,9 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.data.BatchItem; import ru.bozaro.gitlfs.common.data.Meta; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.URI; @@ -14,16 +14,6 @@ * @author Artem V. Navrotskiy */ public interface PointerManager { - interface Locator { - /** - * @param metas Object hash array (note: metadata can have negative size for GET object request). - * @return Return batch items with same order and same count as metas array. - * @throws IOException - */ - @NotNull - BatchItem[] getLocations(@NotNull Meta[] metas) throws IOException; - } - /** * Check access for upload objects. * @@ -31,8 +21,8 @@ interface Locator { * @param selfUrl Http URL for this request. * @return Location provider. */ - @NotNull - Locator checkUploadAccess(@NotNull HttpServletRequest request, @NotNull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; + @Nonnull + Locator checkUploadAccess(@Nonnull HttpServletRequest request, @Nonnull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; /** * Check access for download objects. @@ -41,6 +31,15 @@ interface Locator { * @param selfUrl Http URL for this request. * @return Location provider. */ - @NotNull - Locator checkDownloadAccess(@NotNull HttpServletRequest request, @NotNull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; + @Nonnull + Locator checkDownloadAccess(@Nonnull HttpServletRequest request, @Nonnull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; + + interface Locator { + /** + * @param metas Object hash array (note: metadata can have negative size for GET object request). + * @return Return batch items with same order and same count as metas array. + */ + @Nonnull + BatchItem[] getLocations(@Nonnull Meta[] metas) throws IOException; + } } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerServlet.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerServlet.java index 4969d17..2eae8ca 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerServlet.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/PointerServlet.java @@ -1,7 +1,5 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.Constants; import ru.bozaro.gitlfs.common.JsonHelper; import ru.bozaro.gitlfs.common.data.Error; @@ -9,6 +7,8 @@ import ru.bozaro.gitlfs.server.internal.ObjectResponse; import ru.bozaro.gitlfs.server.internal.ResponseWriter; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -38,11 +38,11 @@ * @author Artem V. Navrotskiy */ public class PointerServlet extends HttpServlet { - @NotNull + @Nonnull private static final Pattern PATTERN_OID = Pattern.compile("^/[0-9a-f]{64}$"); - @NotNull + @Nonnull private final PointerManager manager; - @NotNull + @Nonnull private final AccessCheckerVisitor accessCheckerVisitor; /** @@ -51,17 +51,17 @@ public class PointerServlet extends HttpServlet { * @param manager Content manager. * @param contentLocation Absolute or relative URL to ContentServlet. */ - public PointerServlet(@NotNull ContentManager manager, @NotNull String contentLocation) { + public PointerServlet(@Nonnull ContentManager manager, @Nonnull String contentLocation) { this(new LocalPointerManager(manager, contentLocation)); } - public PointerServlet(@NotNull PointerManager manager) { + public PointerServlet(@Nonnull PointerManager manager) { this.manager = manager; this.accessCheckerVisitor = new AccessCheckerVisitor(manager); } - @NotNull - private static BatchItem[] filterLocations(@NotNull BatchItem[] items, @NotNull LocationFilter filter) throws IOException { + @Nonnull + private static BatchItem[] filterLocations(@Nonnull BatchItem[] items, @Nonnull LocationFilter filter) throws IOException { final BatchItem[] result = new BatchItem[items.length]; for (int i = 0; i < items.length; ++i) { if (items[i].getError() == null) { @@ -73,15 +73,15 @@ private static BatchItem[] filterLocations(@NotNull BatchItem[] items, @NotNull return result; } - @NotNull - private static BatchItem filterDownload(@NotNull BatchItem item) { + @Nonnull + private static BatchItem filterDownload(@Nonnull BatchItem item) { if (item.getLinks().containsKey(LinkType.Download)) return new BatchItem(item.getOid(), item.getSize(), filterLocation(item.getLinks(), LinkType.Download), null, null); return new BatchItem(item.getOid(), item.getSize(), null, null, new Error(HttpServletResponse.SC_NOT_FOUND, "Object not found")); } - private static Map filterLocation(@NotNull Map links, @NotNull LinkType... linkTypes) { + private static Map filterLocation(@Nonnull Map links, @Nonnull LinkType... linkTypes) { final Map result = new TreeMap<>(); for (LinkType linkType : linkTypes) { final Link link = links.get(linkType); @@ -90,8 +90,8 @@ private static Map filterLocation(@NotNull Map l return result; } - @NotNull - private static BatchItem filterUpload(@NotNull BatchItem item) throws IOException { + @Nonnull + private static BatchItem filterUpload(@Nonnull BatchItem item) throws IOException { if (item.getLinks().containsKey(LinkType.Download)) return new BatchItem(item.getOid(), item.getSize(), filterLocation(item.getLinks(), LinkType.Verify), null, null); @@ -116,7 +116,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se } @Override - protected void doPost(@NotNull HttpServletRequest req, @NotNull HttpServletResponse resp) throws ServletException, IOException { + protected void doPost(@Nonnull HttpServletRequest req, @Nonnull HttpServletResponse resp) throws ServletException, IOException { try { checkMimeTypes(req); @@ -135,13 +135,13 @@ protected void doPost(@NotNull HttpServletRequest req, @NotNull HttpServletRespo super.doPost(req, resp); } - public static void checkMimeTypes(@NotNull HttpServletRequest request) throws ServerError { + public static void checkMimeTypes(@Nonnull HttpServletRequest request) throws ServerError { checkMimeType(request.getContentType()); checkMimeType(request.getHeader(Constants.HEADER_ACCEPT)); } - @NotNull - private ResponseWriter processObjectPost(@NotNull HttpServletRequest req) throws ServerError, IOException { + @Nonnull + private ResponseWriter processObjectPost(@Nonnull HttpServletRequest req) throws ServerError, IOException { final URI selfUrl = getSelfUrl(req); final PointerManager.Locator locator = manager.checkUploadAccess(req, selfUrl); final Meta meta = JsonHelper.mapper.readValue(req.getInputStream(), Meta.class); @@ -161,15 +161,21 @@ private ResponseWriter processObjectPost(@NotNull HttpServletRequest req) throws throw new ServerError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid locations list", null); } - @NotNull - private ResponseWriter processBatchPost(@NotNull HttpServletRequest req) throws ServerError, IOException { + @Nonnull + private ResponseWriter processBatchPost(@Nonnull HttpServletRequest req) throws ServerError, IOException { final BatchReq batchReq = JsonHelper.mapper.readValue(req.getInputStream(), BatchReq.class); final PointerManager.Locator locator = batchReq.getOperation().visit(accessCheckerVisitor).checkAccess(req, getSelfUrl(req)); final BatchItem[] locations = getLocations(locator, batchReq.getObjects().toArray(new Meta[0])); return new ObjectResponse(HttpServletResponse.SC_OK, new BatchRes(Arrays.asList(locations))); } - private static void checkMimeType(@Nullable String contentType) throws ServerError { + public static void sendError(@Nonnull HttpServletResponse resp, @Nonnull ServerError e) throws IOException { + resp.setStatus(e.getStatusCode()); + resp.setContentType(Constants.MIME_LFS_JSON); + JsonHelper.mapper.writeValue(resp.getOutputStream(), new Error(e.getStatusCode(), e.getMessage())); + } + + private static void checkMimeType(@CheckForNull String contentType) throws ServerError { String actualType = contentType; if (actualType != null) { int separator = actualType.indexOf(';'); @@ -185,29 +191,8 @@ private static void checkMimeType(@Nullable String contentType) throws ServerErr } } - @NotNull - private ResponseWriter processObjectGet(@NotNull HttpServletRequest req, @NotNull String oid) throws ServerError, IOException { - final PointerManager.Locator locator = manager.checkDownloadAccess(req, getSelfUrl(req)); - final BatchItem location = getLocation(locator, new Meta(oid, -1)); - // Return error information. - final Error error = location.getError(); - if (error != null) { - throw new ServerError(error.getCode(), error.getMessage(), null); - } - if (location.getLinks().containsKey(LinkType.Download)) { - return new ObjectResponse(HttpServletResponse.SC_OK, new ObjectRes(location.getOid(), location.getSize(), addSelfLink(req, location.getLinks()))); - } - throw new ServerError(HttpServletResponse.SC_NOT_FOUND, "Object not found", null); - } - - public static void sendError(@NotNull HttpServletResponse resp, @NotNull ServerError e) throws IOException { - resp.setStatus(e.getStatusCode()); - resp.setContentType(Constants.MIME_LFS_JSON); - JsonHelper.mapper.writeValue(resp.getOutputStream(), new Error(e.getStatusCode(), e.getMessage())); - } - - @NotNull - protected URI getSelfUrl(@NotNull HttpServletRequest req) { + @Nonnull + protected URI getSelfUrl(@Nonnull HttpServletRequest req) { try { return new URI(req.getScheme(), null, req.getServerName(), req.getServerPort(), req.getServletPath(), null, null); } catch (URISyntaxException e) { @@ -215,19 +200,19 @@ protected URI getSelfUrl(@NotNull HttpServletRequest req) { } } - @NotNull - private BatchItem getLocation(@NotNull PointerManager.Locator locator, @NotNull Meta meta) throws IOException, ServerError { + @Nonnull + private BatchItem getLocation(@Nonnull PointerManager.Locator locator, @Nonnull Meta meta) throws IOException, ServerError { return getLocations(locator, new Meta[]{meta})[0]; } - private static Map addSelfLink(@NotNull HttpServletRequest req, @NotNull Map links) { + private static Map addSelfLink(@Nonnull HttpServletRequest req, @Nonnull Map links) { final Map result = new TreeMap<>(links); result.put(LinkType.Self, new Link(URI.create(String.valueOf(req.getRequestURL())), null, null)); return result; } - @NotNull - private BatchItem[] getLocations(@NotNull PointerManager.Locator locator, @NotNull Meta[] metas) throws ServerError, IOException { + @Nonnull + private BatchItem[] getLocations(@Nonnull PointerManager.Locator locator, @Nonnull Meta[] metas) throws ServerError, IOException { final BatchItem[] locations = locator.getLocations(metas); // Invalid locations list. if (locations.length != metas.length) { @@ -241,23 +226,38 @@ private BatchItem[] getLocations(@NotNull PointerManager.Locator locator, @NotNu return locations; } + @Nonnull + private ResponseWriter processObjectGet(@Nonnull HttpServletRequest req, @Nonnull String oid) throws ServerError, IOException { + final PointerManager.Locator locator = manager.checkDownloadAccess(req, getSelfUrl(req)); + final BatchItem location = getLocation(locator, new Meta(oid, -1)); + // Return error information. + final Error error = location.getError(); + if (error != null) { + throw new ServerError(error.getCode(), error.getMessage(), null); + } + if (location.getLinks().containsKey(LinkType.Download)) { + return new ObjectResponse(HttpServletResponse.SC_OK, new ObjectRes(location.getOid(), location.getSize(), addSelfLink(req, location.getLinks()))); + } + throw new ServerError(HttpServletResponse.SC_NOT_FOUND, "Object not found", null); + } + @FunctionalInterface protected interface AccessChecker { - @NotNull - PointerManager.Locator checkAccess(@NotNull HttpServletRequest request, @NotNull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; + @Nonnull + PointerManager.Locator checkAccess(@Nonnull HttpServletRequest request, @Nonnull URI selfUrl) throws IOException, ForbiddenError, UnauthorizedError; } @FunctionalInterface protected interface LocationFilter { - @NotNull - BatchItem filter(@NotNull BatchItem item) throws IOException; + @Nonnull + BatchItem filter(@Nonnull BatchItem item) throws IOException; } private static class AccessCheckerVisitor implements Operation.Visitor { - @NotNull + @Nonnull private final PointerManager manager; - public AccessCheckerVisitor(@NotNull PointerManager manager) { + public AccessCheckerVisitor(@Nonnull PointerManager manager) { this.manager = manager; } @@ -271,7 +271,7 @@ public AccessChecker visitUpload() { return wrapChecker(manager::checkUploadAccess, PointerServlet::filterUpload); } - private AccessChecker wrapChecker(@NotNull AccessChecker checker, @NotNull LocationFilter filter) { + private AccessChecker wrapChecker(@Nonnull AccessChecker checker, @Nonnull LocationFilter filter) { return (request, selfUrl) -> { PointerManager.Locator locator = checker.checkAccess(request, selfUrl); return metas -> filterLocations(locator.getLocations(metas), filter); diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ServerError.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ServerError.java index 0e3d47a..6ca2313 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ServerError.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/ServerError.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletResponse; /** @@ -26,6 +25,6 @@ public int getStatusCode() { return statusCode; } - public void updateHeaders(@NotNull HttpServletResponse response) { + public void updateHeaders(@Nonnull HttpServletResponse response) { } } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/UnauthorizedError.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/UnauthorizedError.java index a8b68af..05e08f8 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/UnauthorizedError.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/UnauthorizedError.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletResponse; /** @@ -10,21 +9,21 @@ * @author Artem V. Navrotskiy */ public class UnauthorizedError extends ServerError { - @NotNull + @Nonnull private String authenticate; - public UnauthorizedError(@NotNull String authenticate) { + public UnauthorizedError(@Nonnull String authenticate) { super(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); this.authenticate = authenticate; } - @NotNull + @Nonnull public String getAuthenticate() { return authenticate; } @Override - public void updateHeaders(@NotNull HttpServletResponse response) { + public void updateHeaders(@Nonnull HttpServletResponse response) { super.updateHeaders(response); response.addHeader("WWW-Authenticate", authenticate); } diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ObjectResponse.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ObjectResponse.java index 477744a..a8dba47 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ObjectResponse.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ObjectResponse.java @@ -1,8 +1,8 @@ package ru.bozaro.gitlfs.server.internal; -import org.jetbrains.annotations.NotNull; import ru.bozaro.gitlfs.common.JsonHelper; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -15,16 +15,16 @@ */ public class ObjectResponse implements ResponseWriter { private int status; - @NotNull + @Nonnull private Object value; - public ObjectResponse(int status, @NotNull Object value) { + public ObjectResponse(int status, @Nonnull Object value) { this.status = status; this.value = value; } @Override - public void write(@NotNull HttpServletResponse response) throws IOException { + public void write(@Nonnull HttpServletResponse response) throws IOException { response.setStatus(status); response.setContentType(MIME_LFS_JSON); JsonHelper.mapper.writeValue(response.getOutputStream(), value); diff --git a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ResponseWriter.java b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ResponseWriter.java index 8373650..dc61100 100644 --- a/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ResponseWriter.java +++ b/gitlfs-server/src/main/java/ru/bozaro/gitlfs/server/internal/ResponseWriter.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.server.internal; -import org.jetbrains.annotations.NotNull; - +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -11,5 +10,5 @@ * @author Artem V. Navrotskiy */ public interface ResponseWriter { - void write(@NotNull HttpServletResponse response) throws IOException; + void write(@Nonnull HttpServletResponse response) throws IOException; } diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/AuthContext.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/AuthContext.java deleted file mode 100644 index b5c36bd..0000000 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/AuthContext.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.bozaro.gitlfs.server; - -import org.jetbrains.annotations.NotNull; -import ru.bozaro.gitlfs.common.data.Operation; - -/** - * Test authenticatio context. - * - * @author Artem V. Navrotskiy - */ -public class AuthContext { - @NotNull - private final Operation operation; - - public AuthContext(@NotNull Operation operation) { - this.operation = operation; - } - - @NotNull - public Operation getOperation() { - return operation; - } -} diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/BatchTest.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/BatchTest.java index 176df4d..10b03fc 100644 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/BatchTest.java +++ b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/BatchTest.java @@ -1,7 +1,6 @@ package ru.bozaro.gitlfs.server; import com.google.common.io.ByteStreams; -import org.jetbrains.annotations.NotNull; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -14,6 +13,7 @@ import ru.bozaro.gitlfs.client.io.ByteArrayStreamProvider; import ru.bozaro.gitlfs.common.data.Meta; +import javax.annotation.Nonnull; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -42,7 +42,7 @@ public static Object[][] batchProvider() { } @Test(dataProvider = "batchProvider") - public void uploadTest(int tokenMaxUsage, @NotNull BatchSettings settings) throws Exception { + public void uploadTest(int tokenMaxUsage, @Nonnull BatchSettings settings) throws Exception { final ExecutorService pool = Executors.newFixedThreadPool(4); try (final EmbeddedLfsServer server = new EmbeddedLfsServer(new MemoryStorage(tokenMaxUsage), null)) { final AuthProvider auth = server.getAuthProvider(); @@ -81,8 +81,43 @@ public void uploadTest(int tokenMaxUsage, @NotNull BatchSettings settings) throw } } + private void upload(@Nonnull BatchUploader uploader, @Nonnull List contents, @Nonnull MemoryStorage storage) throws Exception { + // Upload data + upload(uploader, contents); + // Check result + for (byte[] content : contents) { + final Meta meta = Client.generateMeta(new ByteArrayStreamProvider(content)); + Assert.assertNotNull(storage.getMetadata(meta.getOid()), new String(content, StandardCharsets.UTF_8)); + } + } + + @Nonnull + private static byte[] content(int id) { + return content("TEST", id); + } + + private void upload(@Nonnull BatchUploader uploader, @Nonnull List contents) throws Exception { + // Upload data + @SuppressWarnings("unchecked") final CompletableFuture[] futures = contents + .stream() + .map(content -> uploader.upload(new ByteArrayStreamProvider(content))) + .toArray(CompletableFuture[]::new); + // Wait uploading finished + CompletableFuture.allOf(futures).get(TIMEOUT, TimeUnit.MILLISECONDS); + // Check future status + for (CompletableFuture future : futures) { + future.get(); + } + } + + @Nonnull + private static byte[] content(@Nonnull String prefix, int id) { + final String result = prefix + " " + id; + return result.getBytes(StandardCharsets.UTF_8); + } + @Test(dataProvider = "batchProvider") - public void downloadTest(int tokenMaxUsage, @NotNull BatchSettings settings) throws Exception { + public void downloadTest(int tokenMaxUsage, @Nonnull BatchSettings settings) throws Exception { final ExecutorService pool = Executors.newFixedThreadPool(4); try (final EmbeddedLfsServer server = new EmbeddedLfsServer(new MemoryStorage(tokenMaxUsage), null)) { final AuthProvider auth = server.getAuthProvider(); @@ -126,19 +161,17 @@ public void downloadTest(int tokenMaxUsage, @NotNull BatchSettings settings) thr } } - private void download(@NotNull BatchDownloader downloader, @NotNull List contents, @NotNull MemoryStorage storage) throws Exception { + private void download(@Nonnull BatchDownloader downloader, @Nonnull List contents, @Nonnull MemoryStorage storage) throws Exception { download(downloader, contents, meta -> storage.getObject(meta.getOid()) != null); } - private void download(@NotNull BatchDownloader downloader, @NotNull List contents, @NotNull List expected) throws Exception { - final Set oids = new HashSet<>(); - for (byte[] content : expected) { - oids.add(Client.generateMeta(new ByteArrayStreamProvider(content)).getOid()); + private void populate(@Nonnull MemoryStorage storage, @Nonnull List contents) throws IOException { + for (byte[] content : contents) { + storage.saveObject(new ByteArrayStreamProvider(content)); } - download(downloader, contents, meta -> oids.contains(meta.getOid())); } - private void download(@NotNull BatchDownloader downloader, @NotNull List contents, @NotNull Function checker) throws Exception { + private void download(@Nonnull BatchDownloader downloader, @Nonnull List contents, @Nonnull Function checker) throws Exception { // Download data final Map> map = new HashMap<>(); for (byte[] content : contents) { @@ -161,37 +194,6 @@ private void download(@NotNull BatchDownloader downloader, @NotNull List } } - private void upload(@NotNull BatchUploader uploader, @NotNull List contents) throws Exception { - // Upload data - @SuppressWarnings("unchecked") - final CompletableFuture[] futures = contents - .stream() - .map(content -> uploader.upload(new ByteArrayStreamProvider(content))) - .toArray(CompletableFuture[]::new); - // Wait uploading finished - CompletableFuture.allOf(futures).get(TIMEOUT, TimeUnit.MILLISECONDS); - // Check future status - for (CompletableFuture future : futures) { - future.get(); - } - } - - private void upload(@NotNull BatchUploader uploader, @NotNull List contents, @NotNull MemoryStorage storage) throws Exception { - // Upload data - upload(uploader, contents); - // Check result - for (byte[] content : contents) { - final Meta meta = Client.generateMeta(new ByteArrayStreamProvider(content)); - Assert.assertNotNull(storage.getMetadata(meta.getOid()), new String(content, StandardCharsets.UTF_8)); - } - } - - private void populate(@NotNull MemoryStorage storage, @NotNull List contents) throws InterruptedException, ExecutionException, TimeoutException, IOException { - for (byte[] content : contents) { - storage.saveObject(new ByteArrayStreamProvider(content)); - } - } - @Test public void simple() throws Exception { try (final EmbeddedLfsServer server = new EmbeddedLfsServer(new MemoryStorage(-1), null)) { @@ -204,7 +206,7 @@ public void github() throws Exception { fullCircle(new ExternalAuthProvider("git@github.com:bozaro/test.git")); } - private void fullCircle(@NotNull AuthProvider auth) throws Exception { + private void fullCircle(@Nonnull AuthProvider auth) throws Exception { final ExecutorService pool = Executors.newFixedThreadPool(4); try { BatchSettings settings = new BatchSettings() @@ -249,14 +251,11 @@ private void fullCircle(@NotNull AuthProvider auth) throws Exception { } } - @NotNull - private static byte[] content(int id) { - return content("TEST", id); - } - - @NotNull - private static byte[] content(@NotNull String prefix, int id) { - final String result = prefix + " " + id; - return result.getBytes(StandardCharsets.UTF_8); + private void download(@Nonnull BatchDownloader downloader, @Nonnull List contents, @Nonnull List expected) throws Exception { + final Set oids = new HashSet<>(); + for (byte[] content : expected) { + oids.add(Client.generateMeta(new ByteArrayStreamProvider(content)).getOid()); + } + download(downloader, contents, meta -> oids.contains(meta.getOid())); } } \ No newline at end of file diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedHttpServer.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedHttpServer.java index 98d227c..c5f4283 100644 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedHttpServer.java +++ b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedHttpServer.java @@ -5,8 +5,8 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import javax.servlet.Servlet; import java.net.URI; import java.net.URISyntaxException; @@ -17,11 +17,11 @@ * @author Artem V. Navrotskiy */ public class EmbeddedHttpServer implements AutoCloseable { - @NotNull + @Nonnull private final Server server; - @NotNull + @Nonnull private final ServerConnector http; - @NotNull + @Nonnull private final ServletHandler servletHandler; public EmbeddedHttpServer() throws Exception { @@ -37,7 +37,7 @@ public EmbeddedHttpServer() throws Exception { server.start(); } - @NotNull + @Nonnull public URI getBase() { try { return new URI("http", null, http.getHost(), http.getLocalPort(), null, null, null); @@ -46,7 +46,7 @@ public URI getBase() { } } - public void addServlet(@NotNull String pathSpec, @NotNull Servlet servlet) { + public void addServlet(@Nonnull String pathSpec, @Nonnull Servlet servlet) { servletHandler.addServletWithMapping(new ServletHolder(servlet), pathSpec); } diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedLfsServer.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedLfsServer.java index 6daca3f..a5096f8 100644 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedLfsServer.java +++ b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/EmbeddedLfsServer.java @@ -1,23 +1,24 @@ package ru.bozaro.gitlfs.server; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.client.auth.AuthProvider; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + /** * Embedded LFS server for servlet testing. * * @author Artem V. Navrotskiy */ public class EmbeddedLfsServer implements AutoCloseable { - @NotNull + @Nonnull private final EmbeddedHttpServer server; - @NotNull + @Nonnull private final MemoryStorage storage; - @Nullable + @CheckForNull private final LockManager lockManager; - public EmbeddedLfsServer(@NotNull MemoryStorage storage, @Nullable LockManager lockManager) throws Exception { + public EmbeddedLfsServer(@Nonnull MemoryStorage storage, @CheckForNull LockManager lockManager) throws Exception { this.lockManager = lockManager; this.server = new EmbeddedHttpServer(); this.storage = storage; @@ -31,12 +32,12 @@ public AuthProvider getAuthProvider() { return storage.getAuthProvider(server.getBase().resolve("/foo/bar.git/info/lfs")); } - @NotNull + @Nonnull public MemoryStorage getStorage() { return storage; } - @Nullable + @CheckForNull public LockManager getLockManager() { return lockManager; } diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryLockManager.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryLockManager.java index b6cc202..4aabfd3 100644 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryLockManager.java +++ b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryLockManager.java @@ -1,14 +1,14 @@ package ru.bozaro.gitlfs.server; import com.google.common.base.Strings; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import ru.bozaro.gitlfs.common.LockConflictException; import ru.bozaro.gitlfs.common.VerifyLocksResult; import ru.bozaro.gitlfs.common.data.Lock; import ru.bozaro.gitlfs.common.data.Ref; import ru.bozaro.gitlfs.common.data.User; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.ArrayList; @@ -20,35 +20,35 @@ import java.util.stream.Stream; public final class MemoryLockManager implements LockManager, LockManager.LockWrite { - @NotNull + @Nonnull private final AtomicInteger nextId = new AtomicInteger(1); - @NotNull + @Nonnull private final List locks = new ArrayList<>(); - @NotNull + @Nonnull private final ContentManager contentManager; - public MemoryLockManager(@NotNull ContentManager contentManager) { + public MemoryLockManager(@Nonnull ContentManager contentManager) { this.contentManager = contentManager; } @Override - @NotNull - public LockRead checkDownloadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { + @Nonnull + public LockRead checkDownloadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { contentManager.checkDownloadAccess(request); return this; } @Override - @NotNull - public LockWrite checkUploadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { + @Nonnull + public LockWrite checkUploadAccess(@Nonnull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { contentManager.checkUploadAccess(request); return this; } @Override - @NotNull - public List getLocks(@Nullable String path, @Nullable String lockId, @Nullable Ref ref) { + @Nonnull + public List getLocks(@CheckForNull String path, @CheckForNull String lockId, @CheckForNull Ref ref) { Stream stream = locks.stream(); if (!Strings.isNullOrEmpty(path)) @@ -61,8 +61,8 @@ public List getLocks(@Nullable String path, @Nullable String lockId, @Null } @Override - @NotNull - public Lock lock(@NotNull String path, @Nullable Ref ref) throws LockConflictException { + @Nonnull + public Lock lock(@Nonnull String path, @CheckForNull Ref ref) throws LockConflictException { for (Lock lock : locks) if (lock.getPath().equals(path)) throw new LockConflictException(lock); @@ -73,8 +73,8 @@ public Lock lock(@NotNull String path, @Nullable Ref ref) throws LockConflictExc } @Override - @Nullable - public Lock unlock(@NotNull String lockId, boolean force, @Nullable Ref ref) throws LockConflictException { + @CheckForNull + public Lock unlock(@Nonnull String lockId, boolean force, @CheckForNull Ref ref) { Lock lock = null; for (Lock l : locks) { if (l.getId().equals(lockId)) { @@ -91,7 +91,8 @@ public Lock unlock(@NotNull String lockId, boolean force, @Nullable Ref ref) thr } @Override - public @NotNull VerifyLocksResult verifyLocks(@Nullable Ref ref) { + public @Nonnull + VerifyLocksResult verifyLocks(@CheckForNull Ref ref) { return new VerifyLocksResult(locks, Collections.emptyList()); } } diff --git a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryStorage.java b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryStorage.java index 09dc76a..1b3542d 100644 --- a/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryStorage.java +++ b/gitlfs-server/src/test/java/ru/bozaro/gitlfs/server/MemoryStorage.java @@ -3,8 +3,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.hash.Hashing; import com.google.common.io.ByteStreams; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.testng.Assert; import ru.bozaro.gitlfs.client.Client; import ru.bozaro.gitlfs.client.auth.AuthProvider; @@ -15,6 +13,8 @@ import ru.bozaro.gitlfs.common.data.Meta; import ru.bozaro.gitlfs.common.data.Operation; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; @@ -31,9 +31,9 @@ * @author Artem V. Navrotskiy */ public class MemoryStorage implements ContentManager { - @NotNull + @Nonnull private final Map storage = new ConcurrentHashMap<>(); - @NotNull + @Nonnull private final AtomicInteger tokenId = new AtomicInteger(0); private final int tokenMaxUsage; @@ -41,35 +41,28 @@ public MemoryStorage(int tokenMaxUsage) { this.tokenMaxUsage = tokenMaxUsage; } - @Nullable + @Nonnull @Override - public Meta getMetadata(@NotNull String hash) throws IOException { - final byte[] data = storage.get(hash); - return data == null ? null : new Meta(hash, data.length); - } - - @NotNull - @Override - public Downloader checkDownloadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { + public Downloader checkDownloadAccess(@Nonnull HttpServletRequest request) throws UnauthorizedError { if (!getToken().equals(request.getHeader(Constants.HEADER_AUTHORIZATION))) { throw new UnauthorizedError("Basic realm=\"Test\""); } return new Downloader() { - @NotNull - public InputStream openObject(@NotNull String hash) throws IOException { + @Nonnull + public InputStream openObject(@Nonnull String hash) throws IOException { final byte[] data = storage.get(hash); if (data == null) throw new FileNotFoundException(); return new ByteArrayInputStream(data); } - @Nullable - public InputStream openObjectGzipped(@NotNull String hash) throws IOException { + @CheckForNull + public InputStream openObjectGzipped(@Nonnull String hash) { return null; } }; } - @NotNull + @Nonnull private String getToken() { if (tokenMaxUsage > 0) { final int token = tokenId.incrementAndGet(); @@ -79,14 +72,23 @@ private String getToken() { } } - public void saveObject(@NotNull StreamProvider provider) throws IOException { - final Meta meta = Client.generateMeta(provider); - try (InputStream stream = provider.getStream()) { - saveObject(meta, stream); + @Nonnull + @Override + public Uploader checkUploadAccess(@Nonnull HttpServletRequest request) throws UnauthorizedError { + if (!getToken().equals(request.getHeader(Constants.HEADER_AUTHORIZATION))) { + throw new UnauthorizedError("Basic realm=\"Test\""); } + return this::saveObject; + } + + @CheckForNull + @Override + public Meta getMetadata(@Nonnull String hash) { + final byte[] data = storage.get(hash); + return data == null ? null : new Meta(hash, data.length); } - public void saveObject(@NotNull Meta meta, @NotNull InputStream content) throws IOException { + public void saveObject(@Nonnull Meta meta, @Nonnull InputStream content) throws IOException { final byte[] data = ByteStreams.toByteArray(content); if (meta.getSize() >= 0) { Assert.assertEquals(meta.getSize(), data.length); @@ -95,26 +97,24 @@ public void saveObject(@NotNull Meta meta, @NotNull InputStream content) throws storage.put(meta.getOid(), data); } - @Nullable - public byte[] getObject(@NotNull String oid) { - return storage.get(oid); + public void saveObject(@Nonnull StreamProvider provider) throws IOException { + final Meta meta = Client.generateMeta(provider); + try (InputStream stream = provider.getStream()) { + saveObject(meta, stream); + } } - @NotNull - @Override - public Uploader checkUploadAccess(@NotNull HttpServletRequest request) throws IOException, ForbiddenError, UnauthorizedError { - if (!getToken().equals(request.getHeader(Constants.HEADER_AUTHORIZATION))) { - throw new UnauthorizedError("Basic realm=\"Test\""); - } - return this::saveObject; + @CheckForNull + public byte[] getObject(@Nonnull String oid) { + return storage.get(oid); } - @NotNull - public AuthProvider getAuthProvider(@NotNull URI href) { + @Nonnull + public AuthProvider getAuthProvider(@Nonnull URI href) { return new CachedAuthProvider() { - @NotNull + @Nonnull @Override - protected Link getAuthUncached(@NotNull Operation operation) throws IOException, InterruptedException { + protected Link getAuthUncached(@Nonnull Operation operation) { return new Link(href, ImmutableMap.of(Constants.HEADER_AUTHORIZATION, getToken()), null); } };