]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/MyDetailsForm.java
upd: use a more strict pattern for handling forms
[gigi.git] / src / org / cacert / gigi / pages / account / MyDetailsForm.java
1 package org.cacert.gigi.pages.account;
2
3 import java.io.PrintWriter;
4 import java.util.Map;
5 import java.util.Set;
6
7 import javax.servlet.http.HttpServletRequest;
8
9 import org.cacert.gigi.GigiApiException;
10 import org.cacert.gigi.dbObjects.Group;
11 import org.cacert.gigi.dbObjects.Name;
12 import org.cacert.gigi.dbObjects.User;
13 import org.cacert.gigi.localisation.Language;
14 import org.cacert.gigi.output.ArrayIterable;
15 import org.cacert.gigi.output.CountrySelector;
16 import org.cacert.gigi.output.DateSelector;
17 import org.cacert.gigi.output.GroupIterator;
18 import org.cacert.gigi.output.GroupSelector;
19 import org.cacert.gigi.output.NameInput;
20 import org.cacert.gigi.output.template.Form;
21 import org.cacert.gigi.output.template.Template;
22
23 public class MyDetailsForm extends Form {
24
25     private static final Template assured = new Template(MyDetails.class.getResource("MyDetailsFormAssured.templ"));
26
27     private static final Template templ = new Template(MyDetailsForm.class.getResource("MyDetailsForm.templ"));
28
29     private static final Template names = new Template(MyDetailsForm.class.getResource("NamesForm.templ"));
30
31     private static final Template roles = new Template(MyDetailsForm.class.getResource("MyDetailsRoles.templ"));
32
33     private User target;
34
35     private DateSelector ds;
36
37     private NameInput ni;
38
39     private CountrySelector cs;
40
41     private GroupSelector selectedGroup = new GroupSelector("groupToModify", false);
42
43     public MyDetailsForm(HttpServletRequest hsr, User target) {
44         super(hsr);
45         this.target = target;
46         ni = new NameInput();
47
48         this.ds = new DateSelector("day", "month", "year", target.getDoB());
49
50         if (target.getResidenceCountry() == null) {
51             this.cs = new CountrySelector("residenceCountry", true);
52         } else {
53             this.cs = new CountrySelector("residenceCountry", true, target.getResidenceCountry());
54         }
55     }
56
57     @Override
58     public boolean submit(HttpServletRequest req) throws GigiApiException {
59         try {
60             String rn = req.getParameter("removeName");
61             if (rn != null) {
62                 Name n = Name.getById(Integer.parseInt(rn));
63                 if (n.getOwner() != target) {
64                     throw new GigiApiException("Cannot remove a name that does not belong to this account.");
65                 }
66                 if (n.equals(target.getPreferredName())) {
67                     throw new GigiApiException("Cannot remove the account's preferred name.");
68                 }
69                 n.remove();
70                 return true;
71             }
72             String dn = req.getParameter("deprecateName");
73             if (dn != null) {
74                 Name n = Name.getById(Integer.parseInt(dn));
75                 if (n.getOwner() != target) {
76                     throw new GigiApiException("Cannot deprecate a name that does not belong to this account.");
77                 }
78                 if (n.equals(target.getPreferredName())) {
79                     throw new GigiApiException("Cannot deprecate the account's preferred name.");
80                 }
81                 n.deprecate();
82                 return true;
83             }
84             String pn = req.getParameter("preferred");
85             if (pn != null) {
86                 Name n = Name.getById(Integer.parseInt(pn));
87                 target.setPreferredName(n);
88                 return true;
89             }
90
91             String action = req.getParameter("action");
92             if ("addName".equals(action)) {
93                 ni.update(req);
94                 ni.createName(target);
95                 return true;
96             }
97             if ("updateDoB".equals(action)) {
98                 ds.update(req);
99                 target.setDoB(ds.getDate());
100             }
101             if ("updateResidenceCountry".equals(action)) {
102                 cs.update(req);
103                 target.setResidenceCountry(cs.getCountry());
104             }
105
106             if ("addGroup".equals(action) || "removeGroup".equals(action)) {
107                 selectedGroup.update(req);
108                 Group toMod = selectedGroup.getGroup();
109                 if ("addGroup".equals(action)) {
110                     target.grantGroup(target, toMod);
111                 } else {
112                     target.revokeGroup(target, toMod);
113                 }
114                 return true;
115             }
116
117         } catch (NumberFormatException e) {
118             throw new GigiApiException("Invalid value.");
119         }
120         return false;
121     }
122
123     @Override
124     protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
125         vars.put("exNames", new ArrayIterable<Name>(target.getNames()) {
126
127             Name preferred = target.getPreferredName();
128
129             @Override
130             public void apply(Name t, Language l, Map<String, Object> vars) {
131                 if (t.equals(preferred)) {
132                     vars.put("preferred", " disabled");
133                     vars.put("deprecated", " disabled");
134                 } else {
135                     if (t.isDeprecated()) {
136                         vars.put("deprecated", " disabled");
137                     } else {
138                         vars.put("deprecated", "");
139                     }
140                     vars.put("preferred", "");
141                 }
142                 vars.put("name", t);
143                 vars.put("id", t.getId());
144                 vars.put("npoints", Integer.toString(t.getAssurancePoints()));
145             }
146
147         });
148         vars.put("name", ni);
149         names.output(out, l, vars);
150
151         vars.put("residenceCountry", cs);
152         if (target.getReceivedAssurances().length == 0) {
153             vars.put("DoB", ds);
154             templ.output(out, l, vars);
155         } else {
156             vars.put("DoB", target.getDoB());
157             assured.output(out, l, vars);
158         }
159
160         final Set<Group> gr = target.getGroups();
161         vars.put("support-groups", new GroupIterator(gr.iterator(), true));
162         vars.put("groups", new GroupIterator(gr.iterator(), false));
163         vars.put("groupSelector", selectedGroup);
164         roles.output(out, l, vars);
165     }
166
167 }