source: contrib/MailArchiver/sources/src/serpro/mailarchiver/service/web/DefaultMoveFolderOperation.java @ 6785

Revision 6785, 5.0 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado codigo do MailArchiver?. Documentação na subpasta DOCS.

Line 
1/**
2 * MailArchiver is an application that provides services for storing and managing e-mail messages through a Web Services SOAP interface.
3 * Copyright (C) 2012  Marcio Andre Scholl Levien and Fernando Alberto Reuter Wendt and Jose Ronaldo Nogueira Fonseca Junior
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/******************************************************************************\
20*
21*  This product was developed by
22*
23*        SERVIÇO FEDERAL DE PROCESSAMENTO DE DADOS (SERPRO),
24*
25*  a government company established under Brazilian law (5.615/70),
26*  at Department of Development of Porto Alegre.
27*
28\******************************************************************************/
29
30package serpro.mailarchiver.service.web;
31
32import java.io.IOException;
33import java.nio.file.Files;
34import java.nio.file.Path;
35import java.nio.file.StandardCopyOption;
36
37import javax.jdo.annotations.PersistenceAware;
38
39import org.springframework.beans.factory.annotation.Autowired;
40
41import serpro.mailarchiver.domain.metaarchive.Folder;
42import serpro.mailarchiver.service.BaseService;
43import serpro.mailarchiver.service.dto.TFolder;
44import serpro.mailarchiver.service.find.FFolder;
45import serpro.mailarchiver.util.Logger;
46import serpro.mailarchiver.util.transaction.WithReadWriteTx;
47
48@PersistenceAware
49public class DefaultMoveFolderOperation
50    extends BaseService
51    implements MoveFolderOperation
52{
53    private static final Logger log = Logger.getLocalLogger();
54
55    @Autowired
56    private FFolder findFolder;
57
58    @WithReadWriteTx
59    @Override
60    public TFolder apply(String newParentFolderId, String folderId) throws ServiceFault {
61
62        Folder folder = findFolder.byId(folderId);
63
64        if(folder == null) {
65            ServiceFault.folderNotFound()
66                    .setActor("moveFolder")
67                    .setMessage("Folder not found.")
68                    .addValue("folderId", folderId)
69                    .raise();
70        }
71
72        if(folder.isUserHomeFolder() || folder.isSpecialFolder()) {
73            ServiceFault.invalidFolderId()
74                    .setActor("moveFolder")
75                    .setMessage("Invalid move of home folder or special folder.")
76                    .addValue("folderId", folderId)
77                    .raise();
78        }
79
80        Folder newParentFolder = findFolder.byId(newParentFolderId);
81
82        if(newParentFolder == null) {
83            ServiceFault.folderNotFound()
84                    .setActor("moveFolder")
85                    .setMessage("New parent folder not found.")
86                    .addValue("newParentFolderId", newParentFolderId)
87                    .raise();
88        }
89
90        Folder currentParentFolder = folder.getParent();
91
92        if(newParentFolder != currentParentFolder) {
93
94            for(Folder child : newParentFolder.getChildren()) {
95                if(child.getName().equalsIgnoreCase(folder.getName())) {
96                    ServiceFault.folderNameAlreadyExists()
97                            .setActor("moveFolder")
98                            .setMessage("An folder with the same name already exist inside the new parent folder.")
99                            .addValue("folderId", folderId)
100                            .addValue("folderName", folder.getName())
101                            .addValue("newParentFolderId", newParentFolderId)
102                            .addValue("newParentFolderName", newParentFolder.getName())
103                            .raise();
104                }
105            }
106
107            try {
108                Path source = folder.getAbsolutePath();
109                folder.setParent(newParentFolder);
110                Path target = folder.getAbsolutePath();
111                Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);
112            }
113            catch(IOException e) {
114                folder.setParent(currentParentFolder);
115                ServiceFault.fileSystemFailure()
116                        .setActor("moveFolder")
117                        .setMessage("Filesystem move folder failure.")
118                        .addValue("folderId", folderId)
119                        .addValue("currentFolderPath", folder.getRelativePath())
120                        .addValue("newParentFolderId", newParentFolderId)
121                        .addValue("newParentFolderPath", newParentFolder.getRelativePath())
122                        .setCause(e)
123                        .raise();
124            }
125        }
126
127        return new TFolder(folder);
128    }
129}
Note: See TracBrowser for help on using the repository browser.