Revision 2f1a60e0
b/src/gr/ebs/gss/server/rest/FilesHandler.java | ||
---|---|---|
136 | 136 |
context = servletContext; |
137 | 137 |
} |
138 | 138 |
|
139 |
private void updateAccounting(final User user, final Date date, final long bandwidthDiff) { |
|
140 |
try { |
|
141 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
142 |
@Override |
|
143 |
public Void call() throws Exception { |
|
144 |
getService().updateAccounting(user, date, bandwidthDiff); |
|
145 |
return null; |
|
146 |
} |
|
147 |
}); |
|
148 |
} catch (RuntimeException e) { |
|
149 |
throw e; |
|
150 |
} catch (Exception e) { |
|
151 |
// updateAccounting() doesn't throw any checked exceptions |
|
152 |
assert false; |
|
153 |
} |
|
154 |
} |
|
155 |
|
|
139 | 156 |
/** |
140 | 157 |
* Serve the specified resource, optionally including the data content. |
141 | 158 |
* |
... | ... | |
436 | 453 |
copy(file, renderResult, ostream, req, oldBody); |
437 | 454 |
else |
438 | 455 |
copy(file, renderResult, writer, req, oldBody); |
439 |
if (file!=null) getService().updateAccounting(owner, new Date(), contentLength);
|
|
456 |
if (file!=null) updateAccounting(owner, new Date(), contentLength); |
|
440 | 457 |
} catch (ObjectNotFoundException e) { |
441 | 458 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
442 | 459 |
return; |
... | ... | |
446 | 463 |
} catch (RpcException e) { |
447 | 464 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
448 | 465 |
return; |
449 |
}
|
|
466 |
}
|
|
450 | 467 |
} |
451 | 468 |
} else { |
452 | 469 |
if (ranges == null || ranges.isEmpty()) |
... | ... | |
484 | 501 |
copy(file, ostream, range, req, oldBody); |
485 | 502 |
else |
486 | 503 |
copy(file, writer, range, req, oldBody); |
487 |
getService().updateAccounting(owner, new Date(), contentLength);
|
|
504 |
updateAccounting(owner, new Date(), contentLength); |
|
488 | 505 |
} catch (ObjectNotFoundException e) { |
489 | 506 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
490 | 507 |
return; |
... | ... | |
509 | 526 |
copy(file, ostream, ranges.iterator(), contentType, req, oldBody); |
510 | 527 |
else |
511 | 528 |
copy(file, writer, ranges.iterator(), contentType, req, oldBody); |
512 |
getService().updateAccounting(owner, new Date(), contentLength);
|
|
529 |
updateAccounting(owner, new Date(), contentLength); |
|
513 | 530 |
} catch (ObjectNotFoundException e) { |
514 | 531 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
515 | 532 |
return; |
... | ... | |
647 | 664 |
* @throws IOException if an I/O error occurs |
648 | 665 |
*/ |
649 | 666 |
private void restoreVersion(HttpServletRequest req, HttpServletResponse resp, String path, String version) throws IOException { |
650 |
User user = getUser(req); |
|
667 |
final User user = getUser(req);
|
|
651 | 668 |
User owner = getOwner(req); |
652 | 669 |
Object resource = null; |
653 | 670 |
try { |
... | ... | |
665 | 682 |
} |
666 | 683 |
|
667 | 684 |
try { |
668 |
FileHeaderDTO file = (FileHeaderDTO) resource; |
|
669 |
int oldVersion = Integer.parseInt(version); |
|
670 |
getService().restoreVersion(user.getId(), file.getId(), oldVersion); |
|
685 |
final FileHeaderDTO file = (FileHeaderDTO) resource; |
|
686 |
final int oldVersion = Integer.parseInt(version); |
|
687 |
|
|
688 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
689 |
@Override |
|
690 |
public Void call() throws Exception { |
|
691 |
getService().restoreVersion(user.getId(), file.getId(), oldVersion); |
|
692 |
return null; |
|
693 |
} |
|
694 |
}); |
|
671 | 695 |
} catch (InsufficientPermissionsException e) { |
672 | 696 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
673 | 697 |
} catch (ObjectNotFoundException e) { |
... | ... | |
680 | 704 |
resp.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, e.getMessage()); |
681 | 705 |
} catch (NumberFormatException e) { |
682 | 706 |
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); |
707 |
} catch (Exception e) { |
|
708 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); |
|
683 | 709 |
} |
684 | 710 |
} |
685 | 711 |
|
... | ... | |
722 | 748 |
return; |
723 | 749 |
} |
724 | 750 |
|
725 |
FolderDTO folder = null; |
|
726 | 751 |
Object parent; |
727 | 752 |
String parentPath = null; |
728 | 753 |
try { |
... | ... | |
739 | 764 |
response.sendError(HttpServletResponse.SC_CONFLICT); |
740 | 765 |
return; |
741 | 766 |
} |
742 |
folder = (FolderDTO) parent;
|
|
743 |
String fileName = getLastElement(path); |
|
767 |
final FolderDTO folder = (FolderDTO) parent;
|
|
768 |
final String fileName = getLastElement(path);
|
|
744 | 769 |
|
745 | 770 |
FileItemIterator iter; |
746 | 771 |
File uploadedFile = null; |
... | ... | |
822 | 847 |
|
823 | 848 |
progressListener.setUserId(user.getId()); |
824 | 849 |
progressListener.setFilename(fileName); |
825 |
String contentType = item.getContentType(); |
|
850 |
final String contentType = item.getContentType();
|
|
826 | 851 |
|
827 | 852 |
try { |
828 | 853 |
uploadedFile = getService().uploadFile(stream, user.getId()); |
... | ... | |
830 | 855 |
throw new GSSIOException(ex, false); |
831 | 856 |
} |
832 | 857 |
FileHeaderDTO fileDTO = null; |
858 |
final File upf = uploadedFile; |
|
859 |
final FileHeaderDTO f = file; |
|
860 |
final User u = user; |
|
833 | 861 |
if (file == null) |
834 |
fileDTO = getService().createFile(user.getId(), folder.getId(), fileName, contentType, uploadedFile.getCanonicalFile().length(), uploadedFile.getAbsolutePath()); |
|
862 |
fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() { |
|
863 |
@Override |
|
864 |
public FileHeaderDTO call() throws Exception { |
|
865 |
return getService().createFile(u.getId(), folder.getId(), fileName, contentType, upf.getCanonicalFile().length(), upf.getAbsolutePath()); |
|
866 |
} |
|
867 |
}); |
|
835 | 868 |
else |
836 |
fileDTO = getService().updateFileContents(user.getId(), file.getId(), contentType, uploadedFile.getCanonicalFile().length(), uploadedFile.getAbsolutePath()); |
|
837 |
getService().updateAccounting(owner, new Date(), fileDTO.getFileSize()); |
|
869 |
fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() { |
|
870 |
@Override |
|
871 |
public FileHeaderDTO call() throws Exception { |
|
872 |
return getService().updateFileContents(u.getId(), f.getId(), contentType, upf.getCanonicalFile().length(), upf.getAbsolutePath()); |
|
873 |
} |
|
874 |
}); |
|
875 |
updateAccounting(owner, new Date(), fileDTO.getFileSize()); |
|
838 | 876 |
getService().removeFileUploadProgress(user.getId(), fileName); |
839 | 877 |
} |
840 | 878 |
} |
... | ... | |
888 | 926 |
String error = "An error occurred while communicating with the service"; |
889 | 927 |
logger.error(error, e); |
890 | 928 |
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, error); |
929 |
} catch (Exception e) { |
|
930 |
if (uploadedFile != null && uploadedFile.exists()) |
|
931 |
uploadedFile.delete(); |
|
932 |
String error = "An internal server error occurred"; |
|
933 |
logger.error(error, e); |
|
934 |
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, error); |
|
891 | 935 |
} |
892 | 936 |
} |
893 | 937 |
|
... | ... | |
936 | 980 |
* @throws IOException if an input/output error occurs |
937 | 981 |
*/ |
938 | 982 |
private void moveResource(HttpServletRequest req, HttpServletResponse resp, String path, String moveTo) throws IOException { |
939 |
User user = getUser(req); |
|
983 |
final User user = getUser(req);
|
|
940 | 984 |
User owner = getOwner(req); |
941 | 985 |
Object resource = null; |
942 | 986 |
try { |
... | ... | |
972 | 1016 |
} |
973 | 1017 |
|
974 | 1018 |
try { |
1019 |
final User dOwner = destOwner; |
|
1020 |
final String dest = destination; |
|
975 | 1021 |
if (resource instanceof FolderDTO) { |
976 |
FolderDTO folder = (FolderDTO) resource; |
|
977 |
getService().moveFolderToPath(user.getId(), destOwner.getId(), folder.getId(), destination); |
|
1022 |
final FolderDTO folder = (FolderDTO) resource; |
|
1023 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1024 |
@Override |
|
1025 |
public Void call() throws Exception { |
|
1026 |
getService().moveFolderToPath(user.getId(), dOwner.getId(), folder.getId(), dest); |
|
1027 |
return null; |
|
1028 |
} |
|
1029 |
}); |
|
978 | 1030 |
} else { |
979 |
FileHeaderDTO file = (FileHeaderDTO) resource; |
|
980 |
getService().moveFileToPath(user.getId(), destOwner.getId(), file.getId(), destination); |
|
1031 |
final FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1032 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1033 |
@Override |
|
1034 |
public Void call() throws Exception { |
|
1035 |
getService().moveFileToPath(user.getId(), dOwner.getId(), file.getId(), dest); |
|
1036 |
return null; |
|
1037 |
} |
|
1038 |
}); |
|
1039 |
|
|
981 | 1040 |
} |
982 | 1041 |
} catch (InsufficientPermissionsException e) { |
983 | 1042 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
... | ... | |
991 | 1050 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); |
992 | 1051 |
} catch (QuotaExceededException e) { |
993 | 1052 |
resp.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, e.getMessage()); |
1053 |
} catch (Exception e) { |
|
1054 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, destination); |
|
994 | 1055 |
} |
995 | 1056 |
} |
996 | 1057 |
|
... | ... | |
1004 | 1065 |
* @throws IOException if an input/output error occurs |
1005 | 1066 |
*/ |
1006 | 1067 |
private void copyResource(HttpServletRequest req, HttpServletResponse resp, String path, String copyTo) throws IOException { |
1007 |
User user = getUser(req); |
|
1068 |
final User user = getUser(req);
|
|
1008 | 1069 |
User owner = getOwner(req); |
1009 | 1070 |
Object resource = null; |
1010 | 1071 |
try { |
... | ... | |
1040 | 1101 |
} |
1041 | 1102 |
|
1042 | 1103 |
try { |
1104 |
final User dOwner = destOwner; |
|
1105 |
final String dest = destination; |
|
1043 | 1106 |
if (resource instanceof FolderDTO) { |
1044 |
FolderDTO folder = (FolderDTO) resource; |
|
1045 |
getService().copyFolderStructureToPath(user.getId(), destOwner.getId(), folder.getId(), destination); |
|
1107 |
final FolderDTO folder = (FolderDTO) resource; |
|
1108 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1109 |
@Override |
|
1110 |
public Void call() throws Exception { |
|
1111 |
getService().copyFolderStructureToPath(user.getId(), dOwner.getId(), folder.getId(), dest); |
|
1112 |
return null; |
|
1113 |
} |
|
1114 |
}); |
|
1046 | 1115 |
} else { |
1047 |
FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1048 |
getService().copyFileToPath(user.getId(), destOwner.getId(), file.getId(), destination); |
|
1116 |
final FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1117 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1118 |
@Override |
|
1119 |
public Void call() throws Exception { |
|
1120 |
getService().copyFileToPath(user.getId(), dOwner.getId(), file.getId(), dest); |
|
1121 |
return null; |
|
1122 |
} |
|
1123 |
}); |
|
1049 | 1124 |
} |
1050 | 1125 |
} catch (InsufficientPermissionsException e) { |
1051 | 1126 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
... | ... | |
1059 | 1134 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); |
1060 | 1135 |
} catch (QuotaExceededException e) { |
1061 | 1136 |
resp.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, e.getMessage()); |
1137 |
} catch (Exception e) { |
|
1138 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, destination); |
|
1062 | 1139 |
} |
1063 | 1140 |
} |
1064 | 1141 |
|
... | ... | |
1131 | 1208 |
* @throws IOException if an input/output error occurs |
1132 | 1209 |
*/ |
1133 | 1210 |
private void trashResource(HttpServletRequest req, HttpServletResponse resp, String path) throws IOException { |
1134 |
User user = getUser(req); |
|
1211 |
final User user = getUser(req);
|
|
1135 | 1212 |
User owner = getOwner(req); |
1136 | 1213 |
Object resource = null; |
1137 | 1214 |
try { |
... | ... | |
1146 | 1223 |
|
1147 | 1224 |
try { |
1148 | 1225 |
if (resource instanceof FolderDTO) { |
1149 |
FolderDTO folder = (FolderDTO) resource; |
|
1150 |
getService().moveFolderToTrash(user.getId(), folder.getId()); |
|
1226 |
final FolderDTO folder = (FolderDTO) resource; |
|
1227 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1228 |
@Override |
|
1229 |
public Void call() throws Exception { |
|
1230 |
getService().moveFolderToTrash(user.getId(), folder.getId()); |
|
1231 |
return null; |
|
1232 |
} |
|
1233 |
}); |
|
1151 | 1234 |
} else { |
1152 |
FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1153 |
getService().moveFileToTrash(user.getId(), file.getId()); |
|
1235 |
final FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1236 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1237 |
@Override |
|
1238 |
public Void call() throws Exception { |
|
1239 |
getService().moveFileToTrash(user.getId(), file.getId()); |
|
1240 |
return null; |
|
1241 |
} |
|
1242 |
}); |
|
1154 | 1243 |
} |
1155 | 1244 |
} catch (InsufficientPermissionsException e) { |
1156 | 1245 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
... | ... | |
1158 | 1247 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage()); |
1159 | 1248 |
} catch (RpcException e) { |
1160 | 1249 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path); |
1250 |
} catch (Exception e) { |
|
1251 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path); |
|
1161 | 1252 |
} |
1162 | 1253 |
} |
1163 | 1254 |
|
... | ... | |
1170 | 1261 |
* @throws IOException if an input/output error occurs |
1171 | 1262 |
*/ |
1172 | 1263 |
private void restoreResource(HttpServletRequest req, HttpServletResponse resp, String path) throws IOException { |
1173 |
User user = getUser(req); |
|
1264 |
final User user = getUser(req);
|
|
1174 | 1265 |
User owner = getOwner(req); |
1175 | 1266 |
Object resource = null; |
1176 | 1267 |
try { |
... | ... | |
1185 | 1276 |
|
1186 | 1277 |
try { |
1187 | 1278 |
if (resource instanceof FolderDTO) { |
1188 |
FolderDTO folder = (FolderDTO) resource; |
|
1189 |
getService().removeFolderFromTrash(user.getId(), folder.getId()); |
|
1279 |
final FolderDTO folder = (FolderDTO) resource; |
|
1280 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1281 |
@Override |
|
1282 |
public Void call() throws Exception { |
|
1283 |
getService().removeFolderFromTrash(user.getId(), folder.getId()); |
|
1284 |
return null; |
|
1285 |
} |
|
1286 |
}); |
|
1190 | 1287 |
} else { |
1191 |
FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1192 |
getService().removeFileFromTrash(user.getId(), file.getId()); |
|
1288 |
final FileHeaderDTO file = (FileHeaderDTO) resource; |
|
1289 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1290 |
@Override |
|
1291 |
public Void call() throws Exception { |
|
1292 |
getService().removeFileFromTrash(user.getId(), file.getId()); |
|
1293 |
return null; |
|
1294 |
} |
|
1295 |
}); |
|
1193 | 1296 |
} |
1194 | 1297 |
} catch (InsufficientPermissionsException e) { |
1195 | 1298 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
... | ... | |
1197 | 1300 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage()); |
1198 | 1301 |
} catch (RpcException e) { |
1199 | 1302 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path); |
1303 |
} catch (Exception e) { |
|
1304 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path); |
|
1200 | 1305 |
} |
1201 | 1306 |
} |
1202 | 1307 |
|
... | ... | |
1565 | 1670 |
throw new GSSIOException(ex, false); |
1566 | 1671 |
} |
1567 | 1672 |
FileHeaderDTO fileDTO = null; |
1673 |
final File uploadedf = uploadedFile; |
|
1674 |
final FolderDTO parentf = folder; |
|
1675 |
final FileHeaderDTO f = file; |
|
1568 | 1676 |
if (exists) |
1569 |
fileDTO = getService().updateFileContents(user.getId(), file.getId(), mimeType, uploadedFile.getCanonicalFile().length(), uploadedFile.getAbsolutePath()); |
|
1570 |
else { |
|
1571 |
final File uploadedf = uploadedFile; |
|
1572 |
final FolderDTO parentf = folder; |
|
1677 |
fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() { |
|
1678 |
@Override |
|
1679 |
public FileHeaderDTO call() throws Exception { |
|
1680 |
return getService().updateFileContents(user.getId(), f.getId(), mimeType, uploadedf.getCanonicalFile().length(), uploadedf.getAbsolutePath()); |
|
1681 |
} |
|
1682 |
}); |
|
1683 |
else |
|
1573 | 1684 |
fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() { |
1574 | 1685 |
@Override |
1575 | 1686 |
public FileHeaderDTO call() throws Exception { |
... | ... | |
1577 | 1688 |
} |
1578 | 1689 |
|
1579 | 1690 |
}); |
1580 |
} |
|
1581 |
getService().updateAccounting(owner, new Date(), fileDTO.getFileSize()); |
|
1691 |
updateAccounting(owner, new Date(), fileDTO.getFileSize()); |
|
1582 | 1692 |
getService().removeFileUploadProgress(user.getId(), fileDTO.getName()); |
1583 | 1693 |
} catch(ObjectNotFoundException e) { |
1584 | 1694 |
result = false; |
... | ... | |
1626 | 1736 |
if (logger.isDebugEnabled()) |
1627 | 1737 |
logger.debug("Deleting resource '" + path); |
1628 | 1738 |
path = URLDecoder.decode(path, "UTF-8"); |
1629 |
User user = getUser(req); |
|
1739 |
final User user = getUser(req);
|
|
1630 | 1740 |
User owner = getOwner(req); |
1631 | 1741 |
boolean exists = true; |
1632 | 1742 |
Object object = null; |
... | ... | |
1653 | 1763 |
|
1654 | 1764 |
if (file != null) |
1655 | 1765 |
try { |
1656 |
getService().deleteFile(user.getId(), file.getId()); |
|
1766 |
final FileHeaderDTO f = file; |
|
1767 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1768 |
@Override |
|
1769 |
public Void call() throws Exception { |
|
1770 |
getService().deleteFile(user.getId(), f.getId()); |
|
1771 |
return null; |
|
1772 |
} |
|
1773 |
}); |
|
1657 | 1774 |
} catch (InsufficientPermissionsException e) { |
1658 | 1775 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
1659 | 1776 |
return; |
... | ... | |
1665 | 1782 |
} catch (RpcException e) { |
1666 | 1783 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
1667 | 1784 |
return; |
1785 |
} catch (Exception e) { |
|
1786 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
1787 |
return; |
|
1668 | 1788 |
} |
1669 | 1789 |
else if (folder != null) |
1670 | 1790 |
try { |
1671 |
getService().deleteFolder(user.getId(), folder.getId()); |
|
1791 |
final FolderDTO fo = folder; |
|
1792 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
1793 |
@Override |
|
1794 |
public Void call() throws Exception { |
|
1795 |
getService().deleteFolder(user.getId(), fo.getId()); |
|
1796 |
return null; |
|
1797 |
} |
|
1798 |
}); |
|
1672 | 1799 |
} catch (InsufficientPermissionsException e) { |
1673 | 1800 |
resp.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); |
1674 | 1801 |
return; |
... | ... | |
1678 | 1805 |
} catch (RpcException e) { |
1679 | 1806 |
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
1680 | 1807 |
return; |
1808 |
} catch (Exception e) { |
|
1809 |
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
1810 |
return; |
|
1681 | 1811 |
} |
1682 | 1812 |
resp.setStatus(HttpServletResponse.SC_NO_CONTENT); |
1683 | 1813 |
return; |
b/src/gr/ebs/gss/server/rest/GroupsHandler.java | ||
---|---|---|
30 | 30 |
import java.net.URLDecoder; |
31 | 31 |
import java.net.URLEncoder; |
32 | 32 |
import java.util.List; |
33 |
import java.util.concurrent.Callable; |
|
33 | 34 |
|
34 | 35 |
import javax.servlet.http.HttpServletRequest; |
35 | 36 |
import javax.servlet.http.HttpServletResponse; |
... | ... | |
165 | 166 |
|
166 | 167 |
try { |
167 | 168 |
User user = getUser(req); |
168 |
User owner = getOwner(req); |
|
169 |
final User owner = getOwner(req);
|
|
169 | 170 |
if (!owner.equals(user)) |
170 | 171 |
throw new InsufficientPermissionsException("User " + user.getUsername() |
171 | 172 |
+ " does not have permission to modify the groups owned by " |
172 | 173 |
+ owner.getUsername()); |
173 | 174 |
if (path.equals("/")) { |
174 | 175 |
// Request to add group |
175 |
String group = req.getParameter(GROUP_PARAMETER); |
|
176 |
final String group = req.getParameter(GROUP_PARAMETER);
|
|
176 | 177 |
if (logger.isDebugEnabled()) |
177 | 178 |
logger.debug("Adding group " + group); |
178 |
getService().createGroup(owner.getId(), group); |
|
179 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
180 |
@Override |
|
181 |
public Void call() throws Exception { |
|
182 |
getService().createGroup(owner.getId(), group); |
|
183 |
return null; |
|
184 |
} |
|
185 |
}); |
|
179 | 186 |
resp.setStatus(HttpServletResponse.SC_CREATED); |
180 | 187 |
} else { |
181 | 188 |
// Request to add group member |
... | ... | |
187 | 194 |
if (logger.isDebugEnabled()) |
188 | 195 |
logger.debug("Adding member " + username + |
189 | 196 |
" to group " + path); |
190 |
GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8")); |
|
191 |
User member = getService().findUser(username); |
|
197 |
final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8"));
|
|
198 |
final User member = getService().findUser(username);
|
|
192 | 199 |
if (member == null) { |
193 | 200 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "User " + username + " not found"); |
194 | 201 |
return; |
195 | 202 |
} |
196 |
getService().addUserToGroup(owner.getId(), group.getId(), member.getId()); |
|
203 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
204 |
@Override |
|
205 |
public Void call() throws Exception { |
|
206 |
getService().addUserToGroup(owner.getId(), group.getId(), member.getId()); |
|
207 |
return null; |
|
208 |
} |
|
209 |
}); |
|
197 | 210 |
resp.setStatus(HttpServletResponse.SC_CREATED); |
198 | 211 |
} |
199 | 212 |
// Workaround for IE's broken caching behavior. |
... | ... | |
209 | 222 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
210 | 223 |
} catch (InsufficientPermissionsException e) { |
211 | 224 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage()); |
225 |
} catch (Exception e) { |
|
226 |
logger.error("", e); |
|
227 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
212 | 228 |
} |
229 |
|
|
213 | 230 |
} |
214 | 231 |
|
215 | 232 |
/** |
... | ... | |
234 | 251 |
int slash = path.indexOf('/'); |
235 | 252 |
try { |
236 | 253 |
User user = getUser(req); |
237 |
User owner = getOwner(req); |
|
254 |
final User owner = getOwner(req);
|
|
238 | 255 |
if (!owner.equals(user)) |
239 | 256 |
throw new InsufficientPermissionsException("User " + user.getUsername() |
240 | 257 |
+ " does not have permission to modify the groups owned by " |
... | ... | |
244 | 261 |
if (logger.isDebugEnabled()) |
245 | 262 |
logger.debug("Removing member " + path.substring(slash + 1) + |
246 | 263 |
" from group " + path.substring(0, slash)); |
247 |
GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path.substring(0, slash),"UTF-8")); |
|
248 |
for (UserDTO u: group.getMembers()) |
|
264 |
final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path.substring(0, slash),"UTF-8"));
|
|
265 |
for (final UserDTO u: group.getMembers())
|
|
249 | 266 |
if (u.getUsername().equals(path.substring(slash + 1))) |
250 |
getService().removeMemberFromGroup(owner.getId(), group.getId(), u.getId()); |
|
267 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
268 |
@Override |
|
269 |
public Void call() throws Exception { |
|
270 |
getService().removeMemberFromGroup(owner.getId(), group.getId(), u.getId()); |
|
271 |
return null; |
|
272 |
} |
|
273 |
}); |
|
251 | 274 |
} else { |
252 | 275 |
if (logger.isDebugEnabled()) |
253 | 276 |
logger.debug("Removing group " + path); |
254 |
GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8")); |
|
255 |
getService().deleteGroup(owner.getId(), group.getId()); |
|
277 |
final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8")); |
|
278 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
279 |
@Override |
|
280 |
public Void call() throws Exception { |
|
281 |
getService().deleteGroup(owner.getId(), group.getId()); |
|
282 |
return null; |
|
283 |
} |
|
284 |
}); |
|
256 | 285 |
} |
257 | 286 |
resp.setStatus(HttpServletResponse.SC_NO_CONTENT); |
258 | 287 |
// Workaround for IE's broken caching behavior. |
... | ... | |
264 | 293 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage()); |
265 | 294 |
} catch (InsufficientPermissionsException e) { |
266 | 295 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage()); |
296 |
} catch (Exception e) { |
|
297 |
logger.error("", e); |
|
298 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
267 | 299 |
} |
268 | 300 |
} |
269 | 301 |
} |
b/src/gr/ebs/gss/server/rest/TrashHandler.java | ||
---|---|---|
29 | 29 |
import java.net.URLEncoder; |
30 | 30 |
import java.util.ArrayList; |
31 | 31 |
import java.util.List; |
32 |
import java.util.concurrent.Callable; |
|
32 | 33 |
|
33 | 34 |
import javax.servlet.ServletException; |
34 | 35 |
import javax.servlet.http.HttpServletRequest; |
... | ... | |
156 | 157 |
} |
157 | 158 |
try { |
158 | 159 |
User user = getUser(req); |
159 |
User owner = getOwner(req); |
|
160 |
final User owner = getOwner(req);
|
|
160 | 161 |
if (!owner.equals(user)) |
161 | 162 |
throw new InsufficientPermissionsException("User " + user.getUsername() |
162 | 163 |
+ " does not have permission to empty the trash can owned by " |
163 | 164 |
+ owner.getUsername()); |
164 | 165 |
if (logger.isDebugEnabled()) |
165 | 166 |
logger.debug("Emptying trash for user " + owner.getUsername()); |
166 |
getService().emptyTrash(owner.getId()); |
|
167 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
168 |
@Override |
|
169 |
public Void call() throws Exception { |
|
170 |
getService().emptyTrash(owner.getId()); |
|
171 |
return null; |
|
172 |
} |
|
173 |
}); |
|
167 | 174 |
resp.setStatus(HttpServletResponse.SC_NO_CONTENT); |
168 | 175 |
} catch (RpcException e) { |
169 | 176 |
logger.error("", e); |
... | ... | |
172 | 179 |
resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage()); |
173 | 180 |
} catch (InsufficientPermissionsException e) { |
174 | 181 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage()); |
182 |
} catch (Exception e) { |
|
183 |
logger.error("", e); |
|
184 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
175 | 185 |
} |
176 | 186 |
} |
177 | 187 |
|
b/src/gr/ebs/gss/server/rest/UserHandler.java | ||
---|---|---|
27 | 27 |
import gr.ebs.gss.server.domain.dto.StatsDTO; |
28 | 28 |
|
29 | 29 |
import java.io.IOException; |
30 |
import java.util.concurrent.Callable; |
|
30 | 31 |
|
31 | 32 |
import javax.servlet.http.Cookie; |
32 | 33 |
import javax.servlet.http.HttpServletRequest; |
... | ... | |
115 | 116 |
*/ |
116 | 117 |
void postUser(HttpServletRequest req, HttpServletResponse resp) throws IOException { |
117 | 118 |
try { |
118 |
User user = getUser(req); |
|
119 |
final User user = getUser(req);
|
|
119 | 120 |
User owner = getOwner(req); |
120 | 121 |
if (!owner.equals(user)) |
121 | 122 |
throw new InsufficientPermissionsException("User " + user.getUsername() |
... | ... | |
123 | 124 |
+ owner.getUsername()); |
124 | 125 |
boolean hasResetWebDAVParam = req.getParameterMap().containsKey(RESET_WEBDAV_PARAMETER); |
125 | 126 |
if (hasResetWebDAVParam) { |
126 |
String newPassword = getService().resetWebDAVPassword(user.getId()); |
|
127 |
String newPassword = new TransactionHelper<String>().tryExecute(new Callable<String>() { |
|
128 |
@Override |
|
129 |
public String call() throws Exception { |
|
130 |
return getService().resetWebDAVPassword(user.getId()); |
|
131 |
} |
|
132 |
}); |
|
133 |
|
|
127 | 134 |
// Set the cookie again to send new value |
128 | 135 |
Cookie cookie = new Cookie(Login.WEBDAV_COOKIE, newPassword); |
129 | 136 |
cookie.setMaxAge(-1); |
... | ... | |
142 | 149 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
143 | 150 |
} catch (InsufficientPermissionsException e) { |
144 | 151 |
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage()); |
152 |
} catch (Exception e) { |
|
153 |
logger.error("", e); |
|
154 |
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
|
145 | 155 |
} |
146 | 156 |
} |
147 | 157 |
|
b/src/gr/ebs/gss/server/webdav/Webdav.java | ||
---|---|---|
31 | 31 |
import gr.ebs.gss.server.domain.dto.FileHeaderDTO; |
32 | 32 |
import gr.ebs.gss.server.domain.dto.FolderDTO; |
33 | 33 |
import gr.ebs.gss.server.ejb.ExternalAPI; |
34 |
import gr.ebs.gss.server.rest.TransactionHelper; |
|
34 | 35 |
|
35 | 36 |
import java.io.BufferedInputStream; |
36 | 37 |
import java.io.ByteArrayInputStream; |
... | ... | |
63 | 64 |
import java.util.StringTokenizer; |
64 | 65 |
import java.util.TimeZone; |
65 | 66 |
import java.util.Vector; |
67 |
import java.util.concurrent.Callable; |
|
66 | 68 |
|
67 | 69 |
import javax.naming.Context; |
68 | 70 |
import javax.naming.InitialContext; |
... | ... | |
350 | 352 |
} |
351 | 353 |
} |
352 | 354 |
|
355 |
private void updateAccounting(final User user, final Date date, final long bandwidthDiff) { |
|
356 |
try { |
|
357 |
new TransactionHelper<Void>().tryExecute(new Callable<Void>() { |
|
358 |
@Override |
|
359 |
public Void call() throws Exception { |
|
360 |
getService().updateAccounting(user, date, bandwidthDiff); |
|
361 |
return null; |
|
362 |
} |
|
363 |
}); |
|
364 |
} catch (RuntimeException e) { |
|
365 |
throw e; |
|
366 |
} catch (Exception e) { |
|
367 |
// updateAccounting() doesn't throw any checked exceptions |
|
368 |
assert false; |
|
369 |
} |
|
370 |
} |
|
371 |
|
|
353 | 372 |
@Override |
354 | 373 |
public void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { |
355 | 374 |
String method = request.getMethod(); |
... | ... | |
743 | 762 |
fileDTO = getService().updateFileContents(user.getId(), file.getId(), mimeType, uploadedFile.length(), uploadedFile.getAbsolutePath()); |
744 | 763 |
else |
745 | 764 |
fileDTO = getService().createFile(user.getId(), folder.getId(), name, mimeType, uploadedFile.length(), uploadedFile.getAbsolutePath()); |
746 |
getService().updateAccounting(user, new Date(), fileDTO.getFileSize());
|
|
765 |
updateAccounting(user, new Date(), fileDTO.getFileSize()); |
|
747 | 766 |
} catch (ObjectNotFoundException e) { |
748 | 767 |
result = false; |
749 | 768 |
} catch (InsufficientPermissionsException e) { |
... | ... | |
1892 | 1911 |
copy(file, renderResult, ostream, req, null); |
1893 | 1912 |
else |
1894 | 1913 |
copy(file, renderResult, writer, req, null); |
1895 |
getService().updateAccounting(user, new Date(), contentLength);
|
|
1914 |
updateAccounting(user, new Date(), contentLength); |
|
1896 | 1915 |
} |
1897 | 1916 |
} else { |
1898 | 1917 |
if (ranges == null || ranges.isEmpty()) |
... | ... | |
1926 | 1945 |
copy(file, ostream, range, req, null); |
1927 | 1946 |
else |
1928 | 1947 |
copy(file, writer, range, req, null); |
1929 |
getService().updateAccounting(user, new Date(), contentLength);
|
|
1948 |
updateAccounting(user, new Date(), contentLength); |
|
1930 | 1949 |
} |
1931 | 1950 |
|
1932 | 1951 |
} else { |
Also available in: Unified diff