Subversion Repositories general

Rev

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