Revision 2f1a60e0 src/gr/ebs/gss/server/rest/FilesHandler.java

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;

Also available in: Unified diff