xref: /JGit/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/TransferHandler.java (revision 5c5f7c6b146b24f2bd4afae1902df85ad6e57ea3)
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