Rev 1010 | Rev 1014 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
924 | dev | 1 | package ak.hostadmiral.core.action; |
919 | dev | 2 | |
3 | import java.util.List; |
||
4 | import java.util.Iterator; |
||
5 | import java.util.Collections; |
||
6 | import java.util.ArrayList; |
||
1012 | dev | 7 | import java.util.HashSet; |
919 | dev | 8 | |
9 | import javax.servlet.http.HttpServletRequest; |
||
10 | import javax.servlet.http.HttpServletResponse; |
||
11 | |||
12 | import org.apache.commons.beanutils.BeanUtils; |
||
13 | |||
14 | import org.apache.struts.action.Action; |
||
15 | import org.apache.struts.action.ActionMapping; |
||
16 | import org.apache.struts.action.ActionForm; |
||
17 | import org.apache.struts.action.DynaActionForm; |
||
18 | import org.apache.struts.action.ActionForward; |
||
19 | import org.apache.struts.action.ActionMessages; |
||
20 | import org.apache.struts.action.ActionErrors; |
||
21 | import org.apache.struts.action.ActionError; |
||
22 | |||
23 | import ak.strutsx.RequestUtilsX; |
||
24 | import ak.strutsx.ErrorHandlerX; |
||
25 | import ak.backpath.BackPath; |
||
26 | |||
924 | dev | 27 | import ak.hostadmiral.util.StringConverter; |
28 | import ak.hostadmiral.util.UserException; |
||
926 | dev | 29 | import ak.hostadmiral.core.CoreResources; |
924 | dev | 30 | import ak.hostadmiral.core.model.User; |
31 | import ak.hostadmiral.core.model.UserManager; |
||
32 | import ak.hostadmiral.core.model.Mailbox; |
||
33 | import ak.hostadmiral.core.model.MailboxManager; |
||
34 | import ak.hostadmiral.core.model.MailAlias; |
||
35 | import ak.hostadmiral.core.model.MailAliasManager; |
||
36 | import ak.hostadmiral.core.model.MailAliasDestination; |
||
37 | import ak.hostadmiral.core.model.MailAliasDestinationManager; |
||
38 | import ak.hostadmiral.core.model.InetDomainManager; |
||
39 | import ak.hostadmiral.core.form.MailAliasDestBean; |
||
919 | dev | 40 | |
41 | public final class MailAliasAction |
||
42 | extends Action |
||
43 | implements ErrorHandlerX |
||
44 | { |
||
45 | public void handleErrors(ActionMapping mapping, ActionForm form, |
||
46 | HttpServletRequest request, HttpServletResponse response) |
||
47 | throws Exception |
||
48 | { |
||
49 | if("submit".equals(mapping.getParameter())) { |
||
50 | User user = (User)request.getSession().getAttribute("user"); |
||
51 | initLists(request, user); |
||
52 | } |
||
53 | } |
||
54 | |||
55 | public ActionForward execute(ActionMapping mapping, ActionForm form, |
||
56 | HttpServletRequest request, HttpServletResponse response) |
||
57 | throws Exception |
||
58 | { |
||
59 | User user = (User)request.getSession().getAttribute("user"); |
||
60 | if("list".equals(mapping.getParameter())) { |
||
61 | List list = new ArrayList(MailAliasManager.getInstance().listMailAliases(user)); |
||
62 | Collections.sort(list, MailAliasManager.ADDRESS_COMPARATOR); |
||
63 | request.setAttribute("aliases", list); |
||
64 | request.setAttribute("allowedToCreate", |
||
951 | dev | 65 | Boolean.valueOf(MailAliasManager.getInstance().allowedToCreate(user))); |
919 | dev | 66 | |
67 | return mapping.findForward("default"); |
||
68 | } |
||
69 | else if("edit".equals(mapping.getParameter())) { |
||
70 | DynaActionForm theForm = (DynaActionForm)form; |
||
923 | dev | 71 | MailAlias alias; |
919 | dev | 72 | Long aliasId = StringConverter.parseLong(theForm.get("id")); |
923 | dev | 73 | List dests; |
919 | dev | 74 | |
75 | DynaActionForm showForm = (DynaActionForm)RequestUtilsX.populateActionForm( |
||
958 | dev | 76 | this, request, "MailAliasEditForm"); |
919 | dev | 77 | |
78 | if(aliasId == null) { |
||
923 | dev | 79 | alias = MailAliasManager.getInstance().create(user); |
80 | dests = new ArrayList(); |
||
951 | dev | 81 | showForm.set("enabled", Boolean.TRUE); |
919 | dev | 82 | } |
83 | else { |
||
923 | dev | 84 | alias = MailAliasManager.getInstance().get(user, aliasId); |
85 | dests = new ArrayList(MailAliasDestinationManager.getInstance() |
||
86 | .listMailAliasesDestination(alias)); |
||
919 | dev | 87 | MailAliasDestBean[] d = new MailAliasDestBean[dests.size()]; |
88 | |||
89 | // FIXME: sort dests here |
||
90 | |||
91 | for(int i = 0; i < dests.size(); i++) { |
||
92 | d[i] = new MailAliasDestBean((MailAliasDestination)dests.get(i)); |
||
93 | } |
||
94 | showForm.set("dests", d); |
||
95 | |||
96 | showForm.set("address", alias.getAddress()); |
||
97 | if(alias.getDomain() != null) |
||
98 | showForm.set("domain", StringConverter.toString(alias.getDomain().getId())); |
||
99 | if(alias.getOwner() != null) |
||
100 | showForm.set("owner", StringConverter.toString(alias.getOwner().getId())); |
||
101 | showForm.set("enabled", alias.getEnabled()); |
||
102 | showForm.set("comment", alias.getComment()); |
||
103 | } |
||
104 | |||
105 | initLists(request, user); |
||
923 | dev | 106 | request.setAttribute("alias", alias); |
107 | request.setAttribute("dests", dests); |
||
108 | if(alias.editableBy(user)) |
||
109 | return mapping.findForward("default"); |
||
110 | else if(alias.mayChangeDestinations(user)) |
||
111 | return mapping.findForward("editdests"); |
||
112 | else |
||
113 | return mapping.findForward("view"); |
||
919 | dev | 114 | } |
1012 | dev | 115 | else if("deleting".equals(mapping.getParameter())) { |
116 | DynaActionForm theForm = (DynaActionForm)form; |
||
117 | Long aliasId = StringConverter.parseLong(theForm.get("id")); |
||
118 | MailAlias alias = MailAliasManager.getInstance().get(user, aliasId); |
||
119 | |||
120 | request.setAttribute("action", "/mail/alias/delete.do"); |
||
121 | request.setAttribute("object", alias); |
||
122 | request.setAttribute("cascade", |
||
123 | MailAliasManager.getInstance().beforeDelete(user, alias, new HashSet())); |
||
124 | |||
125 | return mapping.findForward("default"); |
||
126 | } |
||
919 | dev | 127 | else if("delete".equals(mapping.getParameter())) { |
128 | DynaActionForm theForm = (DynaActionForm)form; |
||
129 | Long aliasId = StringConverter.parseLong(theForm.get("id")); |
||
130 | MailAlias alias = MailAliasManager.getInstance().get(user, aliasId); |
||
131 | |||
132 | MailAliasManager.getInstance().delete(user, alias); |
||
133 | response.sendRedirect(BackPath.findBackPath(request).getBackwardUrl()); |
||
134 | return null; |
||
135 | } |
||
136 | else if("submit".equals(mapping.getParameter())) { |
||
137 | DynaActionForm theForm = (DynaActionForm)form; |
||
138 | Long aliasId = StringConverter.parseLong(theForm.get("id")); |
||
923 | dev | 139 | MailAlias alias = (aliasId == null) |
140 | ? MailAliasManager.getInstance().create(user) |
||
919 | dev | 141 | : MailAliasManager.getInstance().get(user, aliasId); |
142 | MailAliasDestBean[] dests = (MailAliasDestBean[])theForm.get("dests"); |
||
143 | |||
144 | // submit |
||
145 | if(request.getParameter("submit") != null) { |
||
146 | // FIXME: if empty element of select box is active, it will be changed |
||
147 | // by submit |
||
148 | |||
149 | // validate required fields, because it cannot be done in general case |
||
923 | dev | 150 | if(StringConverter.isEmpty(theForm.get("address"))) { |
151 | handleErrors(mapping, form, request, response); |
||
924 | dev | 152 | throw new UserException("ak.hostadmiral.core.mail.alias.edit.address.empty"); |
923 | dev | 153 | } |
154 | if(StringConverter.isEmpty(theForm.get("domain"))) { |
||
155 | handleErrors(mapping, form, request, response); |
||
924 | dev | 156 | throw new UserException("ak.hostadmiral.core.mail.alias.edit.domain.wrong"); |
923 | dev | 157 | } |
158 | if(StringConverter.isEmpty(theForm.get("owner"))) { |
||
159 | handleErrors(mapping, form, request, response); |
||
924 | dev | 160 | throw new UserException("ak.hostadmiral.core.mail.alias.edit.owner.wrong"); |
923 | dev | 161 | } |
919 | dev | 162 | |
1010 | dev | 163 | alias.setDomain(user, InetDomainManager.getInstance().get(user, |
164 | StringConverter.parseLong(theForm.get("domain")))); |
||
165 | |||
166 | String address = (String)theForm.get("address"); |
||
167 | if(MailAliasManager.getInstance().addressExists(user, alias, address)) { |
||
168 | handleErrors(mapping, form, request, response); |
||
169 | throw new UserException(CoreResources.NONUNIQUE_MAIL_ALIAS_ADDRESS); |
||
170 | } |
||
171 | alias.setAddress(user, address); |
||
172 | |||
173 | alias.setOwner(user, UserManager.getInstance().get(user, |
||
174 | StringConverter.parseLong(theForm.get("owner")))); |
||
175 | alias.setEnabled(user, (Boolean)theForm.get("enabled")); |
||
176 | alias.setComment(user, (String)theForm.get("comment")); |
||
177 | |||
921 | dev | 178 | alias.getDestinations(user).clear(); |
919 | dev | 179 | for(int i = 0; i < dests.length; i++) { |
180 | // FIXME: validate dest id, mailbox id, email |
||
181 | |||
182 | // skip empty rows |
||
183 | if((dests[i].getMailbox() == null) |
||
184 | && (dests[i].getEmail() == null || dests[i].getEmail().equals(""))) |
||
185 | continue; |
||
186 | |||
187 | // get bean |
||
188 | Long destId = StringConverter.parseLong(dests[i].getId()); |
||
189 | Long mailboxId = StringConverter.parseLong(dests[i].getMailbox()); |
||
190 | MailAliasDestination dest; |
||
191 | if(destId == null) |
||
192 | dest = MailAliasDestinationManager.getInstance().create(user); |
||
193 | else |
||
194 | dest = MailAliasDestinationManager.getInstance().get(user, destId); |
||
195 | |||
923 | dev | 196 | // connect |
197 | dest.setAlias(user, alias); |
||
198 | alias.getDestinations(user).add(dest); |
||
199 | |||
919 | dev | 200 | // set mailbox or email |
201 | if(mailboxId != null) { |
||
922 | dev | 202 | dest.setMailbox(user, MailboxManager.getInstance().get(user, mailboxId)); |
203 | dest.setEmail(user, null); |
||
919 | dev | 204 | } |
205 | else if(dests[i].getEmail() != null && !dests[i].getEmail().equals("")) { |
||
922 | dev | 206 | dest.setMailbox(user, null); |
207 | dest.setEmail(user, dests[i].getEmail()); |
||
919 | dev | 208 | } |
209 | |||
921 | dev | 210 | dest.setEnabled(user, dests[i].getEnabled()); |
211 | dest.setComment(user, dests[i].getComment()); |
||
919 | dev | 212 | } |
213 | |||
214 | // update alias |
||
215 | MailAliasManager.getInstance().save(user, alias); |
||
216 | |||
217 | response.sendRedirect(BackPath.findBackPath(request).getBackwardUrl()); |
||
218 | return null; |
||
219 | } |
||
220 | |||
221 | // add |
||
222 | else if(request.getParameter("add") != null) { |
||
223 | // FIXME: if called when no entries defined two rows are created |
||
224 | |||
225 | MailAliasDestBean[] newDests = new MailAliasDestBean[dests.length+1]; |
||
226 | if(dests.length > 0) |
||
227 | System.arraycopy(dests, 0, newDests, 0, dests.length); |
||
228 | newDests[dests.length] = new MailAliasDestBean(); |
||
951 | dev | 229 | newDests[dests.length].setEnabled(Boolean.TRUE); |
919 | dev | 230 | theForm.set("dests", newDests); |
231 | |||
232 | initLists(request, user); |
||
923 | dev | 233 | request.setAttribute("alias", alias); |
234 | request.setAttribute("dests", newDests); |
||
235 | if(alias.editableBy(user)) |
||
236 | return mapping.findForward("default"); |
||
237 | else if(alias.mayChangeDestinations(user)) |
||
238 | return mapping.findForward("editdests"); |
||
239 | else |
||
240 | return mapping.findForward("view"); |
||
919 | dev | 241 | } |
242 | |||
243 | // delete |
||
244 | else { |
||
245 | Iterator iter = request.getParameterMap().keySet().iterator(); |
||
246 | while(iter.hasNext()) { |
||
247 | String name = (String)iter.next(); |
||
248 | if(name.startsWith("delete.dests[")) { |
||
249 | int p = name.indexOf("]"); |
||
250 | if(p > 0) { |
||
251 | String index = name.substring("delete.dests[".length(), p); |
||
252 | try { |
||
253 | int n = Integer.parseInt(index); |
||
254 | if(n < 0 || n >= dests.length) break; |
||
255 | |||
256 | MailAliasDestBean[] newDests; |
||
257 | newDests = new MailAliasDestBean[dests.length-1]; |
||
258 | if(n > 0) |
||
259 | System.arraycopy(dests, 0, newDests, 0, n); |
||
260 | if(n < dests.length-1) |
||
261 | System.arraycopy(dests, n+1, newDests, |
||
262 | n, dests.length-n-1); |
||
263 | theForm.set("dests", newDests); |
||
923 | dev | 264 | request.setAttribute("dests", newDests); |
919 | dev | 265 | break; |
266 | } |
||
267 | catch(NumberFormatException ex) { |
||
268 | } |
||
269 | } |
||
270 | } |
||
271 | } |
||
272 | |||
273 | initLists(request, user); |
||
923 | dev | 274 | request.setAttribute("alias", alias); |
275 | if(alias.editableBy(user)) |
||
276 | return mapping.findForward("default"); |
||
277 | else if(alias.mayChangeDestinations(user)) |
||
278 | return mapping.findForward("editdests"); |
||
279 | else |
||
280 | return mapping.findForward("view"); |
||
919 | dev | 281 | } |
282 | } |
||
283 | else { |
||
284 | throw new Exception("unknown mapping parameter"); |
||
285 | } |
||
286 | } |
||
287 | |||
288 | private void initLists(HttpServletRequest request, User user) |
||
289 | throws Exception |
||
290 | { |
||
291 | // list of mailboxes to redirect to |
||
292 | List mailboxes = new ArrayList(MailboxManager.getInstance().listMailboxes(user)); |
||
293 | Collections.sort(mailboxes, MailboxManager.LOGIN_COMPARATOR); |
||
294 | request.setAttribute("mailboxes", mailboxes); |
||
295 | |||
296 | List users = new ArrayList(UserManager.getInstance().listUsers(user)); |
||
297 | Collections.sort(users, UserManager.LOGIN_COMPARATOR); |
||
298 | request.setAttribute("users", users); |
||
299 | |||
300 | List domains = new ArrayList(InetDomainManager.getInstance().listInetDomains(user)); |
||
301 | Collections.sort(domains, InetDomainManager.NAME_COMPARATOR); |
||
302 | request.setAttribute("domains", domains); |
||
303 | } |
||
304 | } |