diff --git a/ccm-core/src/main/java/org/libreccm/security/Role.java b/ccm-core/src/main/java/org/libreccm/security/Role.java index 31c2f4e4b..bc5e00afc 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Role.java +++ b/ccm-core/src/main/java/org/libreccm/security/Role.java @@ -62,14 +62,29 @@ import javax.xml.bind.annotation.XmlRootElement; @NamedQuery(name = "Role.findByName", query = "SELECT r FROM Role r " + "WHERE r.name = :name"), + @NamedQuery( + name = "Role.count", + query = "SELECT COUNT(r) FROM Role r"), @NamedQuery( name = "Role.findAllOrderedByRoleName", query = "SELECT r FROM Role r ORDER BY r.name"), + @NamedQuery( + name = "Role.findAllOrderedByRoleNameLimit", + query = "SELECT r FROM Role r ORDER BY r.name "), + @NamedQuery( + name = "Role.findAllOrderedByRoleNameDesc", + query = "SELECT r FROM Role r ORDER BY r.name DESC"), @NamedQuery( name = "Role.searchByName", - query - = "SELECT r FROM Role r WHERE LOWER(r.name) LIKE CONCAT(LOWER(:name), '%') " - + "ORDER BY r.name ") + query = "SELECT r FROM Role r " + + "WHERE LOWER(r.name) LIKE CONCAT(LOWER(:name), '%') " + + "ORDER BY r.name "), + @NamedQuery( + name = "Role.searchByNameCount", + query = "SELECT COUNT(r.name) FROM Role r " + + "WHERE LOWER(r.name) LIKE CONCAT(LOWER(:name), '%') " + + "GROUP BY r.name " + + "ORDER BY r.name ") }) @NamedEntityGraphs({ @NamedEntityGraph( @@ -91,9 +106,9 @@ public class Role implements Serializable { private static final long serialVersionUID = -7121296514181469687L; public static final String ENTITY_GRPAH_WITH_MEMBERS - = "Role.withMembers"; + = "Role.withMembers"; public static final String ENTITY_GRPAH_WITH_PERMISSIONS - = "Role.withPermissions"; + = "Role.withPermissions"; @Id @Column(name = "ROLE_ID") diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java b/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java index 248962d91..fa7d76107 100644 --- a/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java +++ b/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java @@ -26,6 +26,7 @@ import javax.persistence.TypedQuery; import org.libreccm.core.AbstractEntityRepository; import org.libreccm.core.CoreConstants; +import javax.persistence.NoResultException; import javax.transaction.Transactional; /** @@ -49,6 +50,12 @@ public class RoleRepository extends AbstractEntityRepository { return entity.getRoleId() == 0; } + public long count() { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.count", Long.class); + return query.getSingleResult(); + } + /** * Finds a role a its name. * @@ -75,6 +82,15 @@ public class RoleRepository extends AbstractEntityRepository { return query.getResultList(); } + public List findAllOrderedByRole(final int maxResults, + final int firstResult) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.findAllOrderedByRoleName", Role.class); + query.setMaxResults(maxResults); + query.setFirstResult(firstResult); + return query.getResultList(); + } + public List searchByName(final String name) { final TypedQuery query = getEntityManager().createNamedQuery( "Role.searchByName", Role.class); @@ -82,6 +98,28 @@ public class RoleRepository extends AbstractEntityRepository { return query.getResultList(); } + public List searchByName(final String name, + final int maxResults, + final int firstResult) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.searchByName", Role.class); + query.setParameter("name", name); + query.setFirstResult(firstResult); + query.setMaxResults(maxResults); + return query.getResultList(); + } + + public long searchByNameCount(final String name) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.searchByNameCount", Long.class); + query.setParameter("name", name); + try { + return query.getSingleResult(); + } catch (NoResultException ex) { + return 0; + } + } + @AuthorizationRequired @RequiresPrivilege(CoreConstants.ADMIN_PRIVILEGE) @Transactional(Transactional.TxType.REQUIRED) @@ -89,7 +127,7 @@ public class RoleRepository extends AbstractEntityRepository { public void save(final Role role) { super.save(role); } - + @AuthorizationRequired @RequiresPrivilege(CoreConstants.ADMIN_PRIVILEGE) @Override @@ -98,14 +136,14 @@ public class RoleRepository extends AbstractEntityRepository { if (role == null) { throw new IllegalArgumentException("Can't delete null."); } - + final Role delete = getEntityManager().find(Role.class, role.getRoleId()); - + delete.getMemberships().forEach(m -> { getEntityManager().remove(m); }); - + getEntityManager().remove(delete); } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/ConfigurationController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoController.java similarity index 80% rename from ccm-core/src/main/java/org/libreccm/ui/admin/ConfigurationController.java rename to ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoController.java index 0d88ac81b..491ed31ab 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/ConfigurationController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoController.java @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.libreccm.ui.admin; +package org.libreccm.ui.admin.sysinfo; import org.xml.sax.SAXException; @@ -43,9 +43,9 @@ import javax.xml.transform.TransformerFactory; */ @RequestScoped @Named -public class ConfigurationController { +public class SysInfoController { - public List getSystemInformation() { + public List getSystemInformation() { final Properties properties = new Properties(); try (final InputStream stream = getClass().getResourceAsStream( @@ -61,67 +61,67 @@ public class ConfigurationController { throw new RuntimeException(ex); } - final List sysInfo = new ArrayList<>(); + final List sysInfo = new ArrayList<>(); properties.stringPropertyNames().forEach(propName -> sysInfo.add( - new ConfProperty(propName, + new SysInfoProperty(propName, properties.getProperty(propName)))); return sysInfo; } - public List getJavaSystemProperties() { + public List getJavaSystemProperties() { final Properties systemProperties = System.getProperties(); - final List javaSysProps = new ArrayList<>(); + final List javaSysProps = new ArrayList<>(); systemProperties.stringPropertyNames().forEach(propName -> javaSysProps - .add(new ConfProperty(propName, systemProperties.getProperty( + .add(new SysInfoProperty(propName, systemProperties.getProperty( propName)))); return javaSysProps; } - public List getXmlConfig() { - final List xmlProps = new ArrayList<>(); + public List getXmlConfig() { + final List xmlProps = new ArrayList<>(); final ResourceBundle texts = ResourceBundle.getBundle( "com.arsdigita.ui.admin.AdminResources"); - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_transformer_factory"), TransformerFactory.newInstance().getClass().getName())); try { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_transformer"), TransformerFactory.newInstance().newTransformer().getClass() .getName())); } catch (TransformerConfigurationException ex) { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_transformer"), "???")); } - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_document_builder_factory"), DocumentBuilderFactory.newInstance().getClass().getName())); try { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_document_builder"), DocumentBuilderFactory.newInstance().newDocumentBuilder() .getClass().getName())); } catch (ParserConfigurationException ex) { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.xml_document_builder"), "???")); } - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.sax_parser_factory"), SAXParserFactory.newInstance().getClass().getName())); try { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.sax_parser"), SAXParserFactory.newInstance().newSAXParser().getClass() .getName())); } catch (ParserConfigurationException | SAXException ex) { - xmlProps.add(new ConfProperty( + xmlProps.add(new SysInfoProperty( texts.getString("ui.admin.sysinfo.sax_parser"), "???")); } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/ConfProperty.java b/ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoProperty.java similarity index 89% rename from ccm-core/src/main/java/org/libreccm/ui/admin/ConfProperty.java rename to ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoProperty.java index 745e77962..059d79d57 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/ConfProperty.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/sysinfo/SysInfoProperty.java @@ -16,18 +16,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ -package org.libreccm.ui.admin; +package org.libreccm.ui.admin.sysinfo; /** * * @author Jens Pelzetter */ -public class ConfProperty { +public class SysInfoProperty { private final String name; private final String value; - public ConfProperty(final String name, final String value) { + public SysInfoProperty(final String name, final String value) { this.name = name; this.value = value; } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java new file mode 100644 index 000000000..ec65651c6 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2016 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.security.Role; +import org.libreccm.security.RoleRepository; +import org.primefaces.model.LazyDataModel; +import org.primefaces.model.SortOrder; + +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named +public class RolesController { + + @Inject + private RoleRepository roleRepo; + + private final LazyDataModel tableModel; + + public RolesController() { + tableModel = new RolesTableModel(); + } + + public LazyDataModel getTableModel() { + return tableModel; + } + + public List getRoles() { + return roleRepo.findAll(); + } + + private class RolesTableModel extends LazyDataModel { + + private static final long serialVersionUID = 8878060757439667086L; + + @Override + public List load(final int first, + final int pageSize, + final String sortField, + final SortOrder sortOrder, + final Map filters) { + final List roles; + if (filters.containsKey("name")) { + final String name = (String) filters.get("name"); + roles = roleRepo.searchByName(name, pageSize, first); + setRowCount((int) roleRepo.searchByNameCount(name)); + } else { + roles = roleRepo.findAllOrderedByRole(pageSize, first); + setRowCount((int) roleRepo.count()); + } + + return roles; + } + + } + +} diff --git a/ccm-core/src/main/resources/META-INF/resources/admin-jsf/admin.xhtml b/ccm-core/src/main/resources/META-INF/resources/admin-jsf/admin.xhtml index 7d3112e73..2734b6408 100644 --- a/ccm-core/src/main/resources/META-INF/resources/admin-jsf/admin.xhtml +++ b/ccm-core/src/main/resources/META-INF/resources/admin-jsf/admin.xhtml @@ -1,3 +1,4 @@ + - + LibreCCM Admin @@ -46,12 +47,14 @@ </h:form> </div> - <p:tabView id="admin-tabs" dynamic="true"> + <p:tabView dynamic="true" id="admin-tabs"> <p:tab title="#{texts['ui.admin.tab.applications']}"> <h:outputText value="Applications Placeholder" /> </p:tab> <p:tab title="#{texts['ui.admin.tab.users_groups_roles.title']}"> - <p:tabView id="user-groups-roles-tabs" orientation="left"> + <p:tabView dynamic="true" + id="user-groups-roles-tabs" + orientation="left"> <p:tab title="Users"> <h:outputText value="Users Placeholder" /> </p:tab> @@ -59,10 +62,32 @@ <h:outputText value="Groups Placeholder" /> </p:tab> <p:tab title="Roles"> - <h:outputText value="Roles Placeholder" /> + <!--<h:outputText value="Roles Placeholder" />--> + <!--<p:panel header="#{texts['ui.admin.tab.users_groups_roles.title']}">--> + <h:form> + <p:dataTable id="rolesTable" + lazy="true" + paginator="true" + rows="20" + rowsPerPageTemplate="20,50" + scrollable="true" + value="#{rolesController.tableModel}" + var="role"> + <f:facet name="header"> + <h:outputText value="#{texts['ui.admin.tab.users_groups_roles.title']}" /> + </f:facet> + + <p:column filterBy="#{role.name}" + headerText="#{texts['ui.admin.roles.table.name']}" + id="role-name"> + <h:outputText value="#{role.name}" /> + </p:column> + </p:dataTable> + </h:form> + <!--</p:panel>--> </p:tab> </p:tabView> - + </p:tab> <p:tab title="#{texts['ui.admin.tab.categories.title']}"> <h:outputText value="Categories Placeholder" /> @@ -74,7 +99,7 @@ <h:outputText value="Workflows Placeholder" /> </p:tab> <p:tab title="#{texts['ui.admin.tab.sysinfo.title']}"> - <p:dataTable value="#{configurationController.systemInformation}" + <p:dataTable value="#{sysInfoController.systemInformation}" var="prop"> <f:facet name="header"> <h:outputText value="#{texts['ui.admin.sysinfo.appinfo']}" /> @@ -86,8 +111,8 @@ <h:outputText value="#{prop.value}" /> </p:column> </p:dataTable> - - <p:dataTable value="#{configurationController.javaSystemProperties}" + + <p:dataTable value="#{sysInfoController.javaSystemProperties}" var="prop"> <f:facet name="header"> <h:outputText value="#{texts['ui.admin.sysinfo.java_system_properties']}" /> @@ -99,8 +124,8 @@ <h:outputText value="#{prop.value}" /> </p:column> </p:dataTable> - - <p:dataTable value="#{configurationController.xmlConfig}" + + <p:dataTable value="#{sysInfoController.xmlConfig}" var="prop"> <f:facet name="header"> <h:outputText value="#{texts['ui.admin.sysinfo.xml_config']}" />