13bae524fSMatthias Sohn /* 2*5c5f7c6bSMatthias Sohn * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com> and others 33bae524fSMatthias Sohn * 4*5c5f7c6bSMatthias Sohn * This program and the accompanying materials are made available under the 5*5c5f7c6bSMatthias Sohn * terms of the Eclipse Distribution License v. 1.0 which is available at 6*5c5f7c6bSMatthias Sohn * https://www.eclipse.org/org/documents/edl-v10.php. 73bae524fSMatthias Sohn * 8*5c5f7c6bSMatthias Sohn * SPDX-License-Identifier: BSD-3-Clause 93bae524fSMatthias Sohn */ 103bae524fSMatthias Sohn 113bae524fSMatthias Sohn package org.eclipse.jgit.lfs.server; 123bae524fSMatthias Sohn 133bae524fSMatthias Sohn import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; 1456fe2177SDavid Pursehouse import static org.eclipse.jgit.lfs.lib.Constants.DOWNLOAD; 1556fe2177SDavid Pursehouse import static org.eclipse.jgit.lfs.lib.Constants.UPLOAD; 1656fe2177SDavid Pursehouse import static org.eclipse.jgit.lfs.lib.Constants.VERIFY; 173bae524fSMatthias Sohn 183bae524fSMatthias Sohn import java.io.IOException; 193bae524fSMatthias Sohn import java.text.MessageFormat; 203bae524fSMatthias Sohn import java.util.ArrayList; 213bae524fSMatthias Sohn import java.util.HashMap; 223bae524fSMatthias Sohn import java.util.List; 233bae524fSMatthias Sohn 243bae524fSMatthias Sohn import org.eclipse.jgit.lfs.lib.LongObjectId; 253bae524fSMatthias Sohn import org.eclipse.jgit.lfs.server.Response.Action; 263bae524fSMatthias Sohn import org.eclipse.jgit.lfs.server.Response.Body; 273bae524fSMatthias Sohn import org.eclipse.jgit.lfs.server.internal.LfsServerText; 283bae524fSMatthias Sohn 293bae524fSMatthias Sohn abstract class TransferHandler { 303bae524fSMatthias Sohn forOperation(String operation, LargeFileRepository repository, List<LfsObject> objects)313bae524fSMatthias Sohn static TransferHandler forOperation(String operation, 323bae524fSMatthias Sohn LargeFileRepository repository, List<LfsObject> objects) { 333bae524fSMatthias Sohn switch (operation) { 3456fe2177SDavid Pursehouse case UPLOAD: 353bae524fSMatthias Sohn return new Upload(repository, objects); 3656fe2177SDavid Pursehouse case DOWNLOAD: 373bae524fSMatthias Sohn return new Download(repository, objects); 3856fe2177SDavid Pursehouse case VERIFY: 393bae524fSMatthias Sohn default: 403bae524fSMatthias Sohn throw new UnsupportedOperationException(MessageFormat.format( 413bae524fSMatthias Sohn LfsServerText.get().unsupportedOperation, operation)); 423bae524fSMatthias Sohn } 433bae524fSMatthias Sohn } 443bae524fSMatthias Sohn 453bae524fSMatthias Sohn private static class Upload extends TransferHandler { Upload(LargeFileRepository repository, List<LfsObject> objects)463bae524fSMatthias Sohn Upload(LargeFileRepository repository, 473bae524fSMatthias Sohn List<LfsObject> objects) { 483bae524fSMatthias Sohn super(repository, objects); 493bae524fSMatthias Sohn } 503bae524fSMatthias Sohn 513bae524fSMatthias Sohn @Override process()523bae524fSMatthias Sohn Body process() throws IOException { 533bae524fSMatthias Sohn Response.Body body = new Response.Body(); 5400f840dcSDavid Pursehouse if (!objects.isEmpty()) { 553bae524fSMatthias Sohn body.objects = new ArrayList<>(); 563bae524fSMatthias Sohn for (LfsObject o : objects) { 573bae524fSMatthias Sohn addObjectInfo(body, o); 583bae524fSMatthias Sohn } 593bae524fSMatthias Sohn } 603bae524fSMatthias Sohn return body; 613bae524fSMatthias Sohn } 623bae524fSMatthias Sohn addObjectInfo(Response.Body body, LfsObject o)633bae524fSMatthias Sohn private void addObjectInfo(Response.Body body, LfsObject o) 643bae524fSMatthias Sohn throws IOException { 653bae524fSMatthias Sohn Response.ObjectInfo info = new Response.ObjectInfo(); 663bae524fSMatthias Sohn body.objects.add(info); 673bae524fSMatthias Sohn info.oid = o.oid; 683bae524fSMatthias Sohn info.size = o.size; 693bae524fSMatthias Sohn 703bae524fSMatthias Sohn LongObjectId oid = LongObjectId.fromString(o.oid); 713bae524fSMatthias Sohn if (repository.getSize(oid) == -1) { 723bae524fSMatthias Sohn info.actions = new HashMap<>(); 733bae524fSMatthias Sohn info.actions.put(UPLOAD, 743bae524fSMatthias Sohn repository.getUploadAction(oid, o.size)); 753bae524fSMatthias Sohn Action verify = repository.getVerifyAction(oid); 763bae524fSMatthias Sohn if (verify != null) { 773bae524fSMatthias Sohn info.actions.put(VERIFY, verify); 783bae524fSMatthias Sohn } 793bae524fSMatthias Sohn } 803bae524fSMatthias Sohn } 813bae524fSMatthias Sohn } 823bae524fSMatthias Sohn 833bae524fSMatthias Sohn private static class Download extends TransferHandler { Download(LargeFileRepository repository, List<LfsObject> objects)843bae524fSMatthias Sohn Download(LargeFileRepository repository, 853bae524fSMatthias Sohn List<LfsObject> objects) { 863bae524fSMatthias Sohn super(repository, objects); 873bae524fSMatthias Sohn } 883bae524fSMatthias Sohn 893bae524fSMatthias Sohn @Override process()903bae524fSMatthias Sohn Body process() throws IOException { 913bae524fSMatthias Sohn Response.Body body = new Response.Body(); 9200f840dcSDavid Pursehouse if (!objects.isEmpty()) { 933bae524fSMatthias Sohn body.objects = new ArrayList<>(); 943bae524fSMatthias Sohn for (LfsObject o : objects) { 953bae524fSMatthias Sohn addObjectInfo(body, o); 963bae524fSMatthias Sohn } 973bae524fSMatthias Sohn } 983bae524fSMatthias Sohn return body; 993bae524fSMatthias Sohn } 1003bae524fSMatthias Sohn addObjectInfo(Response.Body body, LfsObject o)1013bae524fSMatthias Sohn private void addObjectInfo(Response.Body body, LfsObject o) 1023bae524fSMatthias Sohn throws IOException { 1033bae524fSMatthias Sohn Response.ObjectInfo info = new Response.ObjectInfo(); 1043bae524fSMatthias Sohn body.objects.add(info); 1053bae524fSMatthias Sohn info.oid = o.oid; 1063bae524fSMatthias Sohn info.size = o.size; 1073bae524fSMatthias Sohn 1083bae524fSMatthias Sohn LongObjectId oid = LongObjectId.fromString(o.oid); 1093bae524fSMatthias Sohn if (repository.getSize(oid) >= 0) { 1103bae524fSMatthias Sohn info.actions = new HashMap<>(); 1113bae524fSMatthias Sohn info.actions.put(DOWNLOAD, 1123bae524fSMatthias Sohn repository.getDownloadAction(oid)); 1133bae524fSMatthias Sohn } else { 1143bae524fSMatthias Sohn info.error = new Response.Error(); 1153bae524fSMatthias Sohn info.error.code = SC_NOT_FOUND; 1163bae524fSMatthias Sohn info.error.message = MessageFormat.format( 1173bae524fSMatthias Sohn LfsServerText.get().objectNotFound, 1183bae524fSMatthias Sohn oid.getName()); 1193bae524fSMatthias Sohn } 1203bae524fSMatthias Sohn } 1213bae524fSMatthias Sohn } 1223bae524fSMatthias Sohn 1233bae524fSMatthias Sohn final LargeFileRepository repository; 1243bae524fSMatthias Sohn 1253bae524fSMatthias Sohn final List<LfsObject> objects; 1263bae524fSMatthias Sohn TransferHandler(LargeFileRepository repository, List<LfsObject> objects)1273bae524fSMatthias Sohn TransferHandler(LargeFileRepository repository, 1283bae524fSMatthias Sohn List<LfsObject> objects) { 1293bae524fSMatthias Sohn this.repository = repository; 1303bae524fSMatthias Sohn this.objects = objects; 1313bae524fSMatthias Sohn } 1323bae524fSMatthias Sohn process()1333bae524fSMatthias Sohn abstract Response.Body process() throws IOException; 1343bae524fSMatthias Sohn } 135