You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/06/09 16:00:25 UTC
[4/4] syncope git commit: [SYNCOPE-1067] Management from Admin Console
[SYNCOPE-1067] Management from Admin Console
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/52bd7eb0
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/52bd7eb0
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/52bd7eb0
Branch: refs/heads/master
Commit: 52bd7eb0d8331b884e8b8cdf598670d1a03ccad1
Parents: f74ce5d
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jun 9 17:59:22 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jun 9 18:00:11 2017 +0200
----------------------------------------------------------------------
.../client/console/commons/Constants.java | 2 +
.../console/layout/AbstractAnyFormLayout.java | 10 +
.../console/layout/AnyObjectFormLayoutInfo.java | 10 -
.../console/layout/UserFormLayoutInfo.java | 10 -
.../console/notifications/TemplateModal.java | 4 +-
.../client/console/pages/Administration.java | 83 ++++++
.../syncope/client/console/pages/BasePage.java | 6 +-
.../syncope/client/console/pages/Roles.java | 52 ----
.../console/panels/DynRealmDirectoryPanel.java | 186 +++++++++++++
.../console/panels/DynRealmModalPanel.java | 109 ++++++++
.../console/panels/RoleDirectoryPanel.java | 2 +-
.../console/panels/SecurityQuestionsPanel.java | 4 +-
.../client/console/rest/DynRealmRestClient.java | 47 ++++
.../client/console/rest/RoleRestClient.java | 4 -
.../html/form/ActionLinksTogglePanel.java | 8 +-
.../wicket/markup/html/form/ActionPanel.java | 2 +-
.../console/widgets/CompletenessWidget.java | 4 +-
.../client/console/widgets/NumberWidget.java | 4 +-
.../client/console/wizards/DynRealmWrapper.java | 69 +++++
.../client/console/wizards/WizardMgtPanel.java | 4 +-
.../console/wizards/any/AnyWizardBuilder.java | 6 +-
.../console/wizards/any/GroupWizardBuilder.java | 2 +-
.../client/console/wizards/any/Groups.java | 260 +++++++++++--------
.../console/wizards/role/RoleWizardBuilder.java | 20 +-
.../src/main/resources/console.properties | 2 +-
.../SyncopeConsoleApplication.properties | 1 +
.../SyncopeConsoleApplication_it.properties | 1 +
.../SyncopeConsoleApplication_pt_BR.properties | 1 +
.../SyncopeConsoleApplication_ru.properties | 1 +
.../console/notifications/TemplateModal.html | 13 +-
.../client/console/pages/Administration.html | 36 +++
.../console/pages/Administration.properties | 18 ++
.../console/pages/Administration_it.properties | 18 ++
.../pages/Administration_pt_BR.properties | 18 ++
.../console/pages/Administration_ru.properties | 20 ++
.../syncope/client/console/pages/BasePage.html | 2 +-
.../syncope/client/console/pages/Roles.html | 36 ---
.../client/console/pages/Roles.properties | 17 --
.../client/console/pages/Roles_it.properties | 17 --
.../client/console/pages/Roles_pt_BR.properties | 17 --
.../client/console/pages/Roles_ru.properties | 19 --
.../panels/DynRealmDirectoryPanel.properties | 18 ++
.../panels/DynRealmDirectoryPanel_it.properties | 18 ++
.../DynRealmDirectoryPanel_pt_BR.properties | 18 ++
.../panels/DynRealmDirectoryPanel_ru.properties | 19 ++
.../console/panels/DynRealmModalPanel.html | 26 ++
.../panels/RoleDirectoryPanel.properties | 1 -
.../panels/RoleDirectoryPanel_it.properties | 1 -
.../panels/RoleDirectoryPanel_pt_BR.properties | 1 -
.../panels/RoleDirectoryPanel_ru.properties | 1 -
.../client/console/wizards/any/Groups.html | 17 +-
.../console/wizards/any/Groups.properties | 1 +
.../console/wizards/any/Groups_it.properties | 1 +
.../console/wizards/any/Groups_pt_BR.properties | 1 +
.../console/wizards/any/Groups_ru.properties | 1 +
.../role/RoleWizardBuilder$DynRealms.html | 28 ++
.../java/data/DynRealmDataBinderImpl.java | 7 +-
.../src/main/resources/console.properties | 2 +-
.../syncope/fit/console/AjaxBrowseITCase.java | 6 +-
.../apache/syncope/fit/console/RolesITCase.java | 55 ++--
.../apache/syncope/fit/console/UsersITCase.java | 4 +-
.../src/test/resources/console.properties | 2 +-
62 files changed, 1002 insertions(+), 371 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/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 1eedd67..e49f10d 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
@@ -121,6 +121,8 @@ public final class Constants {
public static final String PREF_ROLE_PAGINATOR_ROWS = "role.paginator.rows";
+ public static final String PREF_DYNREALM_PAGINATOR_ROWS = "dynRealm.paginator.rows";
+
public static final String PREF_ACCESS_TOKEN_PAGINATOR_ROWS = "accessToken.paginator.rows";
public static final String PREF_WORKFLOW_FORM_PAGINATOR_ROWS = "role.paginator.workflow.form";
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
index 91c887a..6b85887 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AbstractAnyFormLayout.java
@@ -31,6 +31,8 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A
private boolean auxClasses = true;
+ private boolean groups = true;
+
private boolean plainAttrs = true;
private final List<String> whichPlainAttrs = new ArrayList<>();
@@ -63,6 +65,14 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO, F extends AnyForm<A
this.auxClasses = auxClasses;
}
+ public boolean isGroups() {
+ return groups;
+ }
+
+ public void setGroups(final boolean groups) {
+ this.groups = groups;
+ }
+
public boolean isPlainAttrs() {
return plainAttrs;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
index 2d275c3..211aa25 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
@@ -25,8 +25,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO,
private static final long serialVersionUID = -5573691733739618500L;
- private boolean groups = true;
-
private boolean relationships = true;
@Override
@@ -34,14 +32,6 @@ public class AnyObjectFormLayoutInfo extends AbstractAnyFormLayout<AnyObjectTO,
return AnyObjectWizardBuilder.class;
}
- public boolean isGroups() {
- return groups;
- }
-
- public void setGroups(final boolean groups) {
- this.groups = groups;
- }
-
public boolean isRelationships() {
return relationships;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
index 68a67b9..c100143 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/layout/UserFormLayoutInfo.java
@@ -29,8 +29,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm>
private boolean roles = true;
- private boolean groups = true;
-
private boolean relationships = true;
@Override
@@ -54,14 +52,6 @@ public class UserFormLayoutInfo extends AbstractAnyFormLayout<UserTO, UserForm>
this.roles = roles;
}
- public boolean isGroups() {
- return groups;
- }
-
- public void setGroups(final boolean groups) {
- this.groups = groups;
- }
-
public boolean isRelationships() {
return relationships;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
index 57bb761..d802f66 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
@@ -50,8 +50,8 @@ public class TemplateModal<T extends EntityTO, F> extends AbstractModalPanel<T>
this.restClient = restClient;
this.templateTO = templateTO;
- final AjaxTextFieldPanel key
- = new AjaxTextFieldPanel("key", "key", new PropertyModel<String>(templateTO, "key"), false);
+ AjaxTextFieldPanel key = new AjaxTextFieldPanel(
+ "key", "key", new PropertyModel<String>(templateTO, "key"), false);
key.setOutputMarkupPlaceholderTag(true);
add(key.setRenderBodyOnly(true));
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
new file mode 100644
index 0000000..6f4423f
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Administration.java
@@ -0,0 +1,83 @@
+/*
+ * 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 de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel;
+import org.apache.syncope.client.console.panels.RoleDirectoryPanel;
+import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
+import org.apache.syncope.common.lib.to.RoleTO;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class Administration extends BasePage {
+
+ private static final long serialVersionUID = -1100228004207271271L;
+
+ public Administration(final PageParameters parameters) {
+ super(parameters);
+
+ body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
+ WebMarkupContainer content = new WebMarkupContainer("content");
+ content.setOutputMarkupId(true);
+ content.setMarkupId("administration");
+ content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList()));
+ body.add(content);
+ }
+
+ private List<ITab> buildTabList() {
+ final List<ITab> tabs = new ArrayList<>();
+
+ tabs.add(new AbstractTab(new ResourceModel("roles")) {
+
+ private static final long serialVersionUID = -6815067322125799251L;
+
+ @Override
+ public Panel getPanel(final String panelId) {
+ return new RoleDirectoryPanel.Builder(getPageReference()) {
+
+ private static final long serialVersionUID = -5960765294082359003L;
+
+ }.addNewItemPanelBuilder(new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build(panelId);
+ }
+ });
+
+ tabs.add(new AbstractTab(new ResourceModel("dynRealms")) {
+
+ private static final long serialVersionUID = -6815067322125799251L;
+
+ @Override
+ public Panel getPanel(final String panelId) {
+ return new DynRealmDirectoryPanel.Builder(getPageReference()) {
+
+ private static final long serialVersionUID = -5960765294082359003L;
+
+ }.build(panelId);
+ }
+ });
+ return tabs;
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index e7e23ae..1a94309 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -206,9 +206,9 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.SCHEMA_LIST);
liContainer.add(link);
- liContainer = new WebMarkupContainer(getLIContainerId("roles"));
+ liContainer = new WebMarkupContainer(getLIContainerId("administration"));
confULContainer.add(liContainer);
- link = BookmarkablePageLinkBuilder.build("roles", Roles.class);
+ link = BookmarkablePageLinkBuilder.build("administration", Administration.class);
MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.RENDER, StandardEntitlement.ROLE_LIST);
liContainer.add(link);
@@ -317,7 +317,7 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
// Extensions
ClassPathScanImplementationLookup classPathScanImplementationLookup =
(ClassPathScanImplementationLookup) SyncopeConsoleApplication.get().
- getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
+ getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
List<Class<? extends BaseExtPage>> extPageClasses = classPathScanImplementationLookup.getExtPageClasses();
WebMarkupContainer extensionsLI = new WebMarkupContainer(getLIContainerId("extensions"));
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
deleted file mode 100644
index d02345c..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
+++ /dev/null
@@ -1,52 +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.pages;
-
-import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
-import org.apache.syncope.client.console.panels.RoleDirectoryPanel;
-import org.apache.syncope.client.console.wizards.WizardMgtPanel;
-import org.apache.syncope.client.console.wizards.role.RoleWrapper;
-import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
-import org.apache.syncope.common.lib.to.RoleTO;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-
-public class Roles extends BasePage {
-
- private static final long serialVersionUID = -1100228004207271271L;
-
- public Roles(final PageParameters parameters) {
- super(parameters);
-
- body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
-
- WebMarkupContainer content = new WebMarkupContainer("content");
- content.setOutputMarkupId(true);
- body.add(content);
-
- WizardMgtPanel<RoleWrapper> rolesPanel = new RoleDirectoryPanel.Builder(getPageReference()) {
-
- private static final long serialVersionUID = -5960765294082359003L;
-
- }.addNewItemPanelBuilder(
- new RoleWizardBuilder(new RoleTO(), getPageReference()), true).build("rolesPanel");
-
- content.add(rolesPanel);
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
new file mode 100644
index 0000000..c20efb5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.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.panels;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.DynRealmDirectoryPanel.DynRealmDataProvider;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
+import org.apache.syncope.client.console.wizards.DynRealmWrapper;
+import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class DynRealmDirectoryPanel extends
+ DirectoryPanel<DynRealmTO, DynRealmWrapper, DynRealmDataProvider, DynRealmRestClient> {
+
+ private static final long serialVersionUID = -5491515010207202168L;
+
+ protected DynRealmDirectoryPanel(final String id, final Builder builder) {
+ super(id, builder);
+ MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, StandardEntitlement.DYNREALM_CREATE);
+ setReadOnly(!SyncopeConsoleSession.get().owns(StandardEntitlement.DYNREALM_UPDATE));
+
+ disableCheckBoxes();
+ setShowResultPage(true);
+
+ modal.size(Modal.Size.Large);
+ modal.addSubmitButton();
+ setFooterVisibility(true);
+ modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+ private static final long serialVersionUID = 8804221891699487139L;
+
+ @Override
+ public void onClose(final AjaxRequestTarget target) {
+ updateResultTable(target);
+ modal.show(false);
+ }
+ });
+
+ AjaxLink<Void> newDynReamlLink = new AjaxLink<Void>("add") {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target) {
+ modal.header(new StringResourceModel("any.new"));
+ modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(new DynRealmTO()), true, modal, pageRef));
+ modal.show(true);
+ target.add(modal);
+ }
+ };
+ ((WebMarkupContainer) get("container:content")).addOrReplace(newDynReamlLink);
+ MetaDataRoleAuthorizationStrategy.authorize(newDynReamlLink, RENDER, StandardEntitlement.DYNREALM_CREATE);
+
+ initResultTable();
+ }
+
+ @Override
+ protected DynRealmDataProvider dataProvider() {
+ return new DynRealmDataProvider(rows);
+ }
+
+ @Override
+ protected String paginatorRowsKey() {
+ return Constants.PREF_DYNREALM_PAGINATOR_ROWS;
+ }
+
+ @Override
+ protected List<IColumn<DynRealmTO, String>> getColumns() {
+ final List<IColumn<DynRealmTO, String>> columns = new ArrayList<>();
+
+ columns.add(new PropertyColumn<DynRealmTO, String>(new ResourceModel("key"), "key", "key"));
+
+ return columns;
+ }
+
+ @Override
+ public ActionsPanel<DynRealmTO> getActions(final IModel<DynRealmTO> model) {
+ final ActionsPanel<DynRealmTO> panel = super.getActions(model);
+
+ panel.add(new ActionLink<DynRealmTO>() {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final DynRealmTO ignore) {
+ modal.header(new StringResourceModel("any.edit", model));
+ modal.setContent(new DynRealmModalPanel(new DynRealmWrapper(model.getObject()), false, modal, pageRef));
+ modal.show(true);
+ target.add(modal);
+ }
+ }, ActionLink.ActionType.EDIT, StandardEntitlement.DYNREALM_UPDATE);
+
+ return panel;
+ }
+
+ @Override
+ protected Collection<ActionLink.ActionType> getBulkActions() {
+ return Collections.<ActionLink.ActionType>emptyList();
+ }
+
+ public abstract static class Builder
+ extends DirectoryPanel.Builder<DynRealmTO, DynRealmWrapper, DynRealmRestClient> {
+
+ private static final long serialVersionUID = 5530948153889495221L;
+
+ public Builder(final PageReference pageRef) {
+ super(new DynRealmRestClient(), pageRef);
+ }
+
+ @Override
+ protected WizardMgtPanel<DynRealmWrapper> newInstance(final String id, final boolean wizardInModal) {
+ return new DynRealmDirectoryPanel(id, this);
+ }
+ }
+
+ protected class DynRealmDataProvider extends DirectoryDataProvider<DynRealmTO> {
+
+ private static final long serialVersionUID = 3124431855954382273L;
+
+ private final SortableDataProviderComparator<DynRealmTO> comparator;
+
+ private final DynRealmRestClient restClient = new DynRealmRestClient();
+
+ public DynRealmDataProvider(final int paginatorRows) {
+ super(paginatorRows);
+ this.comparator = new SortableDataProviderComparator<>(this);
+ }
+
+ @Override
+ public Iterator<DynRealmTO> iterator(final long first, final long count) {
+ List<DynRealmTO> result = restClient.list();
+ Collections.sort(result, comparator);
+ return result.subList((int) first, (int) first + (int) count).iterator();
+ }
+
+ @Override
+ public long size() {
+ return restClient.list().size();
+ }
+
+ @Override
+ public IModel<DynRealmTO> model(final DynRealmTO object) {
+ return new CompoundPropertyModel<>(object);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
new file mode 100644
index 0000000..dd22e23
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmModalPanel.java
@@ -0,0 +1,109 @@
+/*
+ * 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.panels;
+
+import java.util.Collections;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wizards.DynRealmWrapper;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+public class DynRealmModalPanel extends AbstractModalPanel<DynRealmWrapper> {
+
+ private static final long serialVersionUID = -3773196441177699452L;
+
+ private final DynRealmRestClient restClient = new DynRealmRestClient();
+
+ private final DynRealmWrapper dynRealmWrapper;
+
+ private final boolean create;
+
+ public DynRealmModalPanel(
+ final DynRealmWrapper dynRealmWrapper,
+ final boolean create,
+ final BaseModal<DynRealmWrapper> modal,
+ final PageReference pageRef) {
+
+ super(modal, pageRef);
+ this.dynRealmWrapper = dynRealmWrapper;
+ this.create = create;
+ modal.setFormModel(dynRealmWrapper);
+
+ AjaxTextFieldPanel key = new AjaxTextFieldPanel(
+ "key", "key", new PropertyModel<String>(dynRealmWrapper.getInnerObject(), "key"), false);
+ key.setReadOnly(!create);
+ add(key);
+
+ add(new Accordion("cond", Collections.<ITab>singletonList(
+ new AbstractTab(new ResourceModel("cond", "Dynamic Condition")) {
+
+ private static final long serialVersionUID = 1037272333056449378L;
+
+ @Override
+ public Panel getPanel(final String panelId) {
+ return new UserSearchPanel.Builder(
+ new PropertyModel<List<SearchClause>>(dynRealmWrapper, "dynClauses")).
+ required(false).build(panelId);
+ }
+ }), Model.of(StringUtils.isBlank(dynRealmWrapper.getCond()) ? -1 : 0)).setOutputMarkupId(true));
+ }
+
+ @Override
+ public DynRealmWrapper getItem() {
+ return dynRealmWrapper;
+ }
+
+ @Override
+ public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ try {
+ dynRealmWrapper.fillDynamicConditions();
+ if (create) {
+ restClient.create(dynRealmWrapper.getInnerObject());
+ } else {
+ restClient.update(dynRealmWrapper.getInnerObject());
+ }
+ SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
+ this.modal.close(target);
+ } catch (Exception e) {
+ LOG.error("While creating/updating dynamic realm", e);
+ SyncopeConsoleSession.get().error(
+ StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+ }
+ ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index 1251b6d..f037a33 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -300,7 +300,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleWrapper, Role
@Override
public long size() {
- return restClient.count();
+ return restClient.list().size();
}
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index c7748d0..fb14b54 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -87,8 +87,8 @@ public class SecurityQuestionsPanel extends DirectoryPanel<
@Override
public WizardModalPanel<SecurityQuestionTO> build(
final String id, final int index, final AjaxWizard.Mode mode) {
- final SecurityQuestionTO modelObject = newModelObject();
- return new SecurityQuestionsModalPanel(modal, modelObject, pageRef);
+
+ return new SecurityQuestionsModalPanel(modal, newModelObject(), pageRef);
}
}, true);
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
new file mode 100644
index 0000000..5bc61d4
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/DynRealmRestClient.java
@@ -0,0 +1,47 @@
+/*
+ * 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.rest;
+
+import java.util.List;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+import org.apache.syncope.common.rest.api.service.DynRealmService;
+
+/**
+ * Console client for invoking REST DynRealm's services.
+ */
+public class DynRealmRestClient extends BaseRestClient {
+
+ private static final long serialVersionUID = -8549081557283519638L;
+
+ public List<DynRealmTO> list() {
+ return getService(DynRealmService.class).list();
+ }
+
+ public void create(final DynRealmTO dynRealmTO) {
+ getService(DynRealmService.class).create(dynRealmTO);
+ }
+
+ public void update(final DynRealmTO dynRealmTO) {
+ getService(DynRealmService.class).update(dynRealmTO);
+ }
+
+ public void delete(final String key) {
+ getService(DynRealmService.class).delete(key);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
index 32404e1..743bfb5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RoleRestClient.java
@@ -55,10 +55,6 @@ public class RoleRestClient extends BaseRestClient {
return getService(RoleService.class).list();
}
- public int count() {
- return getService(RoleService.class).list().size();
- }
-
public String readConsoleLayoutInfo(final String roleKey) {
try {
return IOUtils.toString(InputStream.class.cast(
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
index 5788759..78c175a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
@@ -140,16 +140,16 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel<
@Override
public void onEvent(final IEvent<?> event) {
- if (event.getPayload() instanceof ActionLinkTogleCloseEventPayload) {
- close(ActionLinkTogleCloseEventPayload.class.cast(event.getPayload()).getTarget());
+ if (event.getPayload() instanceof ActionLinkToggleCloseEventPayload) {
+ close(ActionLinkToggleCloseEventPayload.class.cast(event.getPayload()).getTarget());
}
}
- public static class ActionLinkTogleCloseEventPayload {
+ public static class ActionLinkToggleCloseEventPayload {
private final AjaxRequestTarget target;
- public ActionLinkTogleCloseEventPayload(final AjaxRequestTarget target) {
+ public ActionLinkToggleCloseEventPayload(final AjaxRequestTarget target) {
this.target = target;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
index 4e39205..6f147c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
@@ -185,7 +185,7 @@ public final class ActionPanel<T extends Serializable> extends Panel {
case CREATE:
case MEMBERS:
case CLAIM:
- send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target));
+ send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target));
break;
default:
break;
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
index ab74021..fe80ac9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
@@ -25,7 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
import org.apache.syncope.client.console.pages.Notifications;
import org.apache.syncope.client.console.pages.Policies;
-import org.apache.syncope.client.console.pages.Roles;
+import org.apache.syncope.client.console.pages.Administration;
import org.apache.syncope.client.console.pages.SecurityQuestions;
import org.apache.syncope.client.console.pages.Types;
import org.apache.syncope.client.console.topology.Topology;
@@ -112,7 +112,7 @@ public class CompletenessWidget extends BaseWidget {
actions.add(securityquestions);
securityquestions.setVisible(!confCompleteness.get(NumbersInfo.ConfItem.SECURITY_QUESTION));
- roles = BookmarkablePageLinkBuilder.build("roles", Roles.class);
+ roles = BookmarkablePageLinkBuilder.build("roles", Administration.class);
roles.setOutputMarkupPlaceholderTag(true);
MetaDataRoleAuthorizationStrategy.authorize(roles, WebPage.ENABLE, StandardEntitlement.ROLE_LIST);
actions.add(roles);
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
index fe5ef29..15bf597 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
@@ -30,7 +30,7 @@ import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.syncope.client.console.pages.Realms;
-import org.apache.syncope.client.console.pages.Roles;
+import org.apache.syncope.client.console.pages.Administration;
import org.apache.syncope.client.console.topology.Topology;
import org.apache.syncope.common.lib.types.StandardEntitlement;
import org.apache.wicket.request.component.IRequestablePage;
@@ -81,7 +81,7 @@ public class NumberWidget extends BaseWidget {
responsePage = Realms.class;
isAuthorized = SyncopeConsoleSession.get().owns(label + "_SEARCH");
} else {
- responsePage = Roles.class;
+ responsePage = Administration.class;
isAuthorized = SyncopeConsoleSession.get().owns(StandardEntitlement.ROLE_LIST);
}
break;
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
new file mode 100644
index 0000000..e9f5acc
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
@@ -0,0 +1,69 @@
+/*
+ * 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.wizards;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.to.DynRealmTO;
+
+public class DynRealmWrapper implements Serializable {
+
+ private static final long serialVersionUID = 7226128615964284614L;
+
+ private final DynRealmTO dynRealmTO;
+
+ private List<SearchClause> dynClauses;
+
+ public DynRealmWrapper(final DynRealmTO dynRealmTO) {
+ this.dynRealmTO = dynRealmTO;
+ getDynClauses();
+ }
+
+ public final List<SearchClause> getDynClauses() {
+ if (this.dynClauses == null) {
+ this.dynClauses = SearchUtils.getSearchClauses(this.dynRealmTO.getCond());
+ }
+ return this.dynClauses;
+ }
+
+ public void setDynClauses(final List<SearchClause> dynClauses) {
+ this.dynClauses = dynClauses;
+ }
+
+ public String getCond() {
+ if (CollectionUtils.isEmpty(this.dynClauses)) {
+ return null;
+ } else {
+ return SearchUtils.buildFIQL(this.dynClauses, SyncopeClient.getUserSearchConditionBuilder());
+ }
+ }
+
+ public DynRealmTO fillDynamicConditions() {
+ this.dynRealmTO.setCond(this.getCond());
+ return this.dynRealmTO;
+ }
+
+ public DynRealmTO getInnerObject() {
+ return this.dynRealmTO;
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 3891908..0ade92c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -124,9 +124,9 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
@Override
public void onClick(final AjaxRequestTarget target) {
send(WizardMgtPanel.this, Broadcast.BREADTH,
- new ActionLinksTogglePanel.ActionLinkTogleCloseEventPayload(target));
+ new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target));
send(WizardMgtPanel.this, Broadcast.EXACT,
- new AjaxWizard.NewItemActionEvent<T>(null, target));
+ new AjaxWizard.NewItemActionEvent<>(null, target));
}
};
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index 1253f20..9f1d3d2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -103,11 +103,7 @@ public abstract class AnyWizardBuilder<A extends AnyTO> extends AjaxWizardBuilde
wizardModel.add(new AuxClasses(modelObject.getInnerObject(), anyTypeClasses));
}
- if (formLayoutInfo instanceof UserFormLayoutInfo
- && UserFormLayoutInfo.class.cast(formLayoutInfo).isGroups()
- || formLayoutInfo instanceof AnyObjectFormLayoutInfo
- && AnyObjectFormLayoutInfo.class.cast(formLayoutInfo).isGroups()) {
-
+ if (formLayoutInfo.isGroups()) {
wizardModel.add(new Groups(modelObject.getInnerObject(), mode == AjaxWizard.Mode.TEMPLATE));
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
index 6c1e166..e5cb435 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
@@ -47,7 +47,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro
}
/**
- * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and
+ * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and
* viceversa.
*
* @param item wizard backend item.
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index 184f657..6525be5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -27,170 +27,202 @@ import org.apache.commons.collections4.Transformer;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
import org.apache.syncope.client.console.SyncopeConsoleApplication;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
import org.apache.syncope.client.console.rest.GroupRestClient;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.EntityTOUtils;
import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.DynRealmTO;
import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.UserTO;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.extensions.wizard.WizardStep;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.util.lang.Args;
import org.apache.syncope.common.lib.to.GroupableRelatableTO;
import org.apache.wicket.authroles.authorization.strategies.role.metadata.ActionPermissions;
import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
import org.apache.wicket.extensions.wizard.WizardModel.ICondition;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.PropertyModel;
public class Groups extends WizardStep implements ICondition {
private static final long serialVersionUID = 552437609667518888L;
+ private static final int MAX_GROUP_LIST_CARDINALITY = 30;
+
private final GroupRestClient groupRestClient = new GroupRestClient();
- private final List<GroupTO> allGroups;
+ private final List<DynRealmTO> allDynRealms = new DynRealmRestClient().list();
- private static final int MAX_GROUP_LIST_CARDINALITY = 30;
+ private List<GroupTO> allGroups;
+
+ private final AnyTO anyTO;
public <T extends AnyTO> Groups(final T anyTO, final boolean templateMode) {
super();
+ this.anyTO = anyTO;
final String realm = templateMode ? "/" : anyTO.getRealm();
// -----------------------------------------------------------------
// Pre-Authorizations
// -----------------------------------------------------------------
- final ActionPermissions permissions = new ActionPermissions();
+ ActionPermissions permissions = new ActionPermissions();
setMetaData(MetaDataRoleAuthorizationStrategy.ACTION_PERMISSIONS, permissions);
permissions.authorizeAll(RENDER);
// -----------------------------------------------------------------
setOutputMarkupId(true);
- Args.isTrue((anyTO instanceof UserTO) || (anyTO instanceof AnyObjectTO), "Expected user or anyObject");
-
- AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>().
- setRenderer(new IChoiceRenderer<MembershipTO>() {
-
- private static final long serialVersionUID = -3086661086073628855L;
-
- @Override
- public Object getDisplayValue(final MembershipTO object) {
- return object.getGroupName();
- }
-
- @Override
- public String getIdValue(final MembershipTO object, final int index) {
- return object.getGroupName();
- }
-
- @Override
- public MembershipTO getObject(
- final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
-
- return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() {
-
- @Override
- public boolean evaluate(final MembershipTO object) {
- return id.equalsIgnoreCase(object.getGroupName());
- }
- });
- }
- });
-
- allGroups = groupRestClient.search(
- realm,
- SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(),
- 1,
- MAX_GROUP_LIST_CARDINALITY,
- new SortParam<>("name", true),
- null);
-
- // ---------------------------------
- // Retrieve group memberships
- // ---------------------------------
- add(builder.setAllowOrder(true).withFilter().build("groups",
- new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()),
- new AjaxPalettePanel.Builder.Query<MembershipTO>() {
-
- private static final long serialVersionUID = -7223078772249308813L;
-
- @Override
- public List<MembershipTO> execute(final String filter) {
- return CollectionUtils.collect(
- StringUtils.isEmpty(filter) || "*".equals(filter)
- ? allGroups
- : groupRestClient.search(
- realm,
- SyncopeClient.getGroupSearchConditionBuilder().
- isAssignable().and().is("name").equalTo(filter).query(),
- 1, MAX_GROUP_LIST_CARDINALITY,
- new SortParam<>("name", true),
- null),
- new Transformer<GroupTO, MembershipTO>() {
-
- @Override
- public MembershipTO transform(final GroupTO input) {
- return new MembershipTO.Builder().
- group(input.getKey(), input.getName()).
- build();
- }
- }, new ArrayList<MembershipTO>());
+ WebMarkupContainer groupsContainer = new WebMarkupContainer("groupsContainer");
+ groupsContainer.setOutputMarkupId(true);
+ groupsContainer.setOutputMarkupPlaceholderTag(true);
+ add(groupsContainer);
+
+ WebMarkupContainer dyngroupsContainer = new WebMarkupContainer("dyngroupsContainer");
+ dyngroupsContainer.setOutputMarkupId(true);
+ dyngroupsContainer.setOutputMarkupPlaceholderTag(true);
+ add(dyngroupsContainer);
+
+ if (anyTO instanceof GroupTO) {
+ groupsContainer.add(new Label("groups").setVisible(false));
+ groupsContainer.setVisible(false);
+ dyngroupsContainer.add(new Label("dyngroups").setVisible(false));
+ dyngroupsContainer.setVisible(false);
+ } else {
+ AjaxPalettePanel.Builder<MembershipTO> builder = new AjaxPalettePanel.Builder<MembershipTO>().
+ setRenderer(new IChoiceRenderer<MembershipTO>() {
+
+ private static final long serialVersionUID = -3086661086073628855L;
+
+ @Override
+ public Object getDisplayValue(final MembershipTO object) {
+ return object.getGroupName();
+ }
+
+ @Override
+ public String getIdValue(final MembershipTO object, final int index) {
+ return object.getGroupName();
+ }
+
+ @Override
+ public MembershipTO getObject(
+ final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
+
+ return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() {
+
+ @Override
+ public boolean evaluate(final MembershipTO object) {
+ return id.equalsIgnoreCase(object.getGroupName());
+ }
+ });
+ }
+ });
+
+ allGroups = groupRestClient.search(
+ realm,
+ SyncopeClient.getGroupSearchConditionBuilder().isAssignable().query(),
+ 1,
+ MAX_GROUP_LIST_CARDINALITY,
+ new SortParam<>("name", true),
+ null);
+
+ // ---------------------------------
+ // Retrieve group memberships
+ // ---------------------------------
+ groupsContainer.add(builder.setAllowOrder(true).withFilter().build("groups",
+ new ListModel<>(GroupableRelatableTO.class.cast(anyTO).getMemberships()),
+ new AjaxPalettePanel.Builder.Query<MembershipTO>() {
+
+ private static final long serialVersionUID = -7223078772249308813L;
+
+ @Override
+ public List<MembershipTO> execute(final String filter) {
+ return CollectionUtils.collect(
+ StringUtils.isEmpty(filter) || "*".equals(filter)
+ ? allGroups
+ : groupRestClient.search(
+ realm,
+ SyncopeClient.getGroupSearchConditionBuilder().
+ isAssignable().and().is("name").equalTo(filter).query(),
+ 1, MAX_GROUP_LIST_CARDINALITY,
+ new SortParam<>("name", true),
+ null),
+ new Transformer<GroupTO, MembershipTO>() {
+
+ @Override
+ public MembershipTO transform(final GroupTO input) {
+ return new MembershipTO.Builder().
+ group(input.getKey(), input.getName()).
+ build();
+ }
+ }, new ArrayList<MembershipTO>());
+ }
+ }).hideLabel().setOutputMarkupId(true));
+ // ---------------------------------
+
+ // ---------------------------------
+ // Retrieve dyn group memberships
+ // ---------------------------------
+ GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
+
+ List<CompleteCondition> conditions = new ArrayList<>();
+ for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) {
+ conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap());
}
- }).hideLabel().setOutputMarkupId(true));
- // ---------------------------------
- // ---------------------------------
- // Retrieve dyn group memberships
- // ---------------------------------
- final GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
+ List<GroupTO> dynGroups = new ArrayList<>();
+ if (!conditions.isEmpty()) {
+ dynGroups.addAll(groupRestClient.search(
+ "/",
+ searchConditionBuilder.or(conditions).query(),
+ -1,
+ -1,
+ new SortParam<>("name", true),
+ null));
+ }
- List<CompleteCondition> conditions = new ArrayList<>();
- for (String groupKey : GroupableRelatableTO.class.cast(anyTO).getDynGroups()) {
- conditions.add(searchConditionBuilder.is("key").equalTo(groupKey).wrap());
- }
+ dyngroupsContainer.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups",
+ new ListModel<>(CollectionUtils.collect(dynGroups, new Transformer<GroupTO, String>() {
- final List<GroupTO> dynGroups = new ArrayList<>();
- if (!conditions.isEmpty()) {
- dynGroups.addAll(groupRestClient.search(
- "/",
- searchConditionBuilder.or(conditions).query(),
- -1,
- -1,
- new SortParam<>("name", true),
- null));
+ @Override
+ public String transform(final GroupTO input) {
+ return input.getName();
+ }
+ }, new ArrayList<String>())),
+ new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() {
+
+ @Override
+ public String transform(final GroupTO input) {
+ return input.getName();
+ }
+ }, new ArrayList<String>()))).
+ hideLabel().setEnabled(false).setOutputMarkupId(true));
+
+ // ---------------------------------
}
- add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build("dyngroups",
- new ListModel<>(CollectionUtils.collect(dynGroups,
- new Transformer<GroupTO, String>() {
-
- @Override
- public String transform(final GroupTO input) {
- return input.getName();
- }
- }, new ArrayList<String>())),
- new ListModel<>(CollectionUtils.collect(allGroups, new Transformer<GroupTO, String>() {
-
- @Override
- public String transform(final GroupTO input) {
- return input.getName();
- }
- }, new ArrayList<String>()))).
+ add(new AjaxPalettePanel.Builder<String>().build("dynrealms",
+ new PropertyModel<List<String>>(anyTO, "dynRealms"),
+ new ListModel<>(
+ CollectionUtils.collect(allDynRealms,
+ EntityTOUtils.keyTransformer(),
+ new ArrayList<String>()))).
hideLabel().setEnabled(false).setOutputMarkupId(true));
-
- // ---------------------------------
}
@Override
public boolean evaluate() {
- return CollectionUtils.isNotEmpty(allGroups)
+ return ((anyTO instanceof GroupTO)
+ ? CollectionUtils.isNotEmpty(allDynRealms)
+ : CollectionUtils.isNotEmpty(allDynRealms) || CollectionUtils.isNotEmpty(allGroups))
&& SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
- isActionAuthorized(this, RENDER);
+ isActionAuthorized(this, RENDER);
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
index 7841c8e..49f377b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
@@ -27,12 +27,14 @@ import org.apache.commons.collections4.Transformer;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.panels.search.SearchClause;
import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.DynRealmRestClient;
import org.apache.syncope.client.console.rest.RealmRestClient;
import org.apache.syncope.client.console.rest.RoleRestClient;
import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.EntityTOUtils;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.to.RoleTO;
import org.apache.wicket.PageReference;
@@ -63,7 +65,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
}
/**
- * This method has been overridden to manage asynchronous translation of FIQL string to search clases list and
+ * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and
* viceversa.
*
* @param item wizard backend item.
@@ -93,6 +95,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
wizardModel.add(new Details(modelObject));
wizardModel.add(new Entitlements(modelObject.getInnerObject()));
wizardModel.add(new Realms(modelObject.getInnerObject()));
+ wizardModel.add(new DynRealms(modelObject.getInnerObject()));
return wizardModel;
}
@@ -169,4 +172,19 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
}
}
+ public static class DynRealms extends WizardStep {
+
+ private static final long serialVersionUID = 6846234574424462255L;
+
+ public DynRealms(final RoleTO modelObject) {
+ setTitleModel(new ResourceModel("dynRealms"));
+ add(new AjaxPalettePanel.Builder<String>().build("dynRealms",
+ new PropertyModel<List<String>>(modelObject, "dynRealms"),
+ new ListModel<>(
+ CollectionUtils.collect(new DynRealmRestClient().list(),
+ EntityTOUtils.keyTransformer(),
+ new ArrayList<String>()))).hideLabel().setOutputMarkupId(true));
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/console.properties b/client/console/src/main/resources/console.properties
index a3c44f8..c9c0cdd 100644
--- a/client/console/src/main/resources/console.properties
+++ b/client/console/src/main/resources/console.properties
@@ -34,6 +34,7 @@ activitiModelerDirectory=${activiti-modeler.directory}
reconciliationReportKey=c3520ad9-179f-49e7-b315-d684d216dd97
+page.administration=org.apache.syncope.client.console.pages.Administration
page.dashboard=org.apache.syncope.client.console.pages.Dashboard
page.realms=org.apache.syncope.client.console.pages.Realms
page.topology=org.apache.syncope.client.console.topology.Topology
@@ -43,7 +44,6 @@ page.audit=org.apache.syncope.client.console.pages.Audit
page.logs=org.apache.syncope.client.console.pages.Logs
page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions
page.types=org.apache.syncope.client.console.pages.Types
-page.roles=org.apache.syncope.client.console.pages.Roles
page.policies=org.apache.syncope.client.console.pages.Policies
page.notifications=org.apache.syncope.client.console.pages.Notifications
page.parameters=org.apache.syncope.client.console.pages.Parameters
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
index 77841d6..56df013 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
@@ -69,3 +69,4 @@ audit=Audit
connectors.confirm.reload=This request is potentially dangerous for running operations, continue?
intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships (if applicable); for example:
confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administration
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
index 8c2df2f..f039403 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
@@ -69,3 +69,4 @@ audit=Audit
connectors.confirm.reload=Questa richiesta \u00e8 potenzialmente dannosa per le operazioni in corso, proseguire?
intAttrNameInfo.help=Oltre agli attributi auto-completati, \u00e8 possibile fare riferimento anche a gruppi, any object e membership (se applicabile); ad esempio:
confirmGlobalLogout=Vuoi davvero procedere al logout globale?
+administration=Amministrazione
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
index 043df29..c746a66 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
@@ -69,3 +69,4 @@ audit=Audit
connectors.confirm.reload=Esta requis\u00e7\u00e3o \u00e9 potencialmente perigosa para opera\u00e7\u00f5es em execu\u00e7\u00e3o, prosseguir?
intAttrNameInfo.help=Besides auto-completed attributes, you can also refer to groups, any objects or memberships (if applicable); for example:
confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administra\u00e7\u00e3o
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
index c661008..ef6ea6e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
@@ -68,3 +68,4 @@ audit=\u0410\u0443\u0434\u0438\u0442
connectors.confirm.reload=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
intAttrNameInfo.help=\u041f\u043e\u043c\u0438\u043c\u043e \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u043e (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:
confirmGlobalLogout=Do you really want to perform global logout?
+administration=Administration
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
index 3a0676c..ab3df26 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
@@ -17,12 +17,9 @@ specific language governing permissions and limitations
under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
- <head><title></title></head>
- <body>
- <wicket:panel>
- <div class="form-group">
- <span wicket:id="key"/>
- </div>
- </wicket:panel>
- </body>
+ <wicket:panel>
+ <div class="form-group">
+ <span wicket:id="key"/>
+ </div>
+ </wicket:panel>
</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
new file mode 100644
index 0000000..0c79945
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.html
@@ -0,0 +1,36 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:extend>
+ <section class="content-header">
+ <h1> </h1>
+ <ol class="breadcrumb">
+ <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"/></a></li>
+ <li class="active"><wicket:message key="configuration"/></li>
+ <li class="active"><wicket:message key="administration"/></li>
+ </ol>
+ </section>
+
+ <section class="content" wicket:id="content">
+ <div class="box">
+ <div class="box-body" wicket:id="tabbedPanel"/>
+ </div>
+ </section>
+ </wicket:extend>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
new file mode 100644
index 0000000..8788d48
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Create new Role
+dynRealms=Dynamic Realms
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
new file mode 100644
index 0000000..becfb71
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_it.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Crea un nuovo Ruolo
+dynRealms=Realm dinamici
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
new file mode 100644
index 0000000..e6d08f9
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_pt_BR.properties
@@ -0,0 +1,18 @@
+# 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.
+add=Cria um novo fun\u00e7\u00e3o
+dynRealms=Realm din\u00e2micos
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
new file mode 100644
index 0000000..e933b31
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Administration_ru.properties
@@ -0,0 +1,20 @@
+# 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.
+#
+# add=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d1\u0080\u00d0\u00be\u00d0\u00bb\u00d1\u008c
+add=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c
+dynRealms=Dynamic Realms
http://git-wip-us.apache.org/repos/asf/syncope/blob/52bd7eb0/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index 7b2ccc6..ed0444a 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -108,12 +108,12 @@ under the License.
<li wicket:id="configurationLI" class="treeview">
<a href="#"><i class="fa fa-edit"></i><span><wicket:message key="configuration"/></span> <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
<ul wicket:id="configurationUL" class="treeview-menu">
+ <li wicket:id="administrationLI"><a href="#" wicket:id="administration"><i class="fa fa-lock"></i><wicket:message key="administration"/></a></li>
<li wicket:id="auditLI"><a href="#" wicket:id="audit"><i class="fa fa-check-square-o"></i><wicket:message key="audit"/></a></li>
<li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i><wicket:message key="logs"/></a></li>
<li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i><wicket:message key="notifications"/></a></li>
<li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i><wicket:message key="parameters"/></a></li>
<li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i><wicket:message key="policies"/></a></li>
- <li wicket:id="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i><wicket:message key="roles"/></a></li>
<li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i><wicket:message key="securityQuestions"/></a></li>
<li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
<li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i><wicket:message key="workflow"/></a></li>