]> git.argeo.org Git - gpl/argeo-suite.git/blob - ui/people/PeopleEntryArea.java
Prepare next development cycle
[gpl/argeo-suite.git] / ui / people / PeopleEntryArea.java
1 package org.argeo.app.ui.people;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.RepositoryException;
8
9 import org.argeo.api.acr.Content;
10 import org.argeo.api.acr.ContentRepository;
11 import org.argeo.api.acr.ContentSession;
12 import org.argeo.api.cms.ux.CmsIcon;
13 import org.argeo.api.cms.ux.CmsView;
14 import org.argeo.app.ui.SuiteEvent;
15 import org.argeo.app.ui.SuiteIcon;
16 import org.argeo.app.ui.dialogs.NewUserWizard;
17 import org.argeo.cms.CmsUserManager;
18 import org.argeo.cms.acr.ContentUtils;
19 import org.argeo.cms.auth.CmsRole;
20 import org.argeo.cms.auth.CurrentUser;
21 import org.argeo.cms.auth.UserAdminUtils;
22 import org.argeo.cms.jcr.acr.JcrContent;
23 import org.argeo.cms.jface.dialog.CmsWizardDialog;
24 import org.argeo.cms.swt.CmsSwtTheme;
25 import org.argeo.cms.swt.CmsSwtUtils;
26 import org.argeo.cms.swt.Selected;
27 import org.argeo.cms.swt.acr.SwtUiProvider;
28 import org.argeo.cms.swt.widgets.SwtHierarchicalPart;
29 import org.argeo.cms.swt.widgets.SwtTabularPart;
30 import org.argeo.cms.ui.CmsUiProvider;
31 import org.argeo.cms.ux.widgets.AbstractHierarchicalPart;
32 import org.argeo.cms.ux.widgets.Column;
33 import org.argeo.cms.ux.widgets.DefaultTabularPart;
34 import org.argeo.cms.ux.widgets.HierarchicalPart;
35 import org.argeo.osgi.useradmin.UserDirectory;
36 import org.argeo.util.directory.HierarchyUnit;
37 import org.argeo.util.directory.ldap.IpaUtils;
38 import org.argeo.util.naming.LdapAttrs;
39 import org.argeo.util.naming.LdapObjs;
40 import org.eclipse.jface.window.Window;
41 import org.eclipse.jface.wizard.Wizard;
42 import org.eclipse.swt.SWT;
43 import org.eclipse.swt.custom.SashForm;
44 import org.eclipse.swt.layout.GridData;
45 import org.eclipse.swt.layout.GridLayout;
46 import org.eclipse.swt.widgets.Composite;
47 import org.eclipse.swt.widgets.Control;
48 import org.eclipse.swt.widgets.ToolBar;
49 import org.eclipse.swt.widgets.ToolItem;
50 import org.osgi.service.useradmin.Role;
51 import org.osgi.service.useradmin.User;
52
53 /** Entry to the admin area. */
54 public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
55
56 private CmsUserManager cmsUserManager;
57
58 private ContentRepository contentRepository;
59
60 @Override
61 public Control createUiPart(Composite parent, Content context) {
62 CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
63 CmsView cmsView = CmsSwtUtils.getCmsView(parent);
64 parent.setLayout(new GridLayout());
65
66 ContentSession contentSession = contentRepository.get();
67 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
68 CmsSwtUtils.fill(sashForm);
69
70 // MODEL
71 // List<UserDirectory> directories = new ArrayList<>();
72 // // List<User> orgs = cmsUserManager.listGroups(null, true, false);
73 // for (UserDirectory directory : cmsUserManager.getUserDirectories()) {
74 // if (CurrentUser.implies(CmsRole.userAdmin, directory.getContext())) {
75 // directories.add(directory);
76 // }
77 //
78 // }
79
80 // VIEW
81 HierarchicalPart<HierarchyUnit> hierarchyPart = new AbstractHierarchicalPart<>() {
82
83 @Override
84 public List<HierarchyUnit> getChildren(HierarchyUnit parent) {
85 List<HierarchyUnit> visible = new ArrayList<>();
86 if (parent != null) {
87 for (HierarchyUnit hu : parent.getDirectHierarchyUnits(true)) {
88 if (CurrentUser.implies(CmsRole.userAdmin, hu.getBase()) //
89 ) // IPA
90 {
91 visible.add(hu);
92 }
93 }
94 } else {
95 for (UserDirectory directory : cmsUserManager.getUserDirectories()) {
96 if (CurrentUser.implies(CmsRole.userAdmin, directory.getBase()) //
97 || CurrentUser.implies(CmsRole.userAdmin,
98 IpaUtils.IPA_ACCOUNTS_RDN + "," + directory.getBase())) // IPA
99 {
100 visible.add(directory);
101 }
102
103 }
104 }
105 return visible;
106 }
107
108 @Override
109 public String getText(HierarchyUnit model) {
110 return model.getHierarchyUnitName();
111 }
112
113 };
114 SwtHierarchicalPart<HierarchyUnit> directoriesView = new SwtHierarchicalPart<>(sashForm, SWT.NONE,
115 hierarchyPart);
116
117 DefaultTabularPart<HierarchyUnit, Content> usersPart = new DefaultTabularPart<>() {
118
119 @Override
120 protected List<Content> asList(HierarchyUnit hu) {
121 List<Content> roles = new ArrayList<>();
122 UserDirectory ud = (UserDirectory) hu.getDirectory();
123 if (ud.getRealm().isPresent()) {
124 for (Role r : ud.getHierarchyUnitRoles(ud, null, true)) {
125 Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
126 // if (r instanceof Person || r instanceof Organization)
127 if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(), LdapObjs.organization.qName()))
128 roles.add(content);
129 }
130
131 } else {
132 for (HierarchyUnit directChild : hu.getDirectHierarchyUnits(false)) {
133 if (!directChild.isFunctional()) {
134 for (Role r : ud.getHierarchyUnitRoles(directChild, null, false)) {
135 Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
136 // if (r instanceof Person || r instanceof Organization)
137 if (content.hasContentClass(LdapObjs.inetOrgPerson.qName(),
138 LdapObjs.organization.qName()))
139 roles.add(content);
140 }
141 }
142 }
143 }
144 return roles;
145 }
146 };
147 usersPart.addColumn(new Column<Content>() {
148
149 @Override
150 public String getText(Content role) {
151 if (role.isContentClass(LdapObjs.inetOrgPerson.qName()))
152 return UserAdminUtils.getUserDisplayName(role.adapt(User.class));
153 else if (role.isContentClass(LdapObjs.organization.qName()))
154 return role.attr(LdapAttrs.o.qName());
155 else if (role.isContentClass(LdapObjs.groupOfNames.qName()))
156 return role.attr(LdapAttrs.cn.qName());
157 else
158 return null;
159 }
160
161 @Override
162 public CmsIcon getIcon(Content role) {
163 if (role.isContentClass(LdapObjs.inetOrgPerson.qName()))
164 return SuiteIcon.person;
165 else if (role.isContentClass(LdapObjs.organization.qName()))
166 return SuiteIcon.organisation;
167 else if (role.isContentClass(LdapObjs.groupOfNames.qName()))
168 return SuiteIcon.group;
169 else
170 return null;
171 }
172
173 @Override
174 public int getWidth() {
175 return 300;
176 }
177
178 });
179 usersPart.addColumn((Column<Content>) (role) -> role.attr(LdapAttrs.mail.qName()));
180
181 SwtTabularPart<HierarchyUnit, Content> usersView = new SwtTabularPart<>(sashForm, SWT.NONE, usersPart);
182
183 // toolbar
184 Composite bottom = new Composite(parent, SWT.NONE);
185 bottom.setLayoutData(CmsSwtUtils.fillWidth());
186 bottom.setLayout(CmsSwtUtils.noSpaceGridLayout());
187 ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
188 bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
189 ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
190 deleteItem.setEnabled(false);
191 // CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
192 deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
193 ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
194 addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
195
196 sashForm.setWeights(new int[] { 30, 70 });
197
198 // CONTROLLER
199 hierarchyPart.onSelected((o) -> {
200 if (o instanceof HierarchyUnit) {
201 usersPart.setInput((HierarchyUnit) o);
202 }
203 });
204
205 usersPart.onSelected((o) -> {
206 Content user = (Content) o;
207 if (user != null) {
208 cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(user));
209 deleteItem.setEnabled(true);
210 } else {
211 deleteItem.setEnabled(false);
212 }
213 });
214
215 usersPart.onAction((o) -> {
216 Content user = (Content) o;
217 if (user != null) {
218 cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(user));
219 }
220 });
221
222 addItem.addSelectionListener((Selected) (e) -> {
223 // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
224 Wizard wizard = new NewUserWizard(null);
225 CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
226 // WizardDialog dialog = new WizardDialog(shell, wizard);
227 if (dialog.open() == Window.OK) {
228 // TODO create
229 }
230 });
231
232 directoriesView.refresh();
233 // usersView.refresh();
234
235 return sashForm;
236 }
237
238 // static String getProperty(Role role, LdapAttrs attr) {
239 // Object value = role.getProperties().get(attr.name());
240 // return value != null ? value.toString() : null;
241 // }
242
243 // private boolean isOrganisation(Role role) {
244 // String[] objectClasses = role.getProperties().get(LdapAttrs.objectClasses.name()).toString().split("\\n");
245 // for (String objectClass : objectClasses) {
246 // if (LdapObjs.organization.name().equalsIgnoreCase(objectClass))
247 // return true;
248 // }
249 // return false;
250 // }
251
252 public void setCmsUserManager(CmsUserManager cmsUserManager) {
253 this.cmsUserManager = cmsUserManager;
254 }
255
256 @Override
257 public Control createUi(Composite parent, Node context) throws RepositoryException {
258 return createUiPart(parent, JcrContent.nodeToContent(context));
259 }
260
261 public void setContentRepository(ContentRepository contentRepository) {
262 this.contentRepository = contentRepository;
263 }
264
265 }