Full admin page functionality is working.
[photos] / src / main / java / org / wamblee / photos / wicket / AdminPage.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.photos.wicket;
17
18 import java.util.List;
19 import java.util.logging.Logger;
20 import javax.inject.Inject;
21
22 import org.apache.wicket.PageParameters;
23 import org.apache.wicket.markup.html.WebMarkupContainer;
24 import org.apache.wicket.markup.html.basic.Label;
25 import org.apache.wicket.markup.html.form.DropDownChoice;
26 import org.apache.wicket.markup.html.form.Form;
27 import org.apache.wicket.markup.html.form.IChoiceRenderer;
28 import org.apache.wicket.markup.html.form.PasswordTextField;
29 import org.apache.wicket.markup.html.form.TextField;
30 import org.apache.wicket.markup.html.link.Link;
31 import org.apache.wicket.markup.repeater.RepeatingView;
32 import org.apache.wicket.model.IModel;
33 import org.apache.wicket.model.LoadableDetachableModel;
34 import org.apache.wicket.model.Model;
35 import org.wamblee.security.authentication.UserAdministration;
36 import org.wamblee.security.authentication.UserMgtException;
37
38 /**
39  * Homepage
40  */
41 public class AdminPage extends BasePage {
42
43     private static final Logger LOGGER = Logger.getLogger(AdminPage.class.getName());
44
45     private static final long serialVersionUID = 1L;
46
47     @Inject
48     private transient UserAdministration _userAdmin;
49
50     private TextField _groupName;
51
52     /**
53      * Constructor that is invoked when page is invoked without a session.
54      *
55      * @param parameters Page parameters
56      */
57     public AdminPage(final PageParameters parameters) throws Exception {
58         super();
59
60         RepeatingView groupDelete = new RepeatingView("groupDelete") {
61             @Override
62             protected void onPopulate() {
63                 removeAll();
64                 List<String> groups = _userAdmin.getGroups();
65                 for (final String group : groups) {
66                     WebMarkupContainer container = new WebMarkupContainer(newChildId());
67                     add(container);
68                     container.add(new Label("groupName", group));
69                     container.add(new Link("groupDelete") {
70                         @Override
71                         public void onClick() {
72                             try {
73                                 _userAdmin.removeGroup(group);
74                                 info("Group '" + group + "' removed");
75                             }
76                             catch (UserMgtException e) {
77                                 error("Could not remove group '" + group + "'");
78                             }
79                         }
80
81                         @Override
82                         public boolean isVisible() {
83                             return _userAdmin.getUsers(group).isEmpty();
84                         }
85                     });
86                 }
87             }
88         };
89         add(groupDelete);
90
91         Form groupCreate = new Form("groupCreate") {
92             @Override
93             protected void onSubmit() {
94                 String name = _groupName.getValue();
95                 if (name == null || name.length() == 0) {
96                     return;
97                 }
98                 try {
99                     _userAdmin.createGroup(name);
100                     _groupName.setModel(new Model(""));
101                     info("Group '" + name + "' created");
102                 }
103                 catch (UserMgtException e) {
104                     error("Group '" + name + "' could not be created");
105                 }
106             }
107         };
108         add(groupCreate);
109         _groupName = new TextField("groupName", new Model(""));
110         groupCreate.add(_groupName);
111
112         RepeatingView user = new RepeatingView("user") {
113             @Override
114             protected void onPopulate() {
115                 removeAll();
116                 List<String> users = _userAdmin.getUsers();
117                 for (final String user : users) {
118                     WebMarkupContainer nameContainer = new WebMarkupContainer(newChildId());
119                     nameContainer.add(new Label("name", user));
120                     add(nameContainer);
121                     RepeatingView groups = new RepeatingView("groups") {
122                         @Override
123                         protected void onPopulate() {
124                             removeAll();
125                             List<String> groups = _userAdmin.getGroups(user);
126                             for (final String group : groups) {
127                                 WebMarkupContainer groupContainer = new WebMarkupContainer(newChildId());
128                                 groupContainer.add(new Label("group", group));
129                                 groupContainer.add(new Link("remove") {
130                                     @Override
131                                     public void onClick() {
132                                         try {
133                                             _userAdmin.removeUserFromGroup(user, group);
134                                         }
135                                         catch (UserMgtException e) {
136                                             error("Error removing group: " + e.getMessage());
137                                         }
138                                     }
139                                 });
140                                 add(groupContainer);
141                             }
142                         }
143                     };
144                     nameContainer.add(groups);
145                     nameContainer.add(new Link("delete") {
146                         @Override
147                         public void onClick() {
148                             try {
149                                 _userAdmin.removeUser(user);
150                                 info("Deleted user '" + user + "'");
151                             }
152                             catch (UserMgtException e) {
153                                 error("Could not delete user '" + user + "'");
154                             }
155                         }
156                     });
157
158                     final PasswordTextField password = new PasswordTextField("password", new Model(""));
159                     Form changePassword = new Form("changePasswordForm") {
160                         @Override
161                         protected void onSubmit() {
162                             String value = password.getValue();
163                             if (value == null || value.length() == 0) {
164                                 return;
165                             }
166                             _userAdmin.setPassword(user, value);
167                             info("password for user '" + user + "' changed");
168                         }
169                     };
170                     changePassword.add(password);
171                     nameContainer.add(changePassword);
172                 }
173             }
174         };
175         add(user);
176
177         {
178             final TextField newUser = new TextField("user", new Model(""));
179             final PasswordTextField passwordNewUser = new PasswordTextField("password", new Model(""));
180
181             Form createUserForm = new Form("createUserForm") {
182                 @Override
183                 protected void onSubmit() {
184                     //System.out.println("Create user " + newUser.getValue() + " " + passwordNewUser.getValue() + " " +
185                     //        "'" + groupChoice.getValue() + "'");
186                     String user = newUser.getValue();
187                     String pw = passwordNewUser.getValue();
188
189                     //String group = groupChoice.getValue();
190                     //  if (!_userAdmin.getGroups().contains(group)) {
191                     //      info("No group selected");
192                     //      return;
193                     //  }
194                     if (user.length() == 0) {
195                         info("No username specified");
196                         return;
197                     }
198                     try {
199                         _userAdmin.createUser(user, pw);
200                         //    _userAdmin.addUserToGroup(user, group);
201                         info("User '" + user + "' created");
202                         newUser.setModel(new Model(""));
203                     }
204                     catch (UserMgtException e) {
205                         error("Problem creating user '" + user + "': " + e.getMessage());
206                     }
207                 }
208             };
209             add(createUserForm);
210             createUserForm.add(newUser);
211             createUserForm.add(passwordNewUser);
212             // createUserForm.add(groupChoice);
213         }
214
215         {
216             IModel<List<String>> users = new LoadableDetachableModel<List<String>>() {
217                 @Override
218                 protected List<String> load() {
219                     return _userAdmin.getUsers();
220                 }
221             };
222             final DropDownChoice userChoice =
223                     new DropDownChoice("userChoice", new Model(""), users, new MyChoiceRenderer());
224
225             IModel<List<String>> groups = new LoadableDetachableModel<List<String>>() {
226                 @Override
227                 protected List<String> load() {
228                     return _userAdmin.getGroups();
229                 }
230             };
231             final DropDownChoice groupChoice =
232                     new DropDownChoice("groupChoice", new Model(""), groups, new MyChoiceRenderer());
233
234             Form userToGroupForm = new Form("userToGroupForm") {
235                 @Override
236                 protected void onSubmit() {
237                     String user = userChoice.getValue();
238                     String group = groupChoice.getValue();
239                     if (!_userAdmin.getUsers().contains(user)) {
240                         return;
241                     }
242                     if (!_userAdmin.getGroups().contains(group)) {
243                         return;
244                     }
245                     if (_userAdmin.isInGroup(user, group)) {
246                         info("User '" + user + "' is already in group '" + group + "'");
247                         return;
248                     }
249
250                     try {
251                         _userAdmin.addUserToGroup(user, group);
252                         info("Added user '" + user + "' to group '" + group + "'");
253                     }
254                     catch (UserMgtException e) {
255                         error("Could not add user '" + user + "' to group '" + group + "': " + e.getMessage());
256                     }
257                 }
258
259                 ;
260             };
261             userToGroupForm.add(userChoice);
262             userToGroupForm.add(groupChoice);
263             add(userToGroupForm);
264         }
265     }
266
267     @Override
268     protected boolean isAdminPage() {
269         return true;
270     }
271
272     private static class MyChoiceRenderer implements IChoiceRenderer {
273
274         @Override
275         public Object getDisplayValue(Object object) {
276             return object.toString();
277         }
278
279         @Override
280         public String getIdValue(Object object, int index) {
281             if (index < 0) {
282                 return "";
283             }
284             return object.toString();
285         }
286     }
287 }