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