syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ilgro...@apache.org
Subject [27/27] syncope git commit: [SYNCOPE-119] Renaming Role to Group
Date Mon, 06 Apr 2015 16:14:23 GMT
[SYNCOPE-119] Renaming Role to Group


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/4095f1e8
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/4095f1e8
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/4095f1e8

Branch: refs/heads/SYNCOPE-119
Commit: 4095f1e84bc22e0f0253e1ccf0c4daeddd2c1b35
Parents: f76826f
Author: Francesco Chicchiriccò <ilgrosso@apache.org>
Authored: Mon Apr 6 18:13:31 2015 +0200
Committer: Francesco Chicchiriccò <ilgrosso@apache.org>
Committed: Mon Apr 6 18:13:31 2015 +0200

----------------------------------------------------------------------
 .../client/console/SyncopeApplication.java      |  12 +-
 .../client/console/commons/AttrLayoutType.java  |  12 +-
 .../client/console/commons/Constants.java       |  10 +-
 .../console/commons/GroupTreeBuilder.java       | 128 +++
 .../client/console/commons/RoleTreeBuilder.java | 116 ---
 .../client/console/commons/RoleUtils.java       |  36 -
 .../console/commons/status/StatusBean.java      |   4 +-
 .../console/commons/status/StatusUtils.java     |   4 +-
 .../client/console/pages/AbstractBasePage.java  |   4 +-
 .../pages/BulkActionResultModalPage.java        |   2 +-
 .../client/console/pages/Configuration.java     |   4 +-
 .../client/console/pages/GroupModalPage.java    | 164 ++++
 .../console/pages/GroupSelectModalPage.java     | 105 +++
 .../console/pages/GroupTemplateModalPage.java   |  50 ++
 .../syncope/client/console/pages/Groups.java    | 186 ++++
 .../console/pages/NotificationModalPage.java    |  38 +-
 .../client/console/pages/PolicyModalPage.java   |  47 +-
 .../console/pages/ProvisioningModalPage.java    |  11 +-
 .../client/console/pages/PushTaskModalPage.java |  28 +-
 .../console/pages/ReportletConfModalPage.java   |  18 +-
 .../client/console/pages/ResourceModalPage.java |   8 +-
 .../syncope/client/console/pages/Resources.java |   6 +-
 .../console/pages/ResultStatusModalPage.java    |  11 +-
 .../client/console/pages/RoleModalPage.java     | 162 ----
 .../console/pages/RoleSelectModalPage.java      | 105 ---
 .../console/pages/RoleTemplateModalPage.java    |  50 --
 .../syncope/client/console/pages/Roles.java     | 186 ----
 .../syncope/client/console/pages/Schema.java    |  16 +-
 .../client/console/pages/StatusModalPage.java   |  35 +-
 .../client/console/pages/UserModalPage.java     |   2 +-
 .../console/panels/AbstractSearchPanel.java     |  30 +-
 .../console/panels/AttrTemplatesPanel.java      |  46 +-
 .../client/console/panels/DerAttrsPanel.java    |  28 +-
 .../console/panels/GroupDetailsPanel.java       | 435 +++++++++
 .../client/console/panels/GroupPanel.java       | 187 ++++
 .../client/console/panels/GroupSearchPanel.java | 101 +++
 .../console/panels/GroupSearchResultPanel.java  | 172 ++++
 .../console/panels/GroupSecurityPanel.java      | 198 +++++
 .../console/panels/GroupSummaryPanel.java       | 153 ++++
 .../client/console/panels/GroupTabPanel.java    | 195 ++++
 .../client/console/panels/MembershipsPanel.java |  49 +-
 .../client/console/panels/PlainAttrsPanel.java  |  32 +-
 .../client/console/panels/PolicyBeanPanel.java  |  24 +-
 .../console/panels/ResourceMappingPanel.java    |  30 +-
 .../client/console/panels/ResourcesPanel.java   |  19 +-
 .../client/console/panels/RoleDetailsPanel.java | 435 ---------
 .../client/console/panels/RolePanel.java        | 187 ----
 .../client/console/panels/RoleSearchPanel.java  | 101 ---
 .../console/panels/RoleSearchResultPanel.java   | 172 ----
 .../console/panels/RoleSecurityPanel.java       | 198 -----
 .../client/console/panels/RoleSummaryPanel.java | 153 ----
 .../client/console/panels/RoleTabPanel.java     | 195 ----
 .../client/console/panels/SearchView.java       |   8 +-
 .../panels/SelectOnlyUserSearchResultPanel.java |   2 +-
 .../client/console/panels/StatusPanel.java      |  21 +-
 .../client/console/panels/SyncTasksPanel.java   |   9 +-
 .../client/console/panels/UserSearchPanel.java  |  20 +-
 .../client/console/panels/VirAttrsPanel.java    |  31 +-
 .../client/console/rest/GroupRestClient.java    | 184 ++++
 .../client/console/rest/ResourceRestClient.java |   2 +-
 .../client/console/rest/RoleRestClient.java     | 184 ----
 .../wicket/markup/html/form/ActionLink.java     |   4 +-
 .../markup/html/form/ActionLinksPanel.java      |  20 +-
 .../markup/html/form/BinaryFieldPanel.java      |   2 +-
 .../tree/DefaultMutableTreeNodeExpansion.java   |  20 +-
 .../wicket/markup/html/tree/TreeGroupPanel.java | 121 +++
 .../markup/html/tree/TreeGroupProvider.java     |  43 +
 .../wicket/markup/html/tree/TreeRolePanel.java  | 121 ---
 .../markup/html/tree/TreeRoleProvider.java      |  43 -
 .../resources/META-INF/resources/css/style.css  |   8 +-
 .../resources/img/actions/groups-icon.png       | Bin 0 -> 391 bytes
 .../resources/img/actions/roles-icon.png        | Bin 391 -> 0 bytes
 .../META-INF/resources/img/menu/groups.png      | Bin 0 -> 5020 bytes
 .../resources/img/menu/notsel/groups.png        | Bin 0 -> 5175 bytes
 .../resources/img/menu/notsel/roles.png         | Bin 5175 -> 0 bytes
 .../META-INF/resources/img/menu/roles.png       | Bin 5020 -> 0 bytes
 .../src/main/resources/authorizations.xml       |  12 +-
 .../src/main/resources/consoleContext.xml       |   2 +-
 .../console/SyncopeApplication.properties       |   2 +-
 .../console/SyncopeApplication_it.properties    |   2 +-
 .../console/SyncopeApplication_pt_BR.properties |   2 +-
 .../syncope/client/console/pages/BasePage.html  |   4 +-
 .../client/console/pages/Configuration.html     |  12 +-
 .../console/pages/Configuration.properties      |   4 +-
 .../console/pages/Configuration_it.properties   |   4 +-
 .../pages/Configuration_pt_BR.properties        |   4 +-
 .../client/console/pages/GroupModalPage.html    |  52 ++
 .../console/pages/GroupModalPage.properties     |  48 +
 .../console/pages/GroupModalPage_it.properties  |  50 ++
 .../pages/GroupModalPage_pt_BR.properties       |  48 +
 .../console/pages/GroupSelectModalPage.html     |  24 +
 .../syncope/client/console/pages/Groups.html    |  80 ++
 .../client/console/pages/Groups.properties      |  26 +
 .../client/console/pages/Groups_it.properties   |  26 +
 .../console/pages/Groups_pt_BR.properties       |  26 +
 .../pages/MembershipModalPage.properties        |   2 +-
 .../pages/MembershipModalPage_it.properties     |   2 +-
 .../pages/MembershipModalPage_pt_BR.properties  |   2 +-
 .../console/pages/NotificationModalPage.html    |  10 +-
 .../pages/NotificationModalPage.properties      |   6 +-
 .../pages/NotificationModalPage_it.properties   |   6 +-
 .../NotificationModalPage_pt_BR.properties      |   8 +-
 .../client/console/pages/PolicyModalPage.html   |   8 +-
 .../console/pages/PolicyModalPage.properties    |   6 +-
 .../console/pages/PolicyModalPage_it.properties |   6 +-
 .../pages/PolicyModalPage_pt_BR.properties      |   6 +-
 .../client/console/pages/PushTaskModalPage.html |   8 +-
 .../console/pages/PushTaskModalPage.properties  |   2 +-
 .../pages/PushTaskModalPage_it.properties       |   2 +-
 .../pages/PushTaskModalPage_pt_BR.properties    |   2 +-
 .../client/console/pages/ResourceModalPage.html |   6 +-
 .../console/pages/ResourceModalPage.properties  |   6 +-
 .../pages/ResourceModalPage_it.properties       |   6 +-
 .../pages/ResourceModalPage_pt_BR.properties    |   6 +-
 .../client/console/pages/RoleModalPage.html     |  52 --
 .../console/pages/RoleModalPage.properties      |  48 -
 .../console/pages/RoleModalPage_it.properties   |  50 --
 .../pages/RoleModalPage_pt_BR.properties        |  48 -
 .../console/pages/RoleSelectModalPage.html      |  22 -
 .../syncope/client/console/pages/Roles.html     |  80 --
 .../client/console/pages/Roles.properties       |  26 -
 .../client/console/pages/Roles_it.properties    |  26 -
 .../client/console/pages/Roles_pt_BR.properties |  26 -
 .../syncope/client/console/pages/Schema.html    |   6 +-
 .../client/console/pages/Schema.properties      |   2 +-
 .../client/console/pages/Schema_it.properties   |   2 +-
 .../console/pages/Schema_pt_BR.properties       |   2 +-
 .../console/pages/UserModalPage.properties      |   4 +-
 .../console/pages/UserModalPage_it.properties   |   4 +-
 .../pages/UserModalPage_pt_BR.properties        |   4 +-
 .../client/console/pages/WelcomePage.html       |   2 +-
 .../console/panels/AttrTemplatesPanel.html      |   6 +-
 .../console/panels/GroupDetailsPanel.html       | 107 +++
 .../console/panels/GroupDetailsPanel.properties |  22 +
 .../panels/GroupDetailsPanel_it.properties      |  22 +
 .../panels/GroupDetailsPanel_pt_BR.properties   |  22 +
 .../client/console/panels/GroupPanel.html       |  88 ++
 .../client/console/panels/GroupPanel.properties |  51 ++
 .../console/panels/GroupPanel_it.properties     |  53 ++
 .../console/panels/GroupPanel_pt_BR.properties  |  40 +
 .../console/panels/GroupSecurityPanel.html      |  66 ++
 .../panels/GroupSecurityPanel.properties        |  20 +
 .../panels/GroupSecurityPanel_it.properties     |  20 +
 .../panels/GroupSecurityPanel_pt_BR.properties  |  20 +
 .../console/panels/GroupSummaryPanel.html       |  39 +
 .../client/console/panels/GroupTabPanel.html    |  64 ++
 .../console/panels/GroupTabPanel.properties     |  27 +
 .../console/panels/GroupTabPanel_it.properties  |  27 +
 .../panels/GroupTabPanel_pt_BR.properties       |  27 +
 .../client/console/panels/MembershipsPanel.html |   6 +-
 .../console/panels/MembershipsPanel.properties  |   8 +-
 .../panels/MembershipsPanel_it.properties       |   8 +-
 .../panels/MembershipsPanel_pt_BR.properties    |   8 +-
 .../client/console/panels/RoleDetailsPanel.html | 107 ---
 .../console/panels/RoleDetailsPanel.properties  |  22 -
 .../panels/RoleDetailsPanel_it.properties       |  22 -
 .../panels/RoleDetailsPanel_pt_BR.properties    |  22 -
 .../client/console/panels/RolePanel.html        |  88 --
 .../client/console/panels/RolePanel.properties  |  51 --
 .../console/panels/RolePanel_it.properties      |  53 --
 .../console/panels/RolePanel_pt_BR.properties   |  40 -
 .../console/panels/RoleSecurityPanel.html       |  66 --
 .../console/panels/RoleSecurityPanel.properties |  20 -
 .../panels/RoleSecurityPanel_it.properties      |  20 -
 .../panels/RoleSecurityPanel_pt_BR.properties   |  20 -
 .../client/console/panels/RoleSummaryPanel.html |  39 -
 .../client/console/panels/RoleTabPanel.html     |  64 --
 .../console/panels/RoleTabPanel.properties      |  27 -
 .../console/panels/RoleTabPanel_it.properties   |  27 -
 .../panels/RoleTabPanel_pt_BR.properties        |  27 -
 .../markup/html/form/ActionLinksPanel.html      |  12 +-
 .../wicket/markup/html/tree/TreeGroupPanel.html |  25 +
 .../wicket/markup/html/tree/TreeRolePanel.html  |  23 -
 .../syncope/client/lib/SyncopeClient.java       |  10 +-
 .../syncope/common/lib/AbstractBaseBean.java    |   4 +-
 .../common/lib/AttributableOperations.java      |  62 +-
 .../lib/SyncopeClientCompositeException.java    |  10 +-
 .../common/lib/SyncopeClientException.java      |  12 +-
 .../syncope/common/lib/SyncopeConstants.java    |   8 +-
 .../lib/annotation/FormAttributeField.java      |   2 +-
 .../apache/syncope/common/lib/mod/AttrMod.java  |  11 +-
 .../apache/syncope/common/lib/mod/GroupMod.java | 300 +++++++
 .../syncope/common/lib/mod/MembershipMod.java   |  12 +-
 .../syncope/common/lib/mod/ReferenceMod.java    |   5 +-
 .../common/lib/mod/ResourceAssociationMod.java  |   4 +-
 .../apache/syncope/common/lib/mod/RoleMod.java  | 300 -------
 .../syncope/common/lib/mod/StatusMod.java       |   2 +-
 .../lib/report/AbstractReportletConf.java       |   3 +-
 .../report/AbstractSubjectReportletConf.java    |  84 ++
 .../common/lib/report/GroupReportletConf.java   |  66 ++
 .../common/lib/report/RoleReportletConf.java    | 109 ---
 .../common/lib/report/StaticReportletConf.java  |  10 +-
 .../common/lib/report/UserReportletConf.java    |  45 +-
 .../AbstractFiqlSearchConditionBuilder.java     | 112 +++
 .../search/GroupFiqlSearchConditionBuilder.java |  90 ++
 .../common/lib/search/GroupProperty.java        |  29 +
 .../search/RoleFiqlSearchConditionBuilder.java  |  90 --
 .../syncope/common/lib/search/RoleProperty.java |  29 -
 .../common/lib/search/SearchableFields.java     |  12 +-
 .../syncope/common/lib/search/SpecialAttr.java  |   2 +-
 .../SyncopeFiqlSearchConditionBuilder.java      | 110 ---
 .../common/lib/search/SyncopeProperty.java      |   4 +-
 .../search/UserFiqlSearchConditionBuilder.java  |  24 +-
 .../syncope/common/lib/search/UserProperty.java |   4 +-
 .../syncope/common/lib/to/AbstractExecTO.java   |  34 +-
 .../syncope/common/lib/to/AbstractPolicyTO.java |  14 +-
 .../lib/to/AbstractProvisioningTaskTO.java      |  12 +-
 .../common/lib/to/AbstractStartEndBean.java     |  57 ++
 .../syncope/common/lib/to/AbstractTaskTO.java   |  32 +-
 .../syncope/common/lib/to/BulkActionResult.java |   2 +
 .../syncope/common/lib/to/ConnBundleTO.java     |   2 +-
 .../common/lib/to/ConnIdObjectClassTO.java      |   6 +-
 .../syncope/common/lib/to/EventCategoryTO.java  |   7 +-
 .../apache/syncope/common/lib/to/GroupTO.java   | 258 ++++++
 .../apache/syncope/common/lib/to/MappingTO.java |   2 +-
 .../syncope/common/lib/to/MembershipTO.java     |  20 +-
 .../syncope/common/lib/to/NotificationTO.java   |  12 +-
 .../common/lib/to/NotificationTaskTO.java       |   2 +-
 .../syncope/common/lib/to/PasswordPolicyTO.java |   2 +-
 .../syncope/common/lib/to/PushTaskTO.java       |  10 +-
 .../syncope/common/lib/to/ReportExecTO.java     |   2 +-
 .../apache/syncope/common/lib/to/ReportTO.java  |  33 +-
 .../syncope/common/lib/to/ResourceTO.java       |  15 +-
 .../apache/syncope/common/lib/to/RoleTO.java    | 258 ------
 .../syncope/common/lib/to/SchedTaskTO.java      |   3 +
 .../syncope/common/lib/to/SyncTaskTO.java       |  12 +-
 .../apache/syncope/common/lib/to/SyncopeTO.java |  20 +-
 .../apache/syncope/common/lib/to/UserTO.java    |   2 +-
 .../syncope/common/lib/to/WorkflowFormTO.java   |   2 +-
 .../common/lib/types/AbstractPolicySpec.java    |  83 ++
 .../common/lib/types/AccountPolicySpec.java     |  69 +-
 .../common/lib/types/AttrSchemaType.java        |   2 +-
 .../common/lib/types/AttributableType.java      |   2 +-
 .../syncope/common/lib/types/AuditElements.java |   3 -
 .../common/lib/types/AuditLoggerName.java       |  35 +-
 .../common/lib/types/CipherAlgorithm.java       |   4 +-
 .../common/lib/types/ClientExceptionType.java   |   8 +-
 .../common/lib/types/EntityViolationType.java   |   8 +-
 .../common/lib/types/IntMappingType.java        |  52 +-
 .../common/lib/types/PasswordPolicySpec.java    |  69 +-
 .../types/ResourceAssociationActionType.java    |   6 +-
 .../types/ResourceDeassociationActionType.java  |   6 +-
 .../syncope/common/lib/types/SubjectType.java   |   4 +-
 .../common/lib/types/SyncPolicySpec.java        |  24 +-
 common/pom.xml                                  |   4 +
 .../common/rest/api/service/GroupService.java   | 312 +++++++
 .../common/rest/api/service/JAXRSService.java   |  16 +-
 .../rest/api/service/ResourceService.java       |  10 +-
 .../common/rest/api/service/RoleService.java    | 312 -------
 .../rest/api/service/WorkflowService.java       |   6 +-
 .../syncope/core/logic/ConfigurationLogic.java  |   6 +-
 .../apache/syncope/core/logic/GroupLogic.java   | 405 +++++++++
 .../syncope/core/logic/ResourceLogic.java       |   6 +-
 .../apache/syncope/core/logic/RoleLogic.java    | 405 ---------
 .../apache/syncope/core/logic/SyncopeLogic.java |  12 +-
 .../apache/syncope/core/logic/UserLogic.java    |  45 +-
 .../syncope/core/logic/WorkflowLogic.java       |  16 +-
 .../core/logic/report/GroupReportlet.java       | 328 +++++++
 .../core/logic/report/RoleReportlet.java        | 327 -------
 .../core/logic/report/UserReportlet.java        |  28 +-
 .../resources/report/groupReportlet2csv.xsl     | 118 +++
 .../main/resources/report/groupReportlet2fo.xsl | 228 +++++
 .../resources/report/groupReportlet2html.xsl    | 196 ++++
 .../src/main/resources/report/report2csv.xsl    |   4 +-
 .../src/main/resources/report/report2fo.xsl     |   4 +-
 .../src/main/resources/report/report2html.xsl   |   4 +-
 .../main/resources/report/roleReportlet2csv.xsl | 118 ---
 .../main/resources/report/roleReportlet2fo.xsl  | 228 -----
 .../resources/report/roleReportlet2html.xsl     | 196 ----
 .../main/resources/report/userReportlet2csv.xsl |   6 +-
 .../main/resources/report/userReportlet2fo.xsl  |  16 +-
 .../resources/report/userReportlet2html.xsl     |  16 +-
 .../syncope/core/logic/NotificationTest.java    |  52 +-
 .../apache/syncope/core/misc/AuditManager.java  |  18 +-
 .../syncope/core/misc/ConnObjectUtil.java       | 146 ++-
 .../apache/syncope/core/misc/MappingUtil.java   |  94 +-
 .../core/misc/jexl/EmptyClassLoader.java        |   2 +-
 .../apache/syncope/core/misc/jexl/JexlUtil.java |  20 +-
 .../core/misc/policy/AccountPolicyEnforcer.java |   4 +-
 .../misc/policy/PasswordPolicyEnforcer.java     |   4 +-
 .../core/misc/policy/PolicyEnforcer.java        |   5 +-
 .../core/misc/search/SearchCondConverter.java   |   4 +-
 .../core/misc/search/SearchCondVisitor.java     |   8 +-
 .../core/misc/security/AuthContextUtil.java     |  10 +-
 .../syncope/core/misc/security/Encryptor.java   |  68 +-
 .../core/misc/security/PasswordGenerator.java   |  16 +-
 .../core/misc/security/SecureRandomUtil.java    |   2 +-
 .../security/SyncopeAuthenticationProvider.java |  23 +-
 .../security/SyncopeUserDetailsService.java     |  41 +-
 .../security/UnauthorizedGroupException.java    |  42 +
 .../security/UnauthorizedRoleException.java     |  42 -
 .../serialization/AttributeDeserializer.java    |   3 +-
 .../misc/serialization/AttributeSerializer.java |   7 +-
 .../GuardedStringDeserializer.java              |   3 +-
 .../serialization/GuardedStringSerializer.java  |   3 +-
 .../serialization/SyncTokenDeserializer.java    |   3 +-
 .../misc/serialization/SyncTokenSerializer.java |   3 +-
 .../serialization/UnwrappedObjectMapper.java    |  10 +-
 .../misc/spring/ApplicationContextProvider.java |   8 +-
 .../syncope/core/misc/spring/BeanUtils.java     |  20 +-
 .../misc/src/main/resources/security.properties |   3 +-
 .../misc/search/SearchCondConverterTest.java    |  12 +-
 .../persistence/api/GroupEntitlementUtil.java   |  88 ++
 .../persistence/api/RoleEntitlementUtil.java    |  88 --
 .../validation/InvalidEntityException.java      |   2 +-
 .../InvalidPlainAttrValueException.java         |   2 +-
 .../api/attrvalue/validation/Validator.java     |   3 +-
 .../persistence/api/dao/ConnInstanceDAO.java    |   3 +-
 .../core/persistence/api/dao/DerAttrDAO.java    |   3 +-
 .../core/persistence/api/dao/DerSchemaDAO.java  |   3 +-
 .../persistence/api/dao/EntitlementDAO.java     |   7 +-
 .../api/dao/ExternalResourceDAO.java            |   3 +-
 .../core/persistence/api/dao/GroupDAO.java      |  91 ++
 .../core/persistence/api/dao/LoggerDAO.java     |   3 +-
 .../core/persistence/api/dao/MembershipDAO.java |   7 +-
 .../persistence/api/dao/NotificationDAO.java    |   3 +-
 .../persistence/api/dao/PlainAttrValueDAO.java  |   3 +-
 .../persistence/api/dao/PlainSchemaDAO.java     |   3 +-
 .../core/persistence/api/dao/ReportDAO.java     |   3 +-
 .../core/persistence/api/dao/ReportExecDAO.java |   3 +-
 .../core/persistence/api/dao/RoleDAO.java       |  92 --
 .../api/dao/SecurityQuestionDAO.java            |   3 +-
 .../persistence/api/dao/SubjectSearchDAO.java   |  47 +-
 .../core/persistence/api/dao/TaskDAO.java       |   3 +-
 .../core/persistence/api/dao/TaskExecDAO.java   |   5 +-
 .../core/persistence/api/dao/UserDAO.java       |   9 +-
 .../core/persistence/api/dao/VirAttrDAO.java    |   3 +-
 .../core/persistence/api/dao/VirSchemaDAO.java  |   3 +-
 .../api/dao/search/MembershipCond.java          |  16 +-
 .../persistence/api/dao/search/SubjectCond.java |   1 +
 .../persistence/api/entity/AttrTemplate.java    |   6 +-
 .../api/entity/ExternalResource.java            |   6 +-
 .../persistence/api/entity/Notification.java    |   4 +-
 .../core/persistence/api/entity/PlainAttr.java  |   3 +-
 .../persistence/api/entity/PlainAttrValue.java  |   3 +-
 .../persistence/api/entity/group/GDerAttr.java  |  34 +
 .../api/entity/group/GDerAttrTemplate.java      |  25 +
 .../api/entity/group/GDerSchema.java            |  25 +
 .../persistence/api/entity/group/GMapping.java  |  25 +
 .../api/entity/group/GMappingItem.java          |  29 +
 .../api/entity/group/GPlainAttr.java            |  42 +
 .../api/entity/group/GPlainAttrTemplate.java    |  25 +
 .../api/entity/group/GPlainAttrUniqueValue.java |  31 +
 .../api/entity/group/GPlainAttrValue.java       |  28 +
 .../api/entity/group/GPlainSchema.java          |  25 +
 .../persistence/api/entity/group/GVirAttr.java  |  34 +
 .../api/entity/group/GVirAttrTemplate.java      |  25 +
 .../api/entity/group/GVirSchema.java            |  25 +
 .../persistence/api/entity/group/Group.java     | 168 ++++
 .../api/entity/membership/Membership.java       |   6 +-
 .../persistence/api/entity/role/RDerAttr.java   |  34 -
 .../api/entity/role/RDerAttrTemplate.java       |  25 -
 .../persistence/api/entity/role/RDerSchema.java |  25 -
 .../persistence/api/entity/role/RMapping.java   |  25 -
 .../api/entity/role/RMappingItem.java           |  29 -
 .../persistence/api/entity/role/RPlainAttr.java |  42 -
 .../api/entity/role/RPlainAttrTemplate.java     |  25 -
 .../api/entity/role/RPlainAttrUniqueValue.java  |  31 -
 .../api/entity/role/RPlainAttrValue.java        |  28 -
 .../api/entity/role/RPlainSchema.java           |  25 -
 .../persistence/api/entity/role/RVirAttr.java   |  34 -
 .../api/entity/role/RVirAttrTemplate.java       |  25 -
 .../persistence/api/entity/role/RVirSchema.java |  25 -
 .../core/persistence/api/entity/role/Role.java  | 168 ----
 .../persistence/api/entity/task/PushTask.java   |   4 +-
 .../persistence/api/entity/task/SyncTask.java   |   6 +-
 .../core/persistence/api/entity/user/User.java  |   8 +-
 .../jpa/content/XMLContentExporter.java         |   2 +-
 .../persistence/jpa/dao/AbstractSubjectDAO.java |   6 +-
 .../persistence/jpa/dao/JPAAttrTemplateDAO.java |  24 +-
 .../core/persistence/jpa/dao/JPADerAttrDAO.java |   8 +-
 .../persistence/jpa/dao/JPADerSchemaDAO.java    |   8 +-
 .../persistence/jpa/dao/JPAEntitlementDAO.java  |  24 +-
 .../jpa/dao/JPAExternalResourceDAO.java         |  24 +-
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 579 ++++++++++++
 .../persistence/jpa/dao/JPAMembershipDAO.java   |  11 +-
 .../persistence/jpa/dao/JPAPlainAttrDAO.java    |   8 +-
 .../jpa/dao/JPAPlainAttrValueDAO.java           |  16 +-
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java  |  18 +-
 .../core/persistence/jpa/dao/JPARoleDAO.java    | 584 ------------
 .../jpa/dao/JPASubjectSearchDAO.java            |  74 +-
 .../core/persistence/jpa/dao/JPAUserDAO.java    |  38 +-
 .../core/persistence/jpa/dao/JPAVirAttrDAO.java |   8 +-
 .../persistence/jpa/dao/JPAVirSchemaDAO.java    |   8 +-
 .../core/persistence/jpa/dao/SearchSupport.java |   8 +-
 .../persistence/jpa/entity/AbstractMapping.java |   2 +-
 .../jpa/entity/AbstractMappingItem.java         |  10 +-
 .../jpa/entity/JPAAttributableUtil.java         | 152 ++--
 .../jpa/entity/JPAEntityFactory.java            | 112 +--
 .../jpa/entity/JPAExternalResource.java         |  18 +-
 .../persistence/jpa/entity/JPANotification.java |  10 +-
 .../jpa/entity/JPAttributableUtilFactory.java   |   8 +-
 .../jpa/entity/group/JPAGDerAttr.java           |  82 ++
 .../jpa/entity/group/JPAGDerAttrTemplate.java   |  66 ++
 .../jpa/entity/group/JPAGDerSchema.java         |  34 +
 .../jpa/entity/group/JPAGMapping.java           | 103 +++
 .../jpa/entity/group/JPAGMappingItem.java       |  58 ++
 .../jpa/entity/group/JPAGPlainAttr.java         | 140 +++
 .../jpa/entity/group/JPAGPlainAttrTemplate.java |  75 ++
 .../entity/group/JPAGPlainAttrUniqueValue.java  |  78 ++
 .../jpa/entity/group/JPAGPlainAttrValue.java    |  64 ++
 .../jpa/entity/group/JPAGPlainSchema.java       |  36 +
 .../jpa/entity/group/JPAGVirAttr.java           |  82 ++
 .../jpa/entity/group/JPAGVirAttrTemplate.java   |  66 ++
 .../jpa/entity/group/JPAGVirSchema.java         |  36 +
 .../persistence/jpa/entity/group/JPAGroup.java  | 593 +++++++++++++
 .../jpa/entity/membership/JPAMDerAttr.java      |   2 +-
 .../entity/membership/JPAMDerAttrTemplate.java  |  14 +-
 .../jpa/entity/membership/JPAMPlainAttr.java    |   2 +-
 .../membership/JPAMPlainAttrTemplate.java       |  14 +-
 .../jpa/entity/membership/JPAMVirAttr.java      |   2 +-
 .../entity/membership/JPAMVirAttrTemplate.java  |  14 +-
 .../jpa/entity/membership/JPAMembership.java    |  30 +-
 .../jpa/entity/role/JPARDerAttr.java            |  82 --
 .../jpa/entity/role/JPARDerAttrTemplate.java    |  66 --
 .../jpa/entity/role/JPARDerSchema.java          |  34 -
 .../jpa/entity/role/JPARMapping.java            | 103 ---
 .../jpa/entity/role/JPARMappingItem.java        |  58 --
 .../jpa/entity/role/JPARPlainAttr.java          | 140 ---
 .../jpa/entity/role/JPARPlainAttrTemplate.java  |  75 --
 .../entity/role/JPARPlainAttrUniqueValue.java   |  78 --
 .../jpa/entity/role/JPARPlainAttrValue.java     |  64 --
 .../jpa/entity/role/JPARPlainSchema.java        |  36 -
 .../jpa/entity/role/JPARVirAttr.java            |  82 --
 .../jpa/entity/role/JPARVirAttrTemplate.java    |  66 --
 .../jpa/entity/role/JPARVirSchema.java          |  36 -
 .../persistence/jpa/entity/role/JPARole.java    | 593 -------------
 .../jpa/entity/task/JPAPushTask.java            |  10 +-
 .../jpa/entity/task/JPASyncTask.java            |  14 +-
 .../persistence/jpa/entity/user/JPAUser.java    |  28 +-
 .../entity/ExternalResourceValidator.java       |   6 +-
 .../jpa/validation/entity/GroupCheck.java       |  41 +
 .../jpa/validation/entity/GroupValidator.java   |  44 +
 .../entity/PlainAttrValueValidator.java         |   6 +-
 .../jpa/validation/entity/RoleCheck.java        |  41 -
 .../jpa/validation/entity/RoleValidator.java    |  44 -
 .../validation/entity/SchemaNameValidator.java  |  22 +-
 .../jpa/validation/entity/UserValidator.java    |  14 +-
 .../resources/META-INF/spring-orm-oracle.xml    |  40 +-
 .../resources/META-INF/spring-orm-sqlserver.xml |  40 +-
 .../src/main/resources/META-INF/spring-orm.xml  |  40 +-
 .../src/main/resources/content.xml              |  14 +-
 .../src/main/resources/indexes.xml              |  10 +-
 .../src/main/resources/views.xml                |  60 +-
 .../jpa/entity/AttributableSearchTest.java      | 115 ++-
 .../persistence/jpa/entity/DerAttrTest.java     |  52 +-
 .../persistence/jpa/entity/DerSchemaTest.java   |   8 +-
 .../core/persistence/jpa/entity/GroupTest.java  | 141 +++
 .../persistence/jpa/entity/MembershipTest.java  |  10 +-
 .../jpa/entity/NotificationTest.java            |   4 +-
 .../persistence/jpa/entity/PlainSchemaTest.java |  18 +-
 .../core/persistence/jpa/entity/PolicyTest.java |   4 +-
 .../persistence/jpa/entity/ResourceTest.java    |   8 +-
 .../core/persistence/jpa/entity/RoleTest.java   | 142 ---
 .../core/persistence/jpa/entity/UserTest.java   |  16 +-
 .../persistence/jpa/entity/VirAttrTest.java     |  20 +-
 .../persistence/jpa/entity/VirSchemaTest.java   |   8 +-
 .../persistence/jpa/relationship/AttrTest.java  |  32 +-
 .../relationship/AttributableSearchTest.java    |  18 +-
 .../jpa/relationship/EntitlementTest.java       |  14 +-
 .../persistence/jpa/relationship/GroupTest.java | 145 +++
 .../jpa/relationship/MembershipTest.java        |  16 +-
 .../jpa/relationship/ResourceTest.java          |  14 +-
 .../persistence/jpa/relationship/RoleTest.java  | 145 ---
 .../persistence/jpa/relationship/UserTest.java  |   6 +-
 .../src/test/resources/content.xml              | 294 +++---
 core/pom.xml                                    |   4 +
 .../api/AttributableTransformer.java            |   2 +-
 .../core/provisioning/api/Connector.java        |   8 +-
 .../api/GroupProvisioningManager.java           |  37 +
 .../api/RoleProvisioningManager.java            |  37 -
 .../core/provisioning/api/WorkflowResult.java   |   5 +-
 .../provisioning/api/cache/VirAttrCache.java    |  12 +-
 .../api/cache/VirAttrCacheValue.java            |   8 +-
 .../provisioning/api/data/GroupDataBinder.java  |  36 +
 .../provisioning/api/data/RoleDataBinder.java   |  36 -
 .../core/provisioning/api/job/TaskJob.java      |   2 +-
 .../api/notification/NotificationManager.java   |   5 +-
 .../api/propagation/PropagationManager.java     |  50 +-
 .../api/sync/GroupPushResultHandler.java        |  23 +
 .../api/sync/GroupSyncResultHandler.java        |  26 +
 .../api/sync/ProvisioningProfile.java           |   2 +-
 .../api/sync/ProvisioningResult.java            |   2 +-
 .../core/provisioning/api/sync/PushActions.java |  36 +-
 .../api/sync/RolePushResultHandler.java         |  23 -
 .../api/sync/RoleSyncResultHandler.java         |  26 -
 .../core/provisioning/api/sync/SyncActions.java |  48 +-
 .../java/DefaultGroupProvisioningManager.java   | 222 +++++
 .../java/DefaultRoleProvisioningManager.java    | 223 -----
 .../java/DefaultUserProvisioningManager.java    |   2 +-
 .../core/provisioning/java/VirAttrHandler.java  |  24 +-
 .../java/cache/MemoryVirAttrCache.java          |  14 +-
 .../data/AbstractAttributableDataBinder.java    |  66 +-
 .../java/data/GroupDataBinderImpl.java          | 411 +++++++++
 .../java/data/NotificationDataBinderImpl.java   |   4 +-
 .../java/data/PolicyDataBinderImpl.java         |  14 +-
 .../java/data/ResourceDataBinderImpl.java       |  20 +-
 .../java/data/RoleDataBinderImpl.java           | 411 ---------
 .../java/data/TaskDataBinderImpl.java           |  14 +-
 .../java/data/UserDataBinderImpl.java           |  52 +-
 .../notification/NotificationManagerImpl.java   |  46 +-
 .../AbstractPropagationTaskExecutor.java        |  28 +-
 .../LDAPMembershipPropagationActions.java       |  40 +-
 .../propagation/PropagationManagerImpl.java     | 183 ++--
 .../java/sync/AbstractProvisioningJob.java      |  40 +-
 .../java/sync/AbstractPushResultHandler.java    |   2 +-
 .../java/sync/AbstractSyncResultHandler.java    |   9 +-
 .../java/sync/AbstractSyncopeResultHandler.java |  18 +-
 .../java/sync/GroupPushResultHandlerImpl.java   | 162 ++++
 .../java/sync/GroupSyncResultHandlerImpl.java   | 168 ++++
 .../java/sync/LDAPMembershipSyncActions.java    |  75 +-
 .../provisioning/java/sync/PushJobImpl.java     |  47 +-
 .../java/sync/RolePushResultHandlerImpl.java    | 162 ----
 .../java/sync/RoleSyncResultHandlerImpl.java    | 169 ----
 .../provisioning/java/sync/SyncJobImpl.java     |  52 +-
 .../provisioning/java/sync/SyncUtilities.java   |  49 +-
 .../main/resources/mailTemplates/optin.html.vm  |   4 +-
 .../main/resources/mailTemplates/optin.txt.vm   |   4 +-
 .../src/main/resources/provisioning.properties  |   2 +-
 .../src/main/resources/provisioningContext.xml  |   2 +-
 .../rest/cxf/RestServiceExceptionMapper.java    |   6 +-
 .../core/rest/cxf/service/GroupServiceImpl.java | 227 +++++
 .../rest/cxf/service/ResourceServiceImpl.java   |   6 +-
 .../core/rest/cxf/service/RoleServiceImpl.java  | 227 -----
 .../rest/cxf/service/WorkflowServiceImpl.java   |   6 +-
 .../activiti/ActivitiUserWorkflowAdapter.java   |  10 +-
 .../workflow/activiti/SyncopeGroupManager.java  |  10 +-
 .../activiti/SyncopeGroupQueryImpl.java         |  31 +-
 .../workflow/activiti/SyncopeUserManager.java   |  10 +-
 .../workflow/activiti/SyncopeUserQueryImpl.java |  22 +-
 .../src/main/resources/workflow.properties      |   2 +-
 .../core/workflow/api/GroupWorkflowAdapter.java |  61 ++
 .../core/workflow/api/RoleWorkflowAdapter.java  |  71 --
 .../core/workflow/api/UserWorkflowAdapter.java  |  43 +-
 .../core/workflow/api/WorkflowAdapter.java      |  23 +-
 .../java/AbstractGroupWorkflowAdapter.java      |  66 ++
 .../java/AbstractRoleWorkflowAdapter.java       |  66 --
 .../java/DefaultGroupWorkflowAdapter.java       | 129 +++
 .../java/DefaultRoleWorkflowAdapter.java        | 129 ---
 .../src/main/resources/workflow.properties      |   2 +-
 .../src/main/resources/workflowContext.xml      |   2 +-
 deb/core/pom.xml                                |   2 +-
 deb/core/src/deb/control/conffiles              |   2 +-
 deb/core/src/deb/control/control                |   2 +-
 .../client/console/panels/CamelRoutePanel.java  |   8 +-
 .../console/rest/CamelRouteRestClient.java      |   2 +-
 .../core/logic/init/CamelRouteLoader.java       |   6 +-
 .../camel/CamelGroupProvisioningManager.java    | 175 ++++
 .../camel/CamelRoleProvisioningManager.java     | 174 ----
 .../processor/GroupCreateInSyncProcessor.java   |  72 ++
 .../camel/processor/GroupCreateProcessor.java   |  76 ++
 .../camel/processor/GroupDeleteProcessor.java   | 105 +++
 .../processor/GroupDeprovisionProcessor.java    |  78 ++
 .../camel/processor/GroupUpdateProcessor.java   |  71 ++
 .../processor/RoleCreateInSyncProcessor.java    |  72 --
 .../camel/processor/RoleCreateProcessor.java    |  77 --
 .../camel/processor/RoleDeleteProcessor.java    | 105 ---
 .../processor/RoleDeprovisionProcessor.java     |  78 --
 .../camel/processor/RoleUpdateProcessor.java    |  71 --
 .../camel/processor/UserUpdateProcessor.java    |   2 +-
 .../src/main/resources/groupRoutes.xml          | 140 +++
 .../src/main/resources/provisioning.properties  |   2 +-
 .../main/resources/provisioningCamelContext.xml |   6 +-
 .../src/main/resources/roleRoutes.xml           | 140 ---
 .../fit/buildtools/ApacheDSRootDseServlet.java  |   6 +-
 .../fit/console/reference/AccessITCase.java     |   7 +-
 .../console/reference/ConfigurationITCase.java  |  26 +-
 .../fit/console/reference/ConnectorITCase.java  |   2 +-
 .../fit/console/reference/GroupITCase.java      | 211 +++++
 .../fit/console/reference/RoleITCase.java       | 211 -----
 .../fit/console/reference/SchemaITCase.java     |   2 +-
 .../fit/core/reference/TestSyncActions.java     |   3 +
 .../fit/core/reference/TestSyncRule.java        |   5 +-
 .../fit/core/reference/package-info.java        |  19 +
 .../main/resources/all/provisioning.properties  |   2 +-
 .../src/main/resources/all/workflow.properties  |   2 +-
 .../src/main/resources/connid.properties        |   3 +-
 .../src/main/resources/provisioning.properties  |   2 +-
 .../src/main/resources/userWorkflow.bpmn20.xml  |   8 +-
 .../src/main/resources/workflow.properties      |   2 +-
 .../fit/core/reference/AbstractITCase.java      |  29 +-
 .../fit/core/reference/ActivitiDetector.java    |   4 +-
 .../core/reference/AuthenticationITCase.java    | 100 +--
 .../fit/core/reference/CamelDetector.java       |   4 +-
 .../fit/core/reference/CamelRouteITCase.java    |  12 +-
 .../fit/core/reference/ConfigurationITCase.java |  27 +-
 .../fit/core/reference/DerSchemaITCase.java     |  16 +-
 .../syncope/fit/core/reference/GroupITCase.java | 887 ++++++++++++++++++
 .../fit/core/reference/LoggerITCase.java        |   4 +-
 .../fit/core/reference/NotificationITCase.java  |   7 +-
 .../core/reference/NotificationTaskITCase.java  |   6 +-
 .../fit/core/reference/PlainSchemaITCase.java   |  28 +-
 .../fit/core/reference/PolicyITCase.java        |   8 +-
 .../fit/core/reference/PushTaskITCase.java      |  58 +-
 .../fit/core/reference/ResourceITCase.java      |  20 +-
 .../syncope/fit/core/reference/RoleITCase.java  | 889 -------------------
 .../fit/core/reference/SearchITCase.java        |  42 +-
 .../fit/core/reference/SyncTaskITCase.java      |  60 +-
 .../syncope/fit/core/reference/UserITCase.java  | 116 +--
 .../fit/core/reference/UserSelfITCase.java      |   4 +-
 .../fit/core/reference/UserWorkflowITCase.java  |  26 +-
 .../fit/core/reference/VirAttrITCase.java       |  86 +-
 .../fit/core/reference/VirSchemaITCase.java     |   6 +-
 .../fit/core/reference/WorkflowITCase.java      |  14 +-
 fit/core-reference/src/test/resources/test.csv  |  20 +-
 .../apache/syncope/installer/files/OrmXml.java  | 381 --------
 .../installer/utilities/FileSystemUtils.java    |   3 +-
 pom.xml                                         |  51 ++
 .../resources/org/apache/syncope/checkstyle.xml |  29 +-
 src/main/resources/org/apache/syncope/pmd.xml   |  55 +-
 src/site/xdoc/architecture.xml                  |   2 +-
 src/site/xdoc/features.xml                      |  10 +-
 src/site/xdoc/index.xml                         |   2 +-
 src/site/xdoc/security.xml                      |   2 +-
 614 files changed, 15911 insertions(+), 16394 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/SyncopeApplication.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeApplication.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeApplication.java
index ac44d43..a1e781d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeApplication.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeApplication.java
@@ -28,7 +28,7 @@ import org.apache.syncope.client.console.pages.Login;
 import org.apache.syncope.client.console.pages.Logout;
 import org.apache.syncope.client.console.pages.Reports;
 import org.apache.syncope.client.console.pages.Resources;
-import org.apache.syncope.client.console.pages.Roles;
+import org.apache.syncope.client.console.pages.Groups;
 import org.apache.syncope.client.console.pages.Schema;
 import org.apache.syncope.client.console.pages.Tasks;
 import org.apache.syncope.client.console.pages.Todo;
@@ -177,13 +177,13 @@ public class SyncopeApplication
                 ? IMG_NOTSEL
                 : StringUtils.EMPTY) + "users" + Constants.PNG_EXT)));
 
-        BookmarkablePageLink<Page> rolesLink = new BookmarkablePageLink<>("roles", Roles.class);
+        BookmarkablePageLink<Page> groupsLink = new BookmarkablePageLink<>("groups", Groups.class);
         MetaDataRoleAuthorizationStrategy.authorize(
-                rolesLink, WebPage.ENABLE, xmlRolesReader.getEntitlement("Roles", "list"));
-        page.add(rolesLink);
-        rolesLink.add(new Image("rolesIcon", new ContextRelativeResource(IMG_PREFIX + (notsel
+                groupsLink, WebPage.ENABLE, xmlRolesReader.getEntitlement("Groups", "list"));
+        page.add(groupsLink);
+        groupsLink.add(new Image("groupsIcon", new ContextRelativeResource(IMG_PREFIX + (notsel
                 ? IMG_NOTSEL
-                : StringUtils.EMPTY) + "roles" + Constants.PNG_EXT)));
+                : StringUtils.EMPTY) + "groups" + Constants.PNG_EXT)));
 
         BookmarkablePageLink<Page> resourcesLink = new BookmarkablePageLink<>("resources", Resources.class);
         MetaDataRoleAuthorizationStrategy.authorize(

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/AttrLayoutType.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/AttrLayoutType.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/AttrLayoutType.java
index 87cc062..26764b4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/AttrLayoutType.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/AttrLayoutType.java
@@ -26,8 +26,8 @@ public enum AttrLayoutType {
 
     ADMIN_USER("admin.user.layout", Mode.ADMIN, AttributableType.USER),
     SELF_USER("self.user.layout", Mode.SELF, AttributableType.USER),
-    ADMIN_ROLE("admin.role.layout", Mode.ADMIN, AttributableType.ROLE),
-    SELF_ROLE("self.role.layout", Mode.SELF, AttributableType.ROLE),
+    ADMIN_GROUP("admin.group.layout", Mode.ADMIN, AttributableType.GROUP),
+    SELF_GROUP("self.group.layout", Mode.SELF, AttributableType.GROUP),
     ADMIN_MEMBERSHIP("admin.membership.layout", Mode.ADMIN, AttributableType.MEMBERSHIP),
     SELF_MEMBERSHIP("self.membership.layout", Mode.SELF, AttributableType.MEMBERSHIP);
 
@@ -76,8 +76,8 @@ public enum AttrLayoutType {
                     result = ADMIN_MEMBERSHIP;
                     break;
 
-                case ROLE:
-                    result = ADMIN_ROLE;
+                case GROUP:
+                    result = ADMIN_GROUP;
                     break;
 
                 default:
@@ -92,8 +92,8 @@ public enum AttrLayoutType {
                     result = SELF_MEMBERSHIP;
                     break;
 
-                case ROLE:
-                    result = SELF_ROLE;
+                case GROUP:
+                    result = SELF_GROUP;
                     break;
 
                 default:

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 8f06874..0b8391a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -50,19 +50,19 @@ public final class Constants {
 
     public static final String PREF_CONF_SCHEMA_PAGINATOR_ROWS = "conf.schema.paginator.rows";
 
-    public static final String PREF_USER_SCHEMA_PAGINATOR_ROWS = "user.schema.paginator.rows";
+    public static final String PREF_USER_PLAIN_SCHEMA_PAGINATOR_ROWS = "user.schema.paginator.rows";
 
     public static final String PREF_USER_DER_SCHEMA_PAGINATOR_ROWS = "user.derived.schema.paginator.rows";
 
     public static final String PREF_USER_VIR_SCHEMA_PAGINATOR_ROWS = "user.virtual.schema.paginator.rows";
 
-    public static final String PREF_ROLE_SCHEMA_PAGINATOR_ROWS = "role.schema.paginator.rows";
+    public static final String PREF_GROUP_PLAIN_SCHEMA_PAGINATOR_ROWS = "group.schema.paginator.rows";
 
-    public static final String PREF_ROLE_DER_SCHEMA_PAGINATOR_ROWS = "role.derived.schema.paginator.rows";
+    public static final String PREF_GROUP_DER_SCHEMA_PAGINATOR_ROWS = "group.derived.schema.paginator.rows";
 
-    public static final String PREF_ROLE_VIR_SCHEMA_PAGINATOR_ROWS = "role.virtual.schema.paginator.rows";
+    public static final String PREF_GROUP_VIR_SCHEMA_PAGINATOR_ROWS = "group.virtual.schema.paginator.rows";
 
-    public static final String PREF_MEMBERSHIP_SCHEMA_PAGINATOR_ROWS = "membership.schema.paginator.rows";
+    public static final String PREF_MEMBERSHIP_PLAIN_SCHEMA_PAGINATOR_ROWS = "membership.schema.paginator.rows";
 
     public static final String PREF_MEMBERSHIP_DER_SCHEMA_PAGINATOR_ROWS = "membership.derived.aschema.paginator.rows";
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/GroupTreeBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/GroupTreeBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/GroupTreeBuilder.java
new file mode 100644
index 0000000..bc7d21b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/GroupTreeBuilder.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.commons;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeModel;
+import org.apache.syncope.client.console.rest.GroupRestClient;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class GroupTreeBuilder {
+
+    @Autowired
+    private GroupRestClient restClient;
+
+    private final GroupTOComparator comparator = new GroupTOComparator();
+
+    private List<GroupTO> allGroups;
+
+    private List<GroupTO> getChildGroups(final long parentGroupId, final List<GroupTO> groups) {
+        List<GroupTO> result = new ArrayList<>();
+        for (GroupTO group : groups) {
+            if (group.getParent() == parentGroupId) {
+                result.add(group);
+            }
+        }
+
+        Collections.sort(result, comparator);
+        return result;
+    }
+
+    private void populateSubtree(final DefaultMutableTreeNode subRoot, final List<GroupTO> groups) {
+        GroupTO group = (GroupTO) subRoot.getUserObject();
+
+        DefaultMutableTreeNode child;
+        for (GroupTO subGroupTO : getChildGroups(group.getKey(), groups)) {
+            child = new DefaultMutableTreeNode(subGroupTO);
+            subRoot.add(child);
+            populateSubtree(child, groups);
+        }
+    }
+
+    public List<GroupTO> getAllGroups() {
+        return this.allGroups;
+    }
+
+    public TreeModel build() {
+        this.allGroups = this.restClient.list();
+        return build(this.allGroups);
+    }
+
+    public TreeModel build(final List<GroupTO> groups) {
+        DefaultMutableTreeNode fakeroot = new DefaultMutableTreeNode(new FakeRootGroupTO());
+
+        populateSubtree(fakeroot, groups);
+
+        return new DefaultTreeModel(fakeroot);
+    }
+
+    public GroupTO findGroup(final long groupKey) {
+        GroupTO found = null;
+        if (getAllGroups() != null) {
+            for (GroupTO groupTO : getAllGroups()) {
+                if (groupTO.getKey() == groupKey) {
+                    found = groupTO;
+                }
+            }
+        }
+        return found;
+    }
+
+    private static class GroupTOComparator implements Comparator<GroupTO>, Serializable {
+
+        private static final long serialVersionUID = 7085057398406518811L;
+
+        @Override
+        public int compare(final GroupTO r1, final GroupTO r2) {
+            if (r1.getKey() < r2.getKey()) {
+                return -1;
+            }
+            if (r1.getKey() == r2.getKey()) {
+                return 0;
+            }
+
+            return 1;
+        }
+    }
+
+    private static class FakeRootGroupTO extends GroupTO {
+
+        private static final long serialVersionUID = 4839183625773925488L;
+
+        public FakeRootGroupTO() {
+            super();
+
+            setKey(0);
+            setName("");
+            setParent(-1);
+        }
+
+        @Override
+        public String getDisplayName() {
+            return "";
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleTreeBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleTreeBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleTreeBuilder.java
deleted file mode 100644
index c6ab6e4..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleTreeBuilder.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.commons;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeModel;
-import org.apache.syncope.client.console.rest.RoleRestClient;
-import org.apache.syncope.common.lib.to.RoleTO;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class RoleTreeBuilder {
-
-    @Autowired
-    private RoleRestClient restClient;
-
-    private final RoleTOComparator comparator = new RoleTOComparator();
-
-    private List<RoleTO> allRoles;
-
-    private List<RoleTO> getChildRoles(final long parentRoleId, final List<RoleTO> roles) {
-        List<RoleTO> result = new ArrayList<RoleTO>();
-        for (RoleTO role : roles) {
-            if (role.getParent() == parentRoleId) {
-                result.add(role);
-            }
-        }
-
-        Collections.sort(result, comparator);
-        return result;
-    }
-
-    private void populateSubtree(final DefaultMutableTreeNode subRoot, final List<RoleTO> roles) {
-        RoleTO role = (RoleTO) subRoot.getUserObject();
-
-        DefaultMutableTreeNode child;
-        for (RoleTO subRoleTO : getChildRoles(role.getKey(), roles)) {
-            child = new DefaultMutableTreeNode(subRoleTO);
-            subRoot.add(child);
-            populateSubtree(child, roles);
-        }
-    }
-
-    public List<RoleTO> getAllRoles() {
-        return this.allRoles;
-    }
-
-    public TreeModel build() {
-        this.allRoles = this.restClient.list();
-        return build(this.allRoles);
-    }
-
-    public TreeModel build(final List<RoleTO> roles) {
-        DefaultMutableTreeNode fakeroot = new DefaultMutableTreeNode(new FakeRootRoleTO());
-
-        populateSubtree(fakeroot, roles);
-
-        return new DefaultTreeModel(fakeroot);
-    }
-
-    private static class RoleTOComparator implements Comparator<RoleTO>, Serializable {
-
-        private static final long serialVersionUID = 7085057398406518811L;
-
-        @Override
-        public int compare(final RoleTO r1, final RoleTO r2) {
-            if (r1.getKey() < r2.getKey()) {
-                return -1;
-            }
-            if (r1.getKey() == r2.getKey()) {
-                return 0;
-            }
-
-            return 1;
-        }
-    }
-
-    private static class FakeRootRoleTO extends RoleTO {
-
-        private static final long serialVersionUID = 4839183625773925488L;
-
-        public FakeRootRoleTO() {
-            super();
-
-            setKey(0);
-            setName("");
-            setParent(-1);
-        }
-
-        @Override
-        public String getDisplayName() {
-            return "";
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleUtils.java
deleted file mode 100644
index 27e062b..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/RoleUtils.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.commons;
-
-import org.apache.syncope.common.lib.to.RoleTO;
-
-public class RoleUtils {
-
-    public static RoleTO findRole(final RoleTreeBuilder roleTreeBuilder, final long roleKey) {
-        RoleTO found = null;
-        if (roleTreeBuilder.getAllRoles() != null) {
-            for (RoleTO roleTO : roleTreeBuilder.getAllRoles()) {
-                if (roleTO.getKey()== roleKey) {
-                    found = roleTO;
-                }
-            }
-        }
-        return found;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
index 96ddd14..47d0086 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusBean.java
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.syncope.common.lib.to.AbstractAttributableTO;
-import org.apache.syncope.common.lib.to.RoleTO;
+import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
 
 public class StatusBean implements Serializable {
@@ -46,7 +46,7 @@ public class StatusBean implements Serializable {
     public StatusBean(final AbstractAttributableTO attributable, String resourceName) {
         this.attributableKey = attributable.getKey();
         this.attributableName = attributable instanceof UserTO
-                ? ((UserTO) attributable).getUsername() : ((RoleTO) attributable).getName();
+                ? ((UserTO) attributable).getUsername() : ((GroupTO) attributable).getName();
         this.resourceName = resourceName;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
index 3c0e56e..391d202 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
@@ -102,7 +102,7 @@ public class StatusUtils implements Serializable {
             final AbstractAttributableTO attributable,
             final String resourceName,
             final ConnObjectTO objectTO,
-            final boolean isRole) {
+            final boolean isGroup) {
 
         final StatusBean statusBean = new StatusBean(attributable, resourceName);
 
@@ -110,7 +110,7 @@ public class StatusUtils implements Serializable {
             final Boolean enabled = isEnabled(objectTO);
 
             final Status status = enabled == null
-                    ? (isRole ? Status.ACTIVE : Status.UNDEFINED)
+                    ? (isGroup ? Status.ACTIVE : Status.UNDEFINED)
                     : enabled
                             ? Status.ACTIVE
                             : Status.SUSPENDED;

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
index 4a32700..830f369 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/AbstractBasePage.java
@@ -25,7 +25,7 @@ import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.rest.ConfigurationRestClient;
 import org.apache.syncope.client.console.rest.ReportRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
-import org.apache.syncope.client.console.rest.RoleRestClient;
+import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.rest.TaskRestClient;
 import org.apache.syncope.client.console.rest.UserRestClient;
@@ -71,7 +71,7 @@ public class AbstractBasePage extends WebPage {
     protected UserSelfRestClient userSelfRestClient;
 
     @SpringBean
-    protected RoleRestClient roleRestClient;
+    protected GroupRestClient groupRestClient;
 
     @SpringBean
     protected TaskRestClient taskRestClient;

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
index 4ada6ba..b9b8968 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
@@ -35,7 +35,7 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 
 /**
- * Show user or role status after performing a successful operation.
+ * Show user or group status after performing a successful operation.
  */
 public class BulkActionResultModalPage<T, S> extends BaseModalPage {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/Configuration.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Configuration.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Configuration.java
index c6774f2..9f8c734 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Configuration.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Configuration.java
@@ -156,8 +156,8 @@ public class Configuration extends BasePage {
         // Layouts
         add(new LayoutsPanel("adminUserLayoutPanel", AttrLayoutType.ADMIN_USER, feedbackPanel));
         add(new LayoutsPanel("selfUserLayoutPanel", AttrLayoutType.SELF_USER, feedbackPanel));
-        add(new LayoutsPanel("adminRoleLayoutPanel", AttrLayoutType.ADMIN_ROLE, feedbackPanel));
-        add(new LayoutsPanel("selfRoleLayoutPanel", AttrLayoutType.SELF_ROLE, feedbackPanel));
+        add(new LayoutsPanel("adminGroupLayoutPanel", AttrLayoutType.ADMIN_GROUP, feedbackPanel));
+        add(new LayoutsPanel("selfGroupLayoutPanel", AttrLayoutType.SELF_GROUP, feedbackPanel));
         add(new LayoutsPanel("adminMembershipLayoutPanel", AttrLayoutType.ADMIN_MEMBERSHIP, feedbackPanel));
         add(new LayoutsPanel("selfMembershipLayoutPanel", AttrLayoutType.SELF_MEMBERSHIP, feedbackPanel));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
new file mode 100644
index 0000000..8b4daa9
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupModalPage.java
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.client.console.panels.GroupPanel;
+import org.apache.syncope.common.lib.AttributableOperations;
+import org.apache.syncope.common.lib.mod.GroupMod;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Modal window with Group form.
+ */
+public class GroupModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = -1732493223434085205L;
+
+    protected final PageReference pageRef;
+
+    protected final ModalWindow window;
+
+    protected final Mode mode;
+
+    protected final boolean createFlag;
+
+    protected final GroupPanel groupPanel;
+
+    protected GroupTO originalGroupTO;
+
+    public GroupModalPage(final PageReference pageRef, final ModalWindow window, final GroupTO groupTO) {
+        this(pageRef, window, groupTO, Mode.ADMIN);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public GroupModalPage(
+            final PageReference pageRef, final ModalWindow window, final GroupTO groupTO, final Mode mode) {
+        
+        super();
+
+        this.pageRef = pageRef;
+        this.window = window;
+        this.mode = mode;
+
+        this.createFlag = groupTO.getKey() == 0;
+        if (!createFlag) {
+            originalGroupTO = SerializationUtils.clone(groupTO);
+        }
+
+        final Form<GroupTO> form = new Form<GroupTO>("groupForm");
+        form.setMultiPart(true);
+
+        add(new Label("displayName", groupTO.getKey() == 0 ? "" : groupTO.getDisplayName()));
+
+        form.setModel(new CompoundPropertyModel<GroupTO>(groupTO));
+
+        this.groupPanel = new GroupPanel.Builder("groupPanel").
+                form(form).groupTO(groupTO).groupModalPageMode(mode).pageRef(getPageReference()).build();
+        form.add(groupPanel);
+
+        final AjaxButton submit = new IndicatingAjaxButton(SUBMIT, new ResourceModel(SUBMIT)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                try {
+                    submitAction(target, form);
+
+                    if (pageRef.getPage() instanceof BasePage) {
+                        ((BasePage) pageRef.getPage()).setModalResult(true);
+                    }
+
+                    closeAction(target, form);
+                } catch (Exception e) {
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    feedbackPanel.refresh(target);
+                }
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+                feedbackPanel.refresh(target);
+            }
+        };
+        form.add(submit);
+        form.setDefaultButton(submit);
+
+        final AjaxButton cancel = new IndicatingAjaxButton(CANCEL, new ResourceModel(CANCEL)) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                closeAction(target, form);
+            }
+        };
+        cancel.setDefaultFormProcessing(false);
+        form.add(cancel);
+
+        MetaDataRoleAuthorizationStrategy.authorize(submit, ENABLE, xmlRolesReader.getEntitlement("Groups",
+                createFlag
+                        ? "create"
+                        : "update"));
+
+        add(form);
+    }
+
+    protected void submitAction(final AjaxRequestTarget target, final Form<?> form) {
+        final GroupTO groupTO = (GroupTO) form.getDefaultModelObject();
+        final List<String> entitlementList = new ArrayList<String>(groupPanel.getSelectedEntitlements());
+        groupTO.getEntitlements().clear();
+        groupTO.getEntitlements().addAll(entitlementList);
+
+        GroupTO result;
+        if (createFlag) {
+            result = groupRestClient.create(groupTO);
+        } else {
+            GroupMod groupMod = AttributableOperations.diff(groupTO, originalGroupTO);
+
+            // update group just if it is changed
+            if (groupMod.isEmpty()) {
+                result = groupTO;
+            } else {
+                result = groupRestClient.update(originalGroupTO.getETagValue(), groupMod);
+            }
+        }
+
+        setResponsePage(new ResultStatusModalPage.Builder(window, result).build());
+    }
+
+    protected void closeAction(final AjaxRequestTarget target, final Form<?> form) {
+        window.close(target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
new file mode 100644
index 0000000..97b7abf
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupSelectModalPage.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import java.lang.reflect.Constructor;
+import javax.swing.tree.DefaultMutableTreeNode;
+import org.apache.syncope.client.console.commons.GroupTreeBuilder;
+import org.apache.syncope.client.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansion;
+import org.apache.syncope.client.console.wicket.markup.html.tree.DefaultMutableTreeNodeExpansionModel;
+import org.apache.syncope.client.console.wicket.markup.html.tree.TreeGroupProvider;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree;
+import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
+import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class GroupSelectModalPage extends BaseModalPage {
+
+    private static final long serialVersionUID = 2106489458494696439L;
+
+    @SpringBean
+    private GroupTreeBuilder groupTreeBuilder;
+
+    private final NestedTree<DefaultMutableTreeNode> tree;
+
+    public GroupSelectModalPage(final PageReference pageRef, final ModalWindow window, final Class<?> payloadClass) {
+        super();
+
+        final ITreeProvider<DefaultMutableTreeNode> treeProvider = new TreeGroupProvider(groupTreeBuilder, true);
+        final DefaultMutableTreeNodeExpansionModel treeModel = new DefaultMutableTreeNodeExpansionModel();
+
+        tree = new DefaultNestedTree<DefaultMutableTreeNode>("treeTable", treeProvider, treeModel) {
+
+            private static final long serialVersionUID = 7137658050662575546L;
+
+            @Override
+            protected Component newContentComponent(final String id, final IModel<DefaultMutableTreeNode> node) {
+                final DefaultMutableTreeNode treeNode = node.getObject();
+                final GroupTO groupTO = (GroupTO) treeNode.getUserObject();
+
+                return new Folder<DefaultMutableTreeNode>(id, GroupSelectModalPage.this.tree, node) {
+
+                    private static final long serialVersionUID = 9046323319920426493L;
+
+                    @Override
+                    protected boolean isClickable() {
+                        return true;
+                    }
+
+                    @Override
+                    protected IModel<?> newLabelModel(final IModel<DefaultMutableTreeNode> model) {
+                        return new Model<>(groupTO.getDisplayName());
+                    }
+
+                    @Override
+                    protected void onClick(final AjaxRequestTarget target) {
+                        super.onClick(target);
+
+                        try {
+                            Constructor<?> constructor = payloadClass.getConstructor(Long.class);
+                            Object payload = constructor.newInstance(groupTO.getKey());
+
+                            send(pageRef.getPage(), Broadcast.BREADTH, payload);
+                        } catch (Exception e) {
+                            LOG.error("Could not send group select event", e);
+                        }
+
+                        window.close(target);
+                    }
+                };
+            }
+        };
+        tree.add(new WindowsTheme());
+        tree.setOutputMarkupId(true);
+
+        DefaultMutableTreeNodeExpansion.get().expandAll();
+
+        this.add(tree);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
new file mode 100644
index 0000000..293e402
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupTemplateModalPage.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.SyncTaskTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.form.Form;
+
+public class GroupTemplateModalPage extends GroupModalPage {
+
+    private static final long serialVersionUID = -3849135555203409845L;
+
+    private final SyncTaskTO syncTaskTO;
+
+    public GroupTemplateModalPage(final PageReference callerPageRef, final ModalWindow window,
+            final SyncTaskTO syncTaskTO) {
+
+        super(callerPageRef, window, syncTaskTO.getGroupTemplate() == null
+                ? new GroupTO()
+                : syncTaskTO.getGroupTemplate(), Mode.TEMPLATE);
+
+        this.syncTaskTO = syncTaskTO;
+    }
+
+    @Override
+    protected void submitAction(final AjaxRequestTarget target, final Form form) {
+        syncTaskTO.setGroupTemplate((GroupTO) form.getModelObject());
+        taskRestClient.updateSyncTask(syncTaskTO);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/4095f1e8/client/console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
new file mode 100644
index 0000000..2e92940
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Groups.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.pages;
+
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.AbstractSearchResultPanel;
+import org.apache.syncope.client.console.panels.GroupSearchPanel;
+import org.apache.syncope.client.console.panels.GroupSearchResultPanel;
+import org.apache.syncope.client.console.panels.GroupSummaryPanel;
+import org.apache.syncope.client.console.rest.GroupRestClient;
+import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+import org.apache.syncope.client.console.wicket.markup.html.tree.TreeGroupPanel;
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+/**
+ * Groups WebPage.
+ */
+public class Groups extends BasePage {
+
+    private static final long serialVersionUID = -2147758241610831969L;
+
+    private static final int WIN_HEIGHT = 500;
+
+    private static final int WIN_WIDTH = 800;
+
+    @SpringBean
+    private GroupRestClient restClient;
+
+    private final ModalWindow editGroupWin;
+
+    private final WebMarkupContainer groupTabsContainer;
+
+    public Groups(final PageParameters parameters) {
+        super(parameters);
+
+        groupTabsContainer = new WebMarkupContainer("groupTabsContainer");
+        groupTabsContainer.setOutputMarkupId(true);
+        add(groupTabsContainer);
+
+        editGroupWin = new ModalWindow("editGroupWin");
+        editGroupWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
+        editGroupWin.setInitialHeight(WIN_HEIGHT);
+        editGroupWin.setInitialWidth(WIN_WIDTH);
+        editGroupWin.setCookieName("edit-group-modal");
+        add(editGroupWin);
+
+        final TreeGroupPanel treePanel = new TreeGroupPanel("treePanel");
+        treePanel.setOutputMarkupId(true);
+        groupTabsContainer.add(treePanel);
+
+        final GroupSummaryPanel summaryPanel = new GroupSummaryPanel.Builder("summaryPanel")
+                .window(editGroupWin).callerPageRef(Groups.this.getPageReference()).build();
+        groupTabsContainer.add(summaryPanel);
+
+        editGroupWin.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+            private static final long serialVersionUID = 8804221891699487139L;
+
+            @Override
+            public void onClose(final AjaxRequestTarget target) {
+                final GroupSummaryPanel summaryPanel = (GroupSummaryPanel) groupTabsContainer.get("summaryPanel");
+
+                final TreeNodeClickUpdate data = new TreeNodeClickUpdate(target,
+                        summaryPanel == null || summaryPanel.getSelectedNode() == null
+                        ? 0
+                        : summaryPanel.getSelectedNode().getKey());
+
+                send(getPage(), Broadcast.BREADTH, data);
+
+                if (modalResult) {
+                    getSession().info(getString(Constants.OPERATION_SUCCEEDED));
+                    feedbackPanel.refresh(target);
+                    modalResult = false;
+                }
+
+            }
+        });
+
+        final AbstractSearchResultPanel searchResult =
+                new GroupSearchResultPanel("searchResult", true, null, getPageReference(), restClient);
+        add(searchResult);
+
+        final Form searchForm = new Form("searchForm");
+        add(searchForm);
+
+        final GroupSearchPanel searchPanel = new GroupSearchPanel.Builder("searchPanel").build();
+        searchForm.add(searchPanel);
+
+        searchForm.add(new ClearIndicatingAjaxButton("search", new ResourceModel("search"), getPageReference()) {
+
+            private static final long serialVersionUID = -958724007591692537L;
+
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                final String fiql = searchPanel.buildFIQL();
+                LOG.debug("Node condition {}", fiql);
+
+                doSearch(target, fiql, searchResult);
+
+                Session.get().getFeedbackMessages().clear();
+                searchPanel.getSearchFeedback().refresh(target);
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+                searchPanel.getSearchFeedback().refresh(target);
+            }
+        });
+    }
+
+    private void doSearch(final AjaxRequestTarget target, final String fiql,
+            final AbstractSearchResultPanel resultsetPanel) {
+
+        if (fiql == null) {
+            error(getString(Constants.SEARCH_ERROR));
+            return;
+        }
+
+        resultsetPanel.search(fiql, target);
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        super.onEvent(event);
+
+        if (event.getPayload() instanceof TreeNodeClickUpdate) {
+            final TreeNodeClickUpdate update = (TreeNodeClickUpdate) event.getPayload();
+
+            final GroupSummaryPanel summaryPanel = new GroupSummaryPanel.Builder("summaryPanel")
+                    .window(editGroupWin).callerPageRef(Groups.this.getPageReference())
+                    .selectedNodeId(update.getSelectedNodeId()).build();
+
+            groupTabsContainer.addOrReplace(summaryPanel);
+            update.getTarget().add(groupTabsContainer);
+        }
+    }
+
+    public static class TreeNodeClickUpdate {
+
+        private final AjaxRequestTarget target;
+
+        private Long selectedNodeId;
+
+        public TreeNodeClickUpdate(final AjaxRequestTarget target, final Long selectedNodeId) {
+            this.target = target;
+            this.selectedNodeId = selectedNodeId;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+        public Long getSelectedNodeId() {
+            return selectedNodeId;
+        }
+
+        public void setSelectedNodeId(final Long selectedNodeId) {
+            this.selectedNodeId = selectedNodeId;
+        }
+    }
+}


Mime
View raw message