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

Revision 6785, 5.1 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;
34
35import javax.jdo.annotations.PersistenceAware;
36
37import org.springframework.beans.factory.annotation.Autowired;
38
39import serpro.mailarchiver.domain.metaarchive.Folder;
40import serpro.mailarchiver.domain.metaarchive.Message;
41import serpro.mailarchiver.service.BaseService;
42import serpro.mailarchiver.service.find.FFolder;
43import serpro.mailarchiver.session.Session;
44import serpro.mailarchiver.util.Logger;
45import serpro.mailarchiver.util.jdo.PersistenceManager;
46import serpro.mailarchiver.util.transaction.WithReadWriteTx;
47
48@PersistenceAware
49public class DefaultDeleteFolderOperation
50    extends BaseService
51    implements DeleteFolderOperation
52{
53    private static final Logger log = Logger.getLocalLogger();
54
55    @Autowired
56    private FFolder findFolder;
57
58    @WithReadWriteTx
59    @Override
60    public Integer apply(String folderId, boolean recursive) throws ServiceFault {
61
62        PersistenceManager pm = getPersistenceManager();
63
64        Folder folder = findFolder.byId(folderId);
65
66        if(folder == null) {
67            ServiceFault.folderNotFound()
68                    .setActor("deleteFolder")
69                    .setMessage("Folder not found.")
70                    .addValue("folderId", folderId)
71                    .raise();
72        }
73
74        if(folder.isUserHomeFolder()) {
75            ServiceFault.invalidFolderId()
76                    .setActor("deleteFolder")
77                    .setMessage("Invalid delete of home folder.")
78                    .raise();
79        }
80
81        if(recursive) {
82            deleteRecursively(folder, pm);
83        }
84        else {
85            delete(folder, pm);
86        }
87
88        return 0;
89    }
90
91    private void deleteRecursively(Folder folder, PersistenceManager pm) throws ServiceFault {
92        for(Folder childFolder : folder.getChildren()) {
93            deleteRecursively(childFolder, pm);
94        }
95        for(Message message : folder.getMessages()) {
96            try {
97                Files.deleteIfExists(message.getAbsolutePath());
98                Session.getLuceneIndex().deleteMessage(message.getOid());
99                pm.deletePersistent(message);
100            }
101            catch(IOException e) {
102                ServiceFault.fileSystemFailure()
103                        .setActor("deleteFolder")
104                        .setMessage("Filesystem delete message failure.")
105                        .addValue("messagePath", message.getRelativePath())
106                        .setCause(e)
107                        .raise();
108            }
109        }
110        delete(folder, pm);
111    }
112
113    private void delete(Folder folder, PersistenceManager pm) throws ServiceFault {
114        if((folder.getChildren().size() > 0) || (folder.getMessages().size() > 0)) {
115            ServiceFault.folderNotEmpty()
116                    .setActor("deleteFolder")
117                    .setMessage("Folder not empty.")
118                    .addValue("folderPath", folder.getRelativePath())
119                    .raise();
120        }
121
122        if(folder.getAbsolutePath().toFile().list().length > 0) {
123            ServiceFault.fileSystemFolderNotEmpty()
124                    .setActor("deleteFolder")
125                    .setMessage("Filesystem directory not empty.")
126                    .addValue("folderPath", folder.getRelativePath())
127                    .raise();
128        }
129
130        try {
131            Files.deleteIfExists(folder.getAbsolutePath());
132            pm.deletePersistent(folder);
133        }
134        catch (IOException e) {
135            ServiceFault.fileSystemFailure()
136                    .setActor("deleteFolder")
137                    .setMessage("Filesystem delete directory failure.")
138                    .addValue("folder path", folder.getRelativePath())
139                    .setCause(e)
140                    .raise();
141        }
142    }
143}
Note: See TracBrowser for help on using the repository browser.