194bcde66SMarkus Duft /* 294bcde66SMarkus Duft * Copyright (C) 2016, Christian Halstrick <christian.halstrick@sap.com> 3*5c5f7c6bSMatthias Sohn * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com> and others 494bcde66SMarkus Duft * 5*5c5f7c6bSMatthias Sohn * This program and the accompanying materials are made available under the 6*5c5f7c6bSMatthias Sohn * terms of the Eclipse Distribution License v. 1.0 which is available at 7*5c5f7c6bSMatthias Sohn * https://www.eclipse.org/org/documents/edl-v10.php. 894bcde66SMarkus Duft * 9*5c5f7c6bSMatthias Sohn * SPDX-License-Identifier: BSD-3-Clause 1094bcde66SMarkus Duft */ 1194bcde66SMarkus Duft package org.eclipse.jgit.lfs; 1294bcde66SMarkus Duft 1394bcde66SMarkus Duft import java.util.List; 1494bcde66SMarkus Duft import java.util.Map; 1594bcde66SMarkus Duft 16ea2f7e93SMarkus Duft import com.google.gson.FieldNamingPolicy; 17ea2f7e93SMarkus Duft import com.google.gson.Gson; 18ea2f7e93SMarkus Duft import com.google.gson.GsonBuilder; 19ea2f7e93SMarkus Duft 2094bcde66SMarkus Duft /** 2194bcde66SMarkus Duft * This interface describes the network protocol used between lfs client and lfs 2294bcde66SMarkus Duft * server 2394bcde66SMarkus Duft * 2494bcde66SMarkus Duft * @since 4.11 2594bcde66SMarkus Duft */ 2694bcde66SMarkus Duft public interface Protocol { 2794bcde66SMarkus Duft /** A request sent to an LFS server */ 2894bcde66SMarkus Duft class Request { 2994bcde66SMarkus Duft /** The operation of this request */ 3094bcde66SMarkus Duft public String operation; 3194bcde66SMarkus Duft 3294bcde66SMarkus Duft /** The objects of this request */ 3394bcde66SMarkus Duft public List<ObjectSpec> objects; 3494bcde66SMarkus Duft } 3594bcde66SMarkus Duft 3694bcde66SMarkus Duft /** A response received from an LFS server */ 3794bcde66SMarkus Duft class Response { 3894bcde66SMarkus Duft public List<ObjectInfo> objects; 3994bcde66SMarkus Duft } 4094bcde66SMarkus Duft 4194bcde66SMarkus Duft /** 4294bcde66SMarkus Duft * MetaData of an LFS object. Needs to be specified when requesting objects 4394bcde66SMarkus Duft * from the LFS server and is also returned in the response 4494bcde66SMarkus Duft */ 4594bcde66SMarkus Duft class ObjectSpec { 4694bcde66SMarkus Duft public String oid; // the objectid 4794bcde66SMarkus Duft 4894bcde66SMarkus Duft public long size; // the size of the object 4994bcde66SMarkus Duft } 5094bcde66SMarkus Duft 5194bcde66SMarkus Duft /** 5294bcde66SMarkus Duft * Describes in a response all actions the LFS server offers for a single 5394bcde66SMarkus Duft * object 5494bcde66SMarkus Duft */ 5594bcde66SMarkus Duft class ObjectInfo extends ObjectSpec { 5694bcde66SMarkus Duft public Map<String, Action> actions; // Maps operation to action 5794bcde66SMarkus Duft 5894bcde66SMarkus Duft public Error error; 5994bcde66SMarkus Duft } 6094bcde66SMarkus Duft 6194bcde66SMarkus Duft /** 6294bcde66SMarkus Duft * Describes in a Response a single action the client can execute on a 6394bcde66SMarkus Duft * single object 6494bcde66SMarkus Duft */ 6594bcde66SMarkus Duft class Action { 6694bcde66SMarkus Duft public String href; 6794bcde66SMarkus Duft 6894bcde66SMarkus Duft public Map<String, String> header; 6994bcde66SMarkus Duft } 7094bcde66SMarkus Duft 71ea2f7e93SMarkus Duft /** 72ea2f7e93SMarkus Duft * An action with an additional expiration timestamp 73ea2f7e93SMarkus Duft * 74ea2f7e93SMarkus Duft * @since 4.11 75ea2f7e93SMarkus Duft */ 76ea2f7e93SMarkus Duft class ExpiringAction extends Action { 77ea2f7e93SMarkus Duft /** 78ea2f7e93SMarkus Duft * Absolute date/time in format "yyyy-MM-dd'T'HH:mm:ss.SSSX" 79ea2f7e93SMarkus Duft */ 80ea2f7e93SMarkus Duft public String expiresAt; 81ea2f7e93SMarkus Duft 82ea2f7e93SMarkus Duft /** 83ea2f7e93SMarkus Duft * Validity time in milliseconds (preferred over expiresAt as specified: 84ea2f7e93SMarkus Duft * https://github.com/git-lfs/git-lfs/blob/master/docs/api/authentication.md) 85ea2f7e93SMarkus Duft */ 86ea2f7e93SMarkus Duft public String expiresIn; 87ea2f7e93SMarkus Duft } 88ea2f7e93SMarkus Duft 8994bcde66SMarkus Duft /** Describes an error to be returned by the LFS batch API */ 9094bcde66SMarkus Duft class Error { 9194bcde66SMarkus Duft public int code; 9294bcde66SMarkus Duft 9394bcde66SMarkus Duft public String message; 9494bcde66SMarkus Duft } 9594bcde66SMarkus Duft 9694bcde66SMarkus Duft /** 9794bcde66SMarkus Duft * The "download" operation 9894bcde66SMarkus Duft */ 9994bcde66SMarkus Duft String OPERATION_DOWNLOAD = "download"; //$NON-NLS-1$ 10094bcde66SMarkus Duft 10194bcde66SMarkus Duft /** 10294bcde66SMarkus Duft * The "upload" operation 10394bcde66SMarkus Duft */ 10494bcde66SMarkus Duft String OPERATION_UPLOAD = "upload"; //$NON-NLS-1$ 10594bcde66SMarkus Duft 10694bcde66SMarkus Duft /** 10794bcde66SMarkus Duft * The contenttype used in LFS requests 10894bcde66SMarkus Duft */ 10994bcde66SMarkus Duft String CONTENTTYPE_VND_GIT_LFS_JSON = "application/vnd.git-lfs+json; charset=utf-8"; //$NON-NLS-1$ 11094bcde66SMarkus Duft 11194bcde66SMarkus Duft /** 11294bcde66SMarkus Duft * Authorization header when auto-discovering via SSH. 11394bcde66SMarkus Duft */ 11494bcde66SMarkus Duft String HDR_AUTH = "Authorization"; //$NON-NLS-1$ 11594bcde66SMarkus Duft 11694bcde66SMarkus Duft /** 11794bcde66SMarkus Duft * Prefix of authentication token obtained through SSH. 11894bcde66SMarkus Duft */ 11994bcde66SMarkus Duft String HDR_AUTH_SSH_PREFIX = "Ssh: "; //$NON-NLS-1$ 12094bcde66SMarkus Duft 12194bcde66SMarkus Duft /** 12294bcde66SMarkus Duft * Path to the LFS info servlet. 12394bcde66SMarkus Duft */ 12494bcde66SMarkus Duft String INFO_LFS_ENDPOINT = "/info/lfs"; //$NON-NLS-1$ 12594bcde66SMarkus Duft 12694bcde66SMarkus Duft /** 12794bcde66SMarkus Duft * Path to the LFS objects servlet. 12894bcde66SMarkus Duft */ 12994bcde66SMarkus Duft String OBJECTS_LFS_ENDPOINT = "/objects/batch"; //$NON-NLS-1$ 130ea2f7e93SMarkus Duft 131ea2f7e93SMarkus Duft /** 132ea2f7e93SMarkus Duft * @return a {@link Gson} instance suitable for handling this 133ea2f7e93SMarkus Duft * {@link Protocol} 134ea2f7e93SMarkus Duft * 135ea2f7e93SMarkus Duft * @since 4.11 136ea2f7e93SMarkus Duft */ gson()137ea2f7e93SMarkus Duft public static Gson gson() { 138ea2f7e93SMarkus Duft return new GsonBuilder() 139ea2f7e93SMarkus Duft .setFieldNamingPolicy( 140ea2f7e93SMarkus Duft FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 141ea2f7e93SMarkus Duft .disableHtmlEscaping().create(); 142ea2f7e93SMarkus Duft } 14394bcde66SMarkus Duft } 144