- Check when renaming file that name doesn't already exist.
[pithos] / src / gr / ebs / gss / server / ejb / GSSDAOBean.java
1 /*
2  * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.
3  *
4  * This file is part of GSS.
5  *
6  * GSS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package gr.ebs.gss.server.ejb;
20
21 import gr.ebs.gss.client.exceptions.ObjectNotFoundException;
22 import gr.ebs.gss.server.domain.AccountingInfo;
23 import gr.ebs.gss.server.domain.FileBody;
24 import gr.ebs.gss.server.domain.FileHeader;
25 import gr.ebs.gss.server.domain.FileUploadStatus;
26 import gr.ebs.gss.server.domain.Folder;
27 import gr.ebs.gss.server.domain.Group;
28 import gr.ebs.gss.server.domain.Nonce;
29 import gr.ebs.gss.server.domain.User;
30
31 import java.util.ArrayList;
32 import java.util.Calendar;
33 import java.util.Date;
34 import java.util.GregorianCalendar;
35 import java.util.HashSet;
36 import java.util.List;
37 import java.util.Set;
38
39 import javax.ejb.Stateless;
40 import javax.persistence.EntityManager;
41 import javax.persistence.NoResultException;
42 import javax.persistence.PersistenceContext;
43
44 import org.apache.commons.lang.StringUtils;
45
46 /**
47  * The implementation of the GSSDAO interface.
48  */
49 @Stateless
50 public class GSSDAOBean implements GSSDAO {
51
52         private static final int BANDWIDTH_TIME_PERIOD_FIELD = Calendar.MONTH;
53         private static final int BANDWIDTH_TIME_PERIOD_AMOUNT = 1;
54
55         /**
56          * The entity manager for the persistence unit
57          */
58         @PersistenceContext(unitName = "gss")
59         private EntityManager manager;
60
61         /*
62          * (non-Javadoc)
63          *
64          * @see gr.ebs.gss.server.ejb.GSSDAO#getRootFolder(java.lang.Long)
65          */
66         public Folder getRootFolder(final Long userId) throws ObjectNotFoundException {
67                 try {
68                         if (userId == null)
69                                 throw new ObjectNotFoundException("No user specified");
70                         return (Folder) manager .createQuery("select f from Folder f where f.owner.id=:ownerId and f.parent is null")
71                                                                         .setParameter("ownerId", userId)
72                                                                         .getSingleResult();
73                 } catch (final NoResultException e) {
74                         throw new ObjectNotFoundException("Root folder not found for user with id=" + userId);
75                 }
76         }
77
78         /*
79          * (non-Javadoc)
80          *
81          * @see gr.ebs.gss.server.ejb.GSSDAO#getUser(java.lang.String)
82          */
83         public User getUser(final String username) throws ObjectNotFoundException {
84                 try {
85                         if (username == null)
86                                 throw new ObjectNotFoundException("No user specified");
87                         return (User) manager   .createQuery("select f from User f where f.username=:username")
88                                                                         .setParameter("username", username)
89                                                                         .getSingleResult();
90                 } catch (final NoResultException e) {
91                         throw new ObjectNotFoundException("No User found for username=" + username);
92                 }
93         }
94
95         /*
96          * (non-Javadoc)
97          *
98          * @see gr.ebs.gss.server.ejb.GSSDAO#create(java.lang.Object)
99          */
100         public void create(final Object obj) {
101                 if (obj == null)
102                         throw new IllegalArgumentException("No object speficied");
103                 manager.persist(obj);
104         }
105
106         /*
107          * (non-Javadoc)
108          *
109          * @see gr.ebs.gss.server.ejb.GSSDAO#refresh(java.lang.Object)
110          */
111         public void refresh(final Object obj) {
112                 if (obj == null)
113                         throw new IllegalArgumentException("No object speficied");
114                 manager.refresh(obj);
115         }
116
117         /*
118          * (non-Javadoc)
119          *
120          * @see gr.ebs.gss.server.ejb.GSSDAO#update(java.lang.Object)
121          */
122         public void update(final Object obj) {
123                 if (obj == null)
124                         throw new IllegalArgumentException("No object speficied");
125                 manager.merge(obj);
126         }
127
128         /*
129          * (non-Javadoc)
130          *
131          * @see gr.ebs.gss.server.ejb.GSSDAO#delete(java.lang.Object)
132          */
133         public void delete(final Object entity) {
134                 if (entity == null)
135                         throw new IllegalArgumentException("No object speficied");
136                 manager.remove(entity);
137         }
138
139         /*
140          * (non-Javadoc)
141          *
142          * @see gr.ebs.gss.server.ejb.GSSDAO#getEntityById(java.lang.Class,
143          *      java.lang.Object)
144          */
145         public <T> T getEntityById(final Class<T> _class, final Object _id) throws ObjectNotFoundException {
146                 if (_id == null)
147                         throw new ObjectNotFoundException("No " + _class.getSimpleName() + " specified");
148
149                 final T entity = manager.find(_class, _id);
150                 if (entity == null)
151                         throw new ObjectNotFoundException(_class.getSimpleName() + " with id=" + _id + " was not found");
152
153                 return entity;
154         }
155
156         /*
157          * (non-Javadoc)
158          *
159          * @see gr.ebs.gss.server.ejb.GSSDAO#getGroups(java.lang.Long)
160          */
161         @SuppressWarnings("unchecked")
162         public List<Group> getGroups(final Long userId) throws ObjectNotFoundException {
163                 if (userId == null)
164                         throw new ObjectNotFoundException("No user specified");
165
166                 return manager.createQuery("select g from Group g where g.owner.id=:userId").setParameter("userId", userId).getResultList();
167         }
168
169         /*
170          * (non-Javadoc)
171          *
172          * @see gr.ebs.gss.server.ejb.GSSDAO#getFiles(java.lang.Long, java.lang.Boolean)
173          */
174         @SuppressWarnings("unchecked")
175         public List<FileHeader> getFiles(final Long folderId, Long userId, boolean ignoreDeleted) throws ObjectNotFoundException {
176                 if (folderId == null)
177                         throw new ObjectNotFoundException("No folder specified");
178                 if (userId == null)
179                         throw new ObjectNotFoundException("No user specified");
180                 User user = getEntityById(User.class, userId);
181                 String query;
182                 if(ignoreDeleted)
183                         query = "select f from FileHeader f where f.folder.id=:folderId  and f.deleted=false";
184                 else
185                         query = "select f from FileHeader f where f.folder.id=:folderId";
186                 List<FileHeader> tempList = manager.createQuery(query).setParameter("folderId", folderId).getResultList();
187                 List<FileHeader> retv = new ArrayList<FileHeader>();
188                 for (FileHeader f: tempList)
189                         if (f.hasReadPermission(user)) retv.add(f);
190
191                 return retv;
192         }
193
194         /*
195          * (non-Javadoc)
196          *
197          * @see gr.ebs.gss.server.ejb.GSSDAO#getUsers(java.lang.Long)
198          */
199         @SuppressWarnings("unchecked")
200         public List<User> getUsers(final Long groupId) throws ObjectNotFoundException {
201                 if (groupId == null)
202                         throw new ObjectNotFoundException("No group specified");
203                 return manager.createQuery("select u from User u join u.groupsMember g where g.id=:groupId").
204                                 setParameter("groupId", groupId).getResultList();
205         }
206
207         @Override
208         public boolean existsFolderOrFile(Long parentId, String name) throws ObjectNotFoundException {
209                 if (parentId == null)
210                         throw new ObjectNotFoundException("No parent folder specified");
211                 if (StringUtils.isEmpty(name))
212                         throw new IllegalArgumentException("No folder name specified");
213
214                 try {
215                         manager .createQuery("select f from Folder f " +
216                                         "where f.parent.id=:parentId and f.name=:name")
217                                         .setParameter("parentId", parentId)
218                                         .setParameter("name", name)
219                                         .getSingleResult();
220                         return true;
221                 } catch (NoResultException e) {
222                         try {
223                                 manager .createQuery("select f from FileHeader f " +
224                                                 "where f.folder.id=:parentId and f.name=:name")
225                                                 .setParameter("parentId", parentId)
226                                                 .setParameter("name", name)
227                                                 .getSingleResult();
228                                 return true;
229                         } catch (NoResultException e1) {
230                                 return false;
231                         }
232                 }
233         }
234
235         /*
236          * (non-Javadoc)
237          *
238          * @see gr.ebs.gss.server.ejb.GSSDAO#existsGroup(java.lang.Long,
239          *      java.lang.String)
240          */
241         public boolean existsGroup(final Long userId, final String name) throws ObjectNotFoundException {
242                 if (userId == null)
243                         throw new ObjectNotFoundException("No user specified");
244                 if (StringUtils.isEmpty(name))
245                         throw new ObjectNotFoundException("No group name specified");
246                 try {
247                         manager .createQuery("select g from Group g where g.owner.id=:userId and g.name=:name")
248                                         .setParameter("userId", userId)
249                                         .setParameter("name", name)
250                                         .getSingleResult();
251                         return true;
252                 } catch (final NoResultException e) {
253                         return false;
254                 }
255         }
256
257         /* (non-Javadoc)
258          * @see gr.ebs.gss.server.ejb.GSSDAO#getUserTags(java.lang.Long)
259          */
260         public Set<String> getUserTags(final Long userId) throws ObjectNotFoundException {
261                 if (userId == null)
262                         throw new ObjectNotFoundException("No user specified");
263                 return new HashSet(manager.createQuery("select t.tag from FileTag t where t.user.id=:userId order by t.tag")
264                                                 .setParameter("userId", userId)
265                                                 .getResultList());
266         }
267
268         /* (non-Javadoc)
269          * @see gr.ebs.gss.server.ejb.GSSDAO#flush()
270          */
271         public void flush() {
272                 manager.flush();
273         }
274
275         /* (non-Javadoc)
276          * @see gr.ebs.gss.server.ejb.GSSDAO#getFile(java.lang.Long, java.lang.String)
277          */
278         public FileHeader getFile(Long folderId, String name) throws ObjectNotFoundException {
279                 if (folderId == null)
280                         throw new ObjectNotFoundException("No parent folder specified");
281                 if (StringUtils.isEmpty(name))
282                         throw new IllegalArgumentException("No file name specified");
283
284                 try {
285                         return (FileHeader) manager.createQuery("select f from FileHeader f where f.folder.id=:parentId and f.name=:name")
286                                         .setParameter("parentId", folderId)
287                                         .setParameter("name", name)
288                                         .getSingleResult();
289                 } catch (final NoResultException e1) {
290                         throw new ObjectNotFoundException("File not found");
291                 }
292         }
293
294         @Override
295         public Folder getFolder(Long parentId, String name) throws ObjectNotFoundException {
296                 if (parentId == null)
297                         throw new ObjectNotFoundException("No parent folder specified");
298                 if (StringUtils.isEmpty(name))
299                         throw new IllegalArgumentException("No folder name specified");
300
301                 try {
302                         return (Folder) manager.createQuery("select f from Folder f where f.parent.id=:parentId and f.name=:name")
303                                         .setParameter("parentId", parentId)
304                                         .setParameter("name", name)
305                                         .getSingleResult();
306                 } catch (NoResultException e) {
307                         throw new ObjectNotFoundException("Folder not found");
308                 }
309         }
310
311         /* (non-Javadoc)
312          * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedFiles(java.lang.Long)
313          */
314         public List<FileHeader> getDeletedFiles(Long userId) throws ObjectNotFoundException {
315                 if (userId == null)
316                         throw new ObjectNotFoundException("No User specified");
317                 User user = getEntityById(User.class, userId);
318
319                 List<FileHeader> tempList = manager.createQuery("select f from FileHeader f where f.owner.id=:userId and " +
320                                         "f.deleted=true and f.folder.deleted=false").
321                                         setParameter("userId", userId).getResultList();
322                 List<FileHeader> retv = new ArrayList<FileHeader>();
323                 for (FileHeader f: tempList)
324                         if (f.hasReadPermission(user)) retv.add(f);
325
326                 return retv;
327         }
328
329         /* (non-Javadoc)
330          * @see gr.ebs.gss.server.ejb.GSSDAO#getDeletedRootFolders(java.lang.Long)
331          */
332         public List<Folder> getDeletedRootFolders(Long userId) throws ObjectNotFoundException {
333                 if (userId == null)
334                         throw new ObjectNotFoundException("No User specified");
335                 return manager.createQuery("select f from Folder f where f.owner.id=:userId and " +
336                                         "f.deleted=true and f.parent.deleted=false").
337                                         setParameter("userId", userId).getResultList();
338         }
339
340         @Override
341         public User findUser(String username) {
342                 if (username == null)
343                         return null;
344                 List<User> results = manager.createQuery("select u from User u where u.username=:username").
345                                 setParameter("username", username).getResultList();
346                 if (results.isEmpty()) return null;
347                 return results.get(0);
348         }
349
350         @Override
351         public User findUserByEmail(String email) {
352                 if (email == null)
353                         return null;
354                 List<User> results = manager.createQuery("select u from User u where u.email=:email").
355                                 setParameter("email", email).getResultList();
356                 if (results.isEmpty()) return null;
357                 return results.get(0);
358         }
359
360         @Override
361         public List<User> getUsersByUserNameLike(String username) {
362                 return manager.createQuery("select u from User u where u.username like :username").
363                 setParameter("username", username+"%").getResultList();
364         }
365
366         @Override
367         public List<Folder> getSharedRootFolders(Long userId) {
368                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
369                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
370                                         "and (p.group.id != null or p.user.id != f.owner.id) ").
371                                         setParameter("userId", userId).getResultList();
372                 List<Folder> result = new ArrayList<Folder>();
373                 for(Folder f : folders)
374                         if(!folders.contains(f.getParent()))
375                                 result.add(f);
376                 return result;
377         }
378
379         @Override
380         public List<Folder> getFoldersPermittedForGroup(Long userId, Long groupId) {
381                 return manager.createQuery("select distinct f from Folder f LEFT JOIN f.permissions p " +
382                                         "where f.owner.id=:userId and f.deleted = false and p.group.id=:groupId ").
383                                         setParameter("userId", userId).setParameter("groupId", groupId).getResultList();
384         }
385
386         @Override
387         public List<User> getUsersSharingFoldersForUser(Long userId) {
388                 return manager.createQuery("select distinct f.owner from Folder f " +
389                                         "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
390                                         "and (p.user.id=:userId or p.group.id in (select distinct gg.id " +
391                                         "from Group gg join gg.members memb where memb.id=:userId))) ").
392                                         setParameter("userId", userId).getResultList();
393         }
394
395         @Override
396         public List<User> getUsersSharingFilesForUser(Long userId) {
397                 List<User> users = manager.createQuery("select distinct f.owner from FileHeader f " +
398                                         "LEFT JOIN f.permissions p where f.owner.id != :userId and f.deleted=false " +
399                                         "and (p.user.id=:userId or p.group.id in (select distinct gg.id from Group gg " +
400                                         "join gg.members memb where memb.id=:userId)))").
401                                         setParameter("userId", userId).getResultList();
402                 return users;
403
404         }
405
406         @Override
407         public List<FileHeader> getSharedFilesNotInSharedFolders(Long userId) throws ObjectNotFoundException {
408                 if (userId == null)
409                         throw new ObjectNotFoundException("No user specified");
410                 User user = getEntityById(User.class, userId);
411                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
412                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
413                                         "and (f.readForAll=true or p.group.id != null or p.user.id != f.owner.id)" +
414                                         " and f.folder.id not in (select distinct fo.id from Folder fo LEFT JOIN " +
415                                         "fo.permissions po where fo.owner.id=:userId and fo.deleted=false and " +
416                                         "(po.group.id != null or po.user.id != fo.owner.id))").
417                                         setParameter("userId", userId).getResultList();
418                 List<FileHeader> retv = new ArrayList<FileHeader>();
419                 for (FileHeader f: tempList)
420                         if (f.hasReadPermission(user)) retv.add(f);
421
422                 return retv;
423         }
424
425         @Override
426         public List<FileHeader> getSharedFiles(Long userId) throws ObjectNotFoundException {
427                 if (userId == null)
428                         throw new ObjectNotFoundException("No user specified");
429                 User user = getEntityById(User.class, userId);
430                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
431                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
432                                         "and (p.group.id != null or p.user.id != f.owner.id)").
433                                         setParameter("userId", userId).getResultList();
434                 List<FileHeader> retv = new ArrayList<FileHeader>();
435                 for (FileHeader f: tempList)
436                         if (f.hasReadPermission(user)) retv.add(f);
437
438                 return retv;
439         }
440
441         @Override
442         public List<Folder> getSharedFolders(Long userId) {
443                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
444                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
445                                         "and (p.group.id != null or p.user.id != f.owner.id)").
446                                         setParameter("userId", userId).getResultList();
447                 return folders;
448         }
449
450         /* (non-Javadoc)
451          * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedFiles(java.lang.Long, java.lang.Long)
452          */
453         @Override
454         public List<FileHeader> getSharedFiles(Long userId, Long callingUserId) throws ObjectNotFoundException {
455                 if (userId == null)
456                         throw new ObjectNotFoundException("No user specified");
457                 User user = getEntityById(User.class, userId);
458                 List<FileHeader> tempList = manager.createQuery("select distinct f from FileHeader f " +
459                                         "LEFT JOIN f.permissions p where f.owner.id=:userId and f.deleted=false " +
460                                         "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
461                                         "(select distinct gg.id from Group gg join gg.members memb " +
462                                         "where memb.id=:cuserId)) and f.folder.id not in (select distinct fo.id " +
463                                         "from Folder fo LEFT JOIN fo.permissions po where fo.owner.id = :userId " +
464                                         "and fo.deleted=false and po.read=true and (po.user.id=:cuserId " +
465                                         "or po.group.id in (select distinct ggo.id from Group ggo " +
466                                         "join ggo.members membo where membo.id=:cuserId)))").
467                                         setParameter("userId", userId).setParameter("cuserId", callingUserId).getResultList();
468                 List<FileHeader> retv = new ArrayList<FileHeader>();
469                 for (FileHeader f: tempList)
470                         if (f.hasReadPermission(user)) retv.add(f);
471
472                 return retv;
473         }
474
475         /* (non-Javadoc)
476          * @see gr.ebs.gss.server.ejb.GSSDAO#getSharedRootFolders(java.lang.Long, java.lang.Long)
477          */
478         @Override
479         public List<Folder> getSharedRootFolders(Long userId, Long callingUserId) {
480                 List<Folder> folders = manager.createQuery("select distinct f from Folder f " +
481                                         "LEFT JOIN f.permissions p where f.owner.id = :userId and f.deleted=false " +
482                                         "and p.read=true and (p.user.id=:cuserId or p.group.id in " +
483                                         "(select distinct gg.id from Group gg join gg.members memb " +
484                                         "where memb.id=:cuserId))) ").
485                                         setParameter("userId", userId).
486                                         setParameter("cuserId", callingUserId).
487                                         getResultList();
488                 List<Folder> result = new ArrayList<Folder>();
489                 for(Folder f : folders)
490                         if(!folders.contains(f.getParent()))
491                                 result.add(f);
492                 return result;
493
494         }
495
496         /* (non-Javadoc)
497          * @see gr.ebs.gss.server.ejb.GSSDAO#searchFiles(java.lang.Long, java.lang.String)
498          */
499         @Override
500         public List<FileHeader> searchFiles(Long userId, String query) {
501                 return manager.createQuery("select f from FileHeader f where f.owner.id=:userId and f.name like :query").
502                                 setParameter("query", "%"+query+"%").setParameter("userId",userId).getResultList();
503         }
504
505         @Override
506         public Nonce getNonce(String nonce, Long userId) throws ObjectNotFoundException {
507                 List<Nonce> results = manager.createQuery("select n from Nonce n where n.userId=:userId and n.encodedNonce=:nonce").
508                                 setParameter("userId", userId).setParameter("nonce", nonce).getResultList();
509                 if (results.isEmpty())
510                         throw new ObjectNotFoundException("No nonce found");
511                 return results.get(0);
512         }
513
514         /* (non-Javadoc)
515          * @see gr.ebs.gss.server.ejb.GSSDAO#getFileForIndexing(java.lang.Long)
516          */
517         @Override
518         public FileHeader getFileForIndexing(Long id) throws ObjectNotFoundException {
519                 FileHeader h = getEntityById(FileHeader.class, id);
520                 h.getFileTags().size();
521                 return h;
522         }
523
524         /* (non-Javadoc)
525          * @see gr.ebs.gss.server.ejb.GSSDAO#getFileCount(java.lang.Long)
526          */
527         @Override
528         public Long getFileCount(Long userId) {
529                 Long singleResult = (Long) manager.createQuery("select count(f) from FileHeader f where f.owner.id=:ownerId")
530                 .setParameter("ownerId", userId)
531                 .getSingleResult();
532                 return singleResult;
533         }
534
535         /* (non-Javadoc)
536          * @see gr.ebs.gss.server.ejb.GSSDAO#getFileSize(java.lang.Long)
537          */
538         @Override
539         public Long getFileSize(Long userId) {
540                 Long singleResult = (Long) manager.createQuery("select sum(f.fileSize) from FileBody f where f.header.owner.id=:ownerId")
541                 .setParameter("ownerId", userId)
542                 .getSingleResult();
543                 if(singleResult == null)
544                         singleResult = new Long(0L);
545                 return singleResult;
546
547         }
548
549         /* (non-Javadoc)
550          * @see gr.ebs.gss.server.ejb.GSSDAO#getAllFileIds()
551          */
552         @Override
553         public List<Long> getAllFileIds() {
554                 List<Long> ids = manager.createQuery("select f.id from FileHeader f").getResultList();
555                 return ids;
556         }
557
558         /* (non-Javadoc)
559          * @see gr.ebs.gss.server.ejb.GSSDAO#getFileUploadStatus(java.lang.Long, java.lang.String)
560          */
561         @Override
562         public FileUploadStatus getFileUploadStatus(Long userId, String fileName) {
563                 List<FileUploadStatus> res = manager.createQuery(" select f from FileUploadStatus f where f.owner.id=:userId and f.filename=:filename").setParameter("userId", userId).setParameter("filename", fileName).getResultList();
564                 if(res.size()>0)
565                         return res.get(0);
566                 return null;
567         }
568
569         @Override
570         public FileBody getFileVersion(Long fileId, int version) throws ObjectNotFoundException {
571                 try {
572                         return (FileBody) manager.createQuery("select f from FileBody f " +
573                         "where f.header.id=:fileId and f.version=:version")
574                         .setParameter("fileId", fileId).setParameter("version", version)
575                         .getSingleResult();
576                 } catch (NoResultException e) {
577                         throw new ObjectNotFoundException("No version " + version + " found for file #" + fileId);
578                 }
579         }
580
581         @Override
582         public void updateAccounting(User user, Date date, long bandwidthDiff) {
583                 AccountingInfo ai = null;
584                 try {
585                         ai = (AccountingInfo) manager.createQuery("select ai from AccountingInfo ai " +
586                                 "where ai.user=:user and ai.dateFrom<=:date and ai.dateTo>:date")
587                                 .setParameter("user", user)
588                                 .setParameter("date", date)
589                                 .getSingleResult();
590                 }
591                 catch (NoResultException e) {
592                         ai = null;
593                 }
594
595                 if (ai==null) {
596                         // The right entry does not exist; must be created.
597                         // This is where we set the initial time period.
598                         // We now start from the user's creation, we can change this to something else.
599                         Calendar creationDate = new GregorianCalendar();
600                         creationDate.setTime(user.getAuditInfo().getCreationDate());
601                         int offset = 0;
602                         Calendar dateFrom;
603                         Calendar dateTo;
604                         long timeInMillis = date.getTime();
605                         do {
606                                 dateFrom = (Calendar) creationDate.clone();
607                                 dateFrom.add(BANDWIDTH_TIME_PERIOD_FIELD, offset);
608                                 dateTo = (Calendar) dateFrom.clone();
609                                 dateTo.add(BANDWIDTH_TIME_PERIOD_FIELD, 1);
610                                 offset += BANDWIDTH_TIME_PERIOD_AMOUNT;
611                         }
612                         while (!(dateFrom.getTimeInMillis()<=timeInMillis && dateTo.getTimeInMillis()>timeInMillis));
613
614                         ai = new AccountingInfo(user, dateFrom.getTime(), dateTo.getTime());
615                         manager.persist(ai);
616                 }
617
618                 // Do the update.
619                 ai.updateBandwidth(bandwidthDiff);
620         }
621
622 }