View Javadoc
1   package de.dlr.shepard.neo4Core.services;
2   
3   import java.util.ArrayList;
4   import java.util.Collections;
5   import java.util.List;
6   
7   import de.dlr.shepard.exceptions.InvalidAuthException;
8   import de.dlr.shepard.exceptions.InvalidBodyException;
9   import de.dlr.shepard.mongoDB.FileService;
10  import de.dlr.shepard.mongoDB.NamedInputStream;
11  import de.dlr.shepard.mongoDB.ShepardFile;
12  import de.dlr.shepard.neo4Core.dao.DataObjectDAO;
13  import de.dlr.shepard.neo4Core.dao.FileContainerDAO;
14  import de.dlr.shepard.neo4Core.dao.FileReferenceDAO;
15  import de.dlr.shepard.neo4Core.dao.ShepardFileDAO;
16  import de.dlr.shepard.neo4Core.dao.UserDAO;
17  import de.dlr.shepard.neo4Core.entities.FileReference;
18  import de.dlr.shepard.neo4Core.io.FileReferenceIO;
19  import de.dlr.shepard.security.PermissionsUtil;
20  import de.dlr.shepard.util.AccessType;
21  import de.dlr.shepard.util.DateHelper;
22  import lombok.extern.slf4j.Slf4j;
23  
24  @Slf4j
25  public class FileReferenceService implements IReferenceService<FileReference, FileReferenceIO> {
26  
27  	private FileReferenceDAO fileReferenceDAO = new FileReferenceDAO();
28  	private DataObjectDAO dataObjectDAO = new DataObjectDAO();
29  	private FileContainerDAO containerDAO = new FileContainerDAO();
30  	private ShepardFileDAO fileDAO = new ShepardFileDAO();
31  	private UserDAO userDAO = new UserDAO();
32  	private DateHelper dateHelper = new DateHelper();
33  	private FileService fileService = new FileService();
34  	private PermissionsUtil permissionsUtil = new PermissionsUtil();
35  
36  	@Override
37  	public List<FileReference> getAllReferencesByDataObjectShepardId(long dataObjectShepardId) {
38  		var references = fileReferenceDAO.findByDataObjectShepardId(dataObjectShepardId);
39  		return references;
40  	}
41  
42  	@Override
43  	public FileReference getReferenceByShepardId(long shepardId) {
44  		FileReference fileReference = fileReferenceDAO.findByShepardId(shepardId);
45  		if (fileReference == null || fileReference.isDeleted()) {
46  			log.error("File Reference with id {} is null or deleted", shepardId);
47  			return null;
48  		}
49  		return fileReference;
50  	}
51  
52  	@Override
53  	public FileReference createReferenceByShepardId(long dataObjectShepardId, FileReferenceIO fileReference,
54  			String username) {
55  		var user = userDAO.find(username);
56  		var dataObject = dataObjectDAO.findLightByShepardId(dataObjectShepardId);
57  		var container = containerDAO.findLightByNeo4jId(fileReference.getFileContainerId());
58  		if (container == null || container.isDeleted())
59  			throw new InvalidBodyException("invalid container");
60  		var toCreate = new FileReference();
61  		toCreate.setCreatedAt(dateHelper.getDate());
62  		toCreate.setCreatedBy(user);
63  		toCreate.setDataObject(dataObject);
64  		toCreate.setName(fileReference.getName());
65  		toCreate.setFileContainer(container);
66  
67  		// Get existing file
68  		for (var oid : fileReference.getFileOids()) {
69  			var file = fileDAO.find(container.getId(), oid);
70  			if (file != null) {
71  				toCreate.addFile(file);
72  			} else {
73  				log.warn("Could not find file with oid: {}", oid);
74  			}
75  		}
76  
77  		var created = fileReferenceDAO.createOrUpdate(toCreate);
78  		created.setShepardId(created.getId());
79  		created = fileReferenceDAO.createOrUpdate(created);
80  		return created;
81  	}
82  
83  	@Override
84  	public boolean deleteReferenceByShepardId(long fileReferenceShepardId, String username) {
85  		FileReference fileReference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
86  		var user = userDAO.find(username);
87  		fileReference.setDeleted(true);
88  		fileReference.setUpdatedBy(user);
89  		fileReference.setUpdatedAt(dateHelper.getDate());
90  		fileReferenceDAO.createOrUpdate(fileReference);
91  		return true;
92  	}
93  
94  	public NamedInputStream getPayloadByShepardId(long fileReferenceShepardId, String oid, String username) {
95  		FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
96  		// TODO: Handle missing container
97  		long containerId = reference.getFileContainer().getId();
98  		String mongoId = reference.getFileContainer().getMongoId();
99  		if (!permissionsUtil.isAllowed(containerId, AccessType.Read, username))
100 			throw new InvalidAuthException("You are not authorized to access this file");
101 		return fileService.getPayload(mongoId, oid);
102 	}
103 
104 	public List<ShepardFile> getFilesByShepardId(long fileReferenceShepardId) {
105 		FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
106 		return reference.getFiles();
107 	}
108 
109 	public List<NamedInputStream> getAllPayloadsByShepardId(long fileReferenceShepardId, String username) {
110 		FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
111 		if (reference.getFileContainer() == null || reference.getFileContainer().isDeleted())
112 			return Collections.emptyList();
113 
114 		if (!permissionsUtil.isAllowed(reference.getFileContainer().getId(), AccessType.Read, username))
115 			throw new InvalidAuthException();
116 
117 		var files = reference.getFiles();
118 		var result = new ArrayList<NamedInputStream>(files.size());
119 		for (var file : files) {
120 			var nis = fileService.getPayload(reference.getFileContainer().getMongoId(), file.getOid());
121 			if (nis != null)
122 				result.add(nis);
123 		}
124 		return result;
125 	}
126 
127 }