You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2016/05/03 20:49:16 UTC
[2/2] syncope git commit: [SYNCOPE-745] report reportlet management
[SYNCOPE-745] report reportlet management
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/2b0960de
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/2b0960de
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/2b0960de
Branch: refs/heads/master
Commit: 2b0960de57a0faa07fe470003f4f0901ad4a8ad4
Parents: c6ad727
Author: fmartelli <fa...@gmail.com>
Authored: Tue May 3 20:48:55 2016 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue May 3 20:48:55 2016 +0200
----------------------------------------------------------------------
.../client/console/commons/Constants.java | 4 +
.../panels/ParametersCreateWizardPanel.java | 4 -
.../panels/search/SearchClausePanel.java | 2 +-
.../console/panels/search/SearchUtils.java | 29 +-
.../console/reports/ReportDirectoryPanel.java | 39 +-
.../reports/ReportTemplateDirectoryPanel.java | 4 -
.../reports/ReportletDirectoryPanel.java | 334 ++++++++++++++++
.../console/reports/ReportletWizardBuilder.java | 386 +++++++++++++++++++
.../client/console/rest/SchemaRestClient.java | 44 +++
.../markup/html/bootstrap/dialog/BaseModal.java | 7 +-
.../wicket/markup/html/form/ActionLink.java | 1 +
.../markup/html/form/ActionLinksPanel.java | 24 ++
.../markup/html/form/AjaxPalettePanel.java | 11 +-
.../console/wizards/AjaxWizardBuilder.java | 4 +
.../client/console/wizards/WizardMgtPanel.java | 54 ++-
.../META-INF/resources/css/syncopeConsole.css | 10 +-
.../reports/ReportDirectoryPanel.properties | 2 +
.../reports/ReportDirectoryPanel_it.properties | 2 +
.../ReportDirectoryPanel_pt_BR.properties | 2 +
.../reports/ReportDirectoryPanel_ru.properties | 2 +
.../reports/ReportWizardBuilder$Profile.html | 2 +-
.../reports/ReportletDirectoryPanel.properties | 19 +
.../ReportletDirectoryPanel_it.properties | 19 +
.../ReportletDirectoryPanel_pt_BR.properties | 19 +
.../ReportletDirectoryPanel_ru.properties | 19 +
.../ReportletWizardBuilder$Configuration.html | 28 ++
...ortletWizardBuilder$Configuration.properties | 24 ++
...letWizardBuilder$Configuration_it.properties | 24 ++
...WizardBuilder$Configuration_pt_BR.properties | 24 ++
...letWizardBuilder$Configuration_ru.properties | 26 ++
.../reports/ReportletWizardBuilder$Profile.html | 24 ++
.../ReportletWizardBuilder$Profile.properties | 18 +
...ReportletWizardBuilder$Profile_it.properties | 18 +
...ortletWizardBuilder$Profile_pt_BR.properties | 18 +
...ReportletWizardBuilder$Profile_ru.properties | 20 +
.../markup/html/form/ActionLinksPanel.html | 5 +
.../markup/html/form/AjaxPalettePanel.html | 4 +-
.../client/console/wizards/WizardMgtPanel.html | 3 +
.../lib/report/AbstractAnyReportletConf.java | 43 ---
.../common/lib/report/GroupReportletConf.java | 42 ++
.../lib/report/ReconciliationReportletConf.java | 3 +
.../syncope/common/lib/report/Schema.java | 32 ++
.../common/lib/report/SearchCondition.java | 31 ++
.../common/lib/report/UserReportletConf.java | 42 ++
44 files changed, 1394 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/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 141b7e5..38dba85 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
@@ -110,6 +110,10 @@ public final class Constants {
public static final String PREF_PROPAGATION_TASKS_PAGINATOR_ROWS = "proagationtasks.paginator.rows";
+ public static final String PREF_REPORT_TASKS_PAGINATOR_ROWS = "report.paginator.rows";
+
+ public static final String PREF_REPORTLET_TASKS_PAGINATOR_ROWS = "reportlet.paginator.rows";
+
public static final String PREF_TASK_EXECS_PAGINATOR_ROWS = "task.execs.paginator.rows";
public static final String PREF_NOTIFICATION_TASKS_PAGINATOR_ROWS = "notificationtasks.paginator.rows";
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
index eace16b..b3a2c93 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardPanel.java
@@ -28,15 +28,11 @@ import org.apache.syncope.common.rest.api.service.ConfigurationService;
import org.apache.syncope.common.rest.api.service.SchemaService;
import org.apache.wicket.PageReference;
import org.apache.wicket.extensions.wizard.WizardModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class ParametersCreateWizardPanel extends AjaxWizardBuilder<ParametersCreateWizardPanel.ParametersForm> {
private static final long serialVersionUID = -2868592590785581481L;
- private static final Logger LOG = LoggerFactory.getLogger(ParametersCreateWizardPanel.class);
-
public ParametersCreateWizardPanel(final ParametersForm defaultItem, final PageReference pageRef) {
super(defaultItem, pageRef);
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
index 05c5157..3271647 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
@@ -690,7 +690,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
@Override
public Object getDisplayValue(final String object) {
- return groupNames.getObject().get(Long.parseLong(object));
+ return groupNames.getObject().get(object);
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
index 83960e1..6857e20 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
@@ -117,7 +117,16 @@ public final class SearchUtils implements Serializable {
LOG.info("Condition: " + sc.getCondition());
- if (SpecialAttr.GROUPS.toString().equals(property)) {
+ if (SpecialAttr.ROLES.toString().equals(property)) {
+ res.setType(SearchClause.Type.ROLE_MEMBERSHIP);
+ res.setProperty(value);
+ } else if (SpecialAttr.RELATIONSHIPS.toString().equals(property)) {
+ res.setType(SearchClause.Type.RELATIONSHIP);
+ res.setProperty(value);
+ } else if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) {
+ res.setType(SearchClause.Type.RELATIONSHIP);
+ res.setProperty(value);
+ } else if (SpecialAttr.GROUPS.toString().equals(property)) {
res.setType(SearchClause.Type.GROUP_MEMBERSHIP);
res.setProperty(value);
} else if (SpecialAttr.RESOURCES.toString().equals(property)) {
@@ -129,13 +138,23 @@ public final class SearchUtils implements Serializable {
switch (sc.getConditionType()) {
case EQUALS:
- res.setComparator(SpecialAttr.NULL.toString().equals(value)
- ? SearchClause.Comparator.IS_NULL : SearchClause.Comparator.EQUALS);
+ if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) {
+ res.setComparator(SpecialAttr.NULL.toString().equals(value)
+ ? SearchClause.Comparator.EQUALS : SearchClause.Comparator.IS_NULL);
+ } else {
+ res.setComparator(SpecialAttr.NULL.toString().equals(value)
+ ? SearchClause.Comparator.IS_NULL : SearchClause.Comparator.EQUALS);
+ }
break;
case NOT_EQUALS:
- res.setComparator(SpecialAttr.NULL.toString().equals(value)
- ? SearchClause.Comparator.IS_NOT_NULL : SearchClause.Comparator.NOT_EQUALS);
+ if (SpecialAttr.RELATIONSHIP_TYPES.toString().equals(property)) {
+ res.setComparator(SpecialAttr.NULL.toString().equals(value)
+ ? SearchClause.Comparator.NOT_EQUALS : SearchClause.Comparator.IS_NOT_NULL);
+ } else {
+ res.setComparator(SpecialAttr.NULL.toString().equals(value)
+ ? SearchClause.Comparator.IS_NOT_NULL : SearchClause.Comparator.NOT_EQUALS);
+ }
break;
case GREATER_OR_EQUALS:
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
index 1f56083..cb5336b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.client.console.reports;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -36,6 +37,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -52,6 +54,7 @@ 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.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
@@ -63,6 +66,8 @@ public abstract class ReportDirectoryPanel
private static final long serialVersionUID = 4984337552918213290L;
+ private final BaseModal<ReportTO> reportletModal = new BaseModal<ReportTO>("outer");
+
private final ReportStartAtTogglePanel startAt;
protected ReportDirectoryPanel(final MultilevelPanel multiLevelPanelRef, final PageReference pageRef) {
@@ -72,6 +77,7 @@ public abstract class ReportDirectoryPanel
this.addNewItemPanelBuilder(new ReportWizardBuilder(new ReportTO(), pageRef), true);
MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.REPORT_CREATE);
+ modal.size(Modal.Size.Large);
initResultTable();
startAt = new ReportStartAtTogglePanel(container);
@@ -113,15 +119,31 @@ public abstract class ReportDirectoryPanel
@Override
public ActionLinksPanel<ReportTO> getActions(final String componentId, final IModel<ReportTO> model) {
- final ReportTO reportTO = model.getObject();
-
final ActionLinksPanel<ReportTO> panel = ActionLinksPanel.<ReportTO>builder().
add(new ActionLink<ReportTO>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+ public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
+ target.add(modal.setContent(new ReportletDirectoryPanel(
+ modal, model.getObject().getKey(), pageRef)));
+
+ modal.header(new StringResourceModel(
+ "reportlet.conf", ReportDirectoryPanel.this, Model.of(model.getObject())));
+
+ MetaDataRoleAuthorizationStrategy.authorize(
+ modal.getForm(), ENABLE, StandardEntitlement.RESOURCE_UPDATE);
+
+ modal.show(true);
+ }
+ }, ActionLink.ActionType.COMPOSE, StandardEntitlement.REPORT_UPDATE).
+ add(new ActionLink<ReportTO>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
final ReportTO clone = SerializationUtils.clone(model.getObject());
clone.setKey(null);
send(ReportDirectoryPanel.this, Broadcast.EXACT,
@@ -133,7 +155,7 @@ public abstract class ReportDirectoryPanel
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+ public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
send(ReportDirectoryPanel.this, Broadcast.EXACT,
new AjaxWizard.EditItemActionEvent<>(
restClient.read(model.getObject().getKey()), target));
@@ -144,8 +166,8 @@ public abstract class ReportDirectoryPanel
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
- viewTask(reportTO, target);
+ public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
+ viewTask(model.getObject(), target);
}
}, ActionLink.ActionType.VIEW, StandardEntitlement.REPORT_READ).
add(new ActionLink<ReportTO>() {
@@ -164,7 +186,8 @@ public abstract class ReportDirectoryPanel
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+ public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
+ final ReportTO reportTO = model.getObject();
try {
restClient.delete(reportTO.getKey());
info(getString(Constants.OPERATION_SUCCEEDED));
@@ -217,7 +240,7 @@ public abstract class ReportDirectoryPanel
@Override
protected String paginatorRowsKey() {
- return Constants.PREF_PROPAGATION_TASKS_PAGINATOR_ROWS;
+ return Constants.PREF_REPORT_TASKS_PAGINATOR_ROWS;
}
protected abstract void viewTask(final ReportTO reportTO, final AjaxRequestTarget target);
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
index 31e84f1..f2ddf6b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -68,10 +68,6 @@ public class ReportTemplateDirectoryPanel
super(id, pageReference, true);
disableCheckBoxes();
- modal.size(Modal.Size.Small);
- modal.addSubmitButton();
- setFooterVisibility(true);
-
addOuterObject(utilityModal);
setWindowClosedReloadCallback(utilityModal);
utilityModal.size(Modal.Size.Large);
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
new file mode 100644
index 0000000..15f754a
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -0,0 +1,334 @@
+/*
+ * 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.reports;
+
+import static org.apache.wicket.Component.ENABLE;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+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.DirectoryPanel;
+import org.apache.syncope.client.console.panels.ModalPanel;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.reports.ReportletDirectoryPanel.ReportletWrapper;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.report.AbstractReportletConf;
+import org.apache.syncope.common.lib.report.ReportletConf;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+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.basic.Label;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+/**
+ * Reportlets page.
+ */
+public class ReportletDirectoryPanel extends DirectoryPanel<
+ ReportletWrapper, ReportletWrapper, DirectoryDataProvider<ReportletWrapper>, ReportRestClient>
+ implements ModalPanel {
+
+ private static final long serialVersionUID = 4984337552918213290L;
+
+ private final BaseModal<ReportTO> baseModal;
+
+ private final String report;
+
+ protected ReportletDirectoryPanel(
+ final BaseModal<ReportTO> baseModal, final String report, final PageReference pageRef) {
+ super(BaseModal.CONTENT_ID, pageRef, false);
+ this.baseModal = baseModal;
+ this.report = report;
+ this.restClient = new ReportRestClient();
+
+ enableExitButton();
+
+ this.addNewItemPanelBuilder(new ReportletWizardBuilder(
+ report, new ReportletWrapper(), pageRef).setEventSink(ReportletDirectoryPanel.this), true);
+
+ MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.REPORT_UPDATE);
+ restClient = new ReportRestClient();
+ initResultTable();
+ }
+
+ @Override
+ protected List<IColumn<ReportletWrapper, String>> getColumns() {
+ final List<IColumn<ReportletWrapper, String>> columns = new ArrayList<>();
+
+ columns.add(new PropertyColumn<ReportletWrapper, String>(
+ new StringResourceModel("reportlet", this, null), "name", "name"));
+
+ columns.add(new AbstractColumn<ReportletWrapper, String>(
+ new StringResourceModel("configuration", this, null)) {
+
+ private static final long serialVersionUID = -4008579357070833846L;
+
+ @Override
+ public void populateItem(
+ final Item<ICellPopulator<ReportletWrapper>> cellItem,
+ final String componentId,
+ final IModel<ReportletWrapper> rowModel) {
+ cellItem.add(new Label(componentId, rowModel.getObject().getConf().getClass().getName()));
+ }
+ });
+
+ columns.add(new ActionColumn<ReportletWrapper, String>(new ResourceModel("actions")) {
+
+ private static final long serialVersionUID = 2054811145491901166L;
+
+ @Override
+ public ActionLinksPanel<ReportletWrapper> getActions(final String componentId,
+ final IModel<ReportletWrapper> model) {
+
+ final ActionLinksPanel<ReportletWrapper> panel = ActionLinksPanel.<ReportletWrapper>builder().
+ add(new ActionLink<ReportletWrapper>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) {
+ AbstractReportletConf clone = SerializationUtils.clone(model.getObject().getConf());
+ clone.setName(null);
+
+ send(ReportletDirectoryPanel.this, Broadcast.EXACT,
+ new AjaxWizard.EditItemActionEvent<>(
+ new ReportletWrapper().setConf(clone),
+ target));
+ }
+ }, ActionLink.ActionType.CLONE, StandardEntitlement.REPORT_UPDATE).
+ add(new ActionLink<ReportletWrapper>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) {
+ send(ReportletDirectoryPanel.this, Broadcast.EXACT,
+ new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
+ }
+ }, ActionLink.ActionType.EDIT, StandardEntitlement.REPORT_UPDATE).
+ add(new ActionLink<ReportletWrapper>() {
+
+ private static final long serialVersionUID = -3722207913631435501L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) {
+ final ReportletConf reportlet = model.getObject().getConf();
+ try {
+ final ReportTO actual = restClient.read(report);
+ CollectionUtils.filter(actual.getReportletConfs(), new Predicate<ReportletConf>() {
+
+ @Override
+ public boolean evaluate(final ReportletConf object) {
+ return !object.getName().equals(reportlet.getName());
+ }
+ });
+ restClient.update(actual);
+ info(getString(Constants.OPERATION_SUCCEEDED));
+ customActionOnCloseCallback(target);
+ } catch (SyncopeClientException e) {
+ LOG.error("While deleting {}", reportlet.getName(), e);
+ error(StringUtils.isBlank(e.getMessage())
+ ? e.getClass().getName() : e.getMessage());
+ }
+ SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+ }
+ }, ActionLink.ActionType.DELETE, StandardEntitlement.REPORT_UPDATE).build(componentId);
+
+ return panel;
+ }
+
+ @Override
+ public ActionLinksPanel<ReportletWrapper> getHeader(final String componentId) {
+ final ActionLinksPanel.Builder<ReportletWrapper> panel = ActionLinksPanel.builder();
+
+ return panel.add(new ActionLink<ReportletWrapper>() {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) {
+ if (target != null) {
+ customActionOnCloseCallback(target);
+ }
+ }
+ }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+ }
+ });
+
+ return columns;
+ }
+
+ @Override
+ protected Collection<ActionType> getBulkActions() {
+ final List<ActionType> bulkActions = new ArrayList<>();
+ bulkActions.add(ActionType.DELETE);
+ return bulkActions;
+ }
+
+ @Override
+ protected ReportDataProvider dataProvider() {
+ return new ReportDataProvider(rows);
+ }
+
+ @Override
+ protected String paginatorRowsKey() {
+ return Constants.PREF_REPORTLET_TASKS_PAGINATOR_ROWS;
+ }
+
+ protected class ReportDataProvider extends DirectoryDataProvider<ReportletWrapper> {
+
+ private static final long serialVersionUID = 4725679400450513556L;
+
+ private final SortableDataProviderComparator<ReportletWrapper> comparator;
+
+ public ReportDataProvider(final int paginatorRows) {
+ super(paginatorRows);
+
+ //Default sorting
+ setSort("name", SortOrder.DESCENDING);
+ comparator = new SortableDataProviderComparator<>(this);
+ }
+
+ @Override
+ public Iterator<ReportletWrapper> iterator(final long first, final long count) {
+ final ReportTO actual = restClient.read(report);
+
+ final ArrayList<ReportletWrapper> reportlets = CollectionUtils.collect(
+ actual.getReportletConfs(),
+ new Transformer<AbstractReportletConf, ReportletWrapper>() {
+
+ @Override
+ public ReportletWrapper transform(final AbstractReportletConf input) {
+ return new ReportletWrapper(input.getName()).setName(input.getName()).setConf(input);
+ }
+ }, new ArrayList<ReportletWrapper>());
+
+ Collections.sort(reportlets, comparator);
+ return reportlets.subList((int) first, (int) (first + count)).iterator();
+ }
+
+ @Override
+ public long size() {
+ final ReportTO actual = restClient.read(report);
+ return actual.getReportletConfs().size();
+ }
+
+ @Override
+ public IModel<ReportletWrapper> model(final ReportletWrapper object) {
+ return new CompoundPropertyModel<>(object);
+ }
+ }
+
+ public static class ReportletWrapper implements Serializable {
+
+ private static final long serialVersionUID = 2472755929742424558L;
+
+ private String oldname;
+
+ private String name;
+
+ private AbstractReportletConf conf;
+
+ private final Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> scondWrapper;
+
+ public ReportletWrapper() {
+ this(null);
+ }
+
+ public ReportletWrapper(final String name) {
+ this.oldname = name;
+ this.scondWrapper = new HashMap<>();
+ }
+
+ public boolean isNew() {
+ return oldname == null;
+ }
+
+ public String getOldName() {
+ return this.oldname;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public ReportletWrapper setName(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ public AbstractReportletConf getConf() {
+ return conf;
+ }
+
+ public ReportletWrapper setConf(final AbstractReportletConf conf) {
+ this.conf = conf;
+ return this;
+ }
+
+ public Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> getSCondWrapper() {
+ return scondWrapper;
+ }
+ }
+
+ @Override
+ public void onEvent(final IEvent<?> event) {
+ super.onEvent(event);
+ if (event.getPayload() instanceof ExitEvent && modal != null) {
+ final AjaxRequestTarget target = ExitEvent.class.cast(event.getPayload()).getTarget();
+ baseModal.show(false);
+ baseModal.close(target);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
new file mode 100644
index 0000000..cf94ddf
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
@@ -0,0 +1,386 @@
+/*
+ * 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.reports;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel;
+import org.apache.syncope.client.console.panels.search.GroupSearchPanel;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.console.panels.search.UserSearchPanel;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxSpinnerFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.DateTimeFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.report.AbstractReportletConf;
+import org.apache.syncope.common.lib.report.Schema;
+import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.ListModel;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.PropertyAccessorFactory;
+import org.springframework.util.ClassUtils;
+import org.apache.syncope.common.lib.report.SearchCondition;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.wicket.event.IEventSink;
+
+public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletDirectoryPanel.ReportletWrapper> {
+
+ private static final long serialVersionUID = 5945391813567245081L;
+
+ private final ReportRestClient restClient = new ReportRestClient();
+
+ private final String report;
+
+ public ReportletWizardBuilder(
+ final String report,
+ final ReportletDirectoryPanel.ReportletWrapper reportlet,
+ final PageReference pageRef) {
+ super(reportlet, pageRef);
+ this.report = report;
+ }
+
+ public ReportletWizardBuilder setEventSink(final IEventSink eventSink) {
+ this.eventSink = eventSink;
+ return this;
+ }
+
+ @Override
+ protected Serializable onApplyInternal(final ReportletDirectoryPanel.ReportletWrapper modelObject) {
+ modelObject.getConf().setName(modelObject.getName());
+
+ final ReportTO reportTO = restClient.read(report);
+
+ if (modelObject.isNew()) {
+ reportTO.getReportletConfs().add(modelObject.getConf());
+ } else {
+ CollectionUtils.filter(
+ reportTO.getReportletConfs(), new Predicate<AbstractReportletConf>() {
+
+ @Override
+ public boolean evaluate(final AbstractReportletConf object) {
+ return !object.getName().equals(modelObject.getOldName());
+ }
+ });
+ reportTO.getReportletConfs().add(modelObject.getConf());
+ }
+
+ BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(modelObject.getConf());
+ for (Map.Entry<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> entry
+ : modelObject.getSCondWrapper().entrySet()) {
+ wrapper.setPropertyValue(entry.getKey(),
+ SearchUtils.buildFIQL(entry.getValue().getRight(), entry.getValue().getLeft()));
+ }
+
+ restClient.update(reportTO);
+ return modelObject;
+ }
+
+ @Override
+ protected WizardModel buildModelSteps(
+ final ReportletDirectoryPanel.ReportletWrapper modelObject, final WizardModel wizardModel) {
+ wizardModel.add(new Profile(modelObject));
+ wizardModel.add(new Configuration(modelObject));
+ return wizardModel;
+ }
+
+ public class Profile extends WizardStep {
+
+ private static final long serialVersionUID = -3043839139187792810L;
+
+ public Profile(final ReportletDirectoryPanel.ReportletWrapper reportlet) {
+
+ final AjaxTextFieldPanel name = new AjaxTextFieldPanel(
+ "name", "reportlet", new PropertyModel<String>(reportlet, "name"), false);
+ name.addRequiredLabel();
+ name.setEnabled(true);
+ add(name);
+
+ final AjaxDropDownChoicePanel<String> conf = new AjaxDropDownChoicePanel<>(
+ "configuration", getString("configuration"), new PropertyModel<String>(reportlet, "conf") {
+
+ private static final long serialVersionUID = -6427731218492117883L;
+
+ @Override
+ public String getObject() {
+ return reportlet.getConf() == null ? null : reportlet.getConf().getClass().getName();
+ }
+
+ @Override
+ public void setObject(final String object) {
+ AbstractReportletConf conf = null;
+
+ try {
+ conf = AbstractReportletConf.class.cast(Class.forName(object).newInstance());
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
+ LOG.warn("Error retrieving reportlet configuration instance", e);
+ }
+
+ reportlet.setConf(conf);
+ }
+ });
+
+ conf.setChoices(new ArrayList<>(SyncopeConsoleSession.get().getPlatformInfo().getReportletConfs()));
+
+ conf.addRequiredLabel();
+ add(conf);
+ }
+ }
+
+ public class Configuration extends WizardStep {
+
+ private static final long serialVersionUID = -785981096328637758L;
+
+ private final String[] excluded = new String[] { "serialVersionUID", "class", "name", "reportletClassName" };
+
+ private final ReportletDirectoryPanel.ReportletWrapper reportlet;
+
+ public Configuration(final ReportletDirectoryPanel.ReportletWrapper reportlet) {
+ this.reportlet = reportlet;
+
+ LoadableDetachableModel<List<String>> propViewModel = new LoadableDetachableModel<List<String>>() {
+
+ private static final long serialVersionUID = 5275935387613157437L;
+
+ @Override
+ protected List<String> load() {
+ List<String> result = new ArrayList<String>();
+ if (Configuration.this.reportlet.getConf() != null) {
+ for (Field field : Configuration.this.reportlet.getConf().getClass().getDeclaredFields()) {
+ if (!ArrayUtils.contains(excluded, field.getName())) {
+ result.add(field.getName());
+ }
+ }
+ }
+
+ return result;
+ }
+ };
+
+ add(new ListView<String>("propView", propViewModel) {
+
+ private static final long serialVersionUID = 9101744072914090143L;
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ protected void populateItem(final ListItem<String> item) {
+ final String fieldName = item.getModelObject();
+
+ item.add(new Label("fieldName", new ResourceModel(fieldName, fieldName)));
+
+ Field field = null;
+ try {
+ field = reportlet.getConf().getClass().getDeclaredField(fieldName);
+ } catch (NoSuchFieldException | SecurityException e) {
+ LOG.error("Could not find field {} in class {}", fieldName, reportlet.getConf().getClass(), e);
+ }
+
+ if (field == null) {
+ return;
+ }
+
+ final SearchCondition scondAnnot = field.getAnnotation(SearchCondition.class);
+ final Schema schemaAnnot = field.getAnnotation(Schema.class);
+
+ BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(reportlet.getConf());
+
+ Panel panel;
+
+ if (scondAnnot != null) {
+ final String fiql = (String) wrapper.getPropertyValue(fieldName);
+
+ final List<SearchClause> clauses;
+ if (StringUtils.isEmpty(fiql)) {
+ clauses = new ArrayList<>();
+ } else {
+ clauses = SearchUtils.getSearchClauses(fiql);
+ }
+
+ final AbstractFiqlSearchConditionBuilder builder;
+
+ switch (scondAnnot.type()) {
+ case "USER":
+ panel = new UserSearchPanel.Builder(
+ new ListModel<SearchClause>(clauses)).required(false).build("value");
+ builder = SyncopeClient.getUserSearchConditionBuilder();
+ break;
+ case "GROUP":
+ panel = new GroupSearchPanel.Builder(
+ new ListModel<SearchClause>(clauses)).required(false).build("value");
+ builder = SyncopeClient.getGroupSearchConditionBuilder();
+ break;
+ default:
+ panel = new AnyObjectSearchPanel.Builder(
+ scondAnnot.type(),
+ new ListModel<SearchClause>(clauses)).required(false).build("value");
+ builder = SyncopeClient.getAnyObjectSearchConditionBuilder(null);
+ }
+
+ reportlet.getSCondWrapper().put(fieldName, Pair.of(builder, clauses));
+ } else if (List.class.equals(field.getType())) {
+ Class<?> listItemType = String.class;
+ if (field.getGenericType() instanceof ParameterizedType) {
+ listItemType = (Class<?>) ((ParameterizedType) field.getGenericType()).
+ getActualTypeArguments()[0];
+ }
+
+ if (listItemType.equals(String.class) && schemaAnnot != null) {
+ SchemaRestClient schemaRestClient = new SchemaRestClient();
+
+ List<AbstractSchemaTO> choices;
+ switch (schemaAnnot.schema()) {
+ case UserPlainSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.USER);
+ break;
+
+ case UserDerivedSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.USER);
+ break;
+
+ case UserVirtualSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.USER);
+ break;
+
+ case GroupPlainSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.GROUP);
+ break;
+
+ case GroupDerivedSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.GROUP);
+ break;
+
+ case GroupVirtualSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.GROUP);
+ break;
+
+ case AnyObjectPlainSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.PLAIN, AnyTypeKind.ANY_OBJECT);
+ break;
+
+ case AnyObjectDerivedSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.DERIVED, AnyTypeKind.ANY_OBJECT);
+ break;
+
+ case AnyObjectVirtualSchema:
+ choices = schemaRestClient.getSchemas(SchemaType.VIRTUAL, AnyTypeKind.ANY_OBJECT);
+ break;
+
+ default:
+ choices = Collections.emptyList();
+ }
+
+ panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+ "value",
+ new PropertyModel<List<String>>(reportlet.getConf(), fieldName),
+ new ListModel<String>(
+ CollectionUtils.collect(
+ choices, new Transformer<AbstractSchemaTO, String>() {
+
+ @Override
+ public String transform(final AbstractSchemaTO input) {
+ return input.getKey();
+ }
+ }, new ArrayList<String>()))).hideLabel();
+ } else if (listItemType.isEnum()) {
+ panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+ "value",
+ new PropertyModel<List<String>>(reportlet.getConf(), fieldName),
+ new ListModel(Arrays.asList(listItemType.getEnumConstants()))).hideLabel();
+ } else {
+ if (((List) wrapper.getPropertyValue(fieldName)).isEmpty()) {
+ ((List) wrapper.getPropertyValue(fieldName)).add(null);
+ }
+
+ panel = new MultiFieldPanel.Builder<String>(
+ new PropertyModel<List<String>>(reportlet.getConf(), fieldName)).build(
+ "value",
+ fieldName,
+ buildSinglePanel(field.getType(), fieldName, "panel")).hideLabel();
+ }
+ } else {
+ panel = buildSinglePanel(field.getType(), fieldName, "value").hideLabel();
+ }
+
+ item.add(panel.setRenderBodyOnly(true));
+ }
+ });
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private FieldPanel buildSinglePanel(final Class<?> type, final String fieldName, final String id) {
+ FieldPanel result = null;
+ PropertyModel model = new PropertyModel(reportlet.getConf(), fieldName);
+ if (ClassUtils.isAssignable(Boolean.class, type)) {
+ result = new AjaxCheckBoxPanel(id, fieldName, model);
+ } else if (ClassUtils.isAssignable(Number.class, type)) {
+ result = new AjaxSpinnerFieldPanel.Builder<Number>().build(
+ id, fieldName, (Class<Number>) ClassUtils.resolvePrimitiveIfNecessary(type), model);
+ } else if (Date.class.equals(type)) {
+ result = new DateTimeFieldPanel(id, fieldName, model, SyncopeConstants.DEFAULT_DATE_PATTERN);
+ } else if (type.isEnum()) {
+ result = new AjaxDropDownChoicePanel(id, fieldName, model).setChoices(
+ Arrays.asList(type.getEnumConstants()));
+ }
+
+ // treat as String if nothing matched above
+ if (result == null) {
+ result = new AjaxTextFieldPanel(id, fieldName, model);
+ }
+
+ result.hideLabel();
+ return result;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
index b7b1b45..570c969 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
@@ -18,17 +18,22 @@
*/
package org.apache.syncope.client.console.rest;
+import static org.apache.syncope.client.console.rest.BaseRestClient.getService;
+
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.EntityTOUtils;
import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
import org.apache.syncope.common.lib.to.DerSchemaTO;
import org.apache.syncope.common.lib.to.PlainSchemaTO;
import org.apache.syncope.common.lib.to.VirSchemaTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.SchemaType;
import org.apache.syncope.common.rest.api.beans.SchemaQuery;
+import org.apache.syncope.common.rest.api.service.AnyTypeService;
import org.apache.syncope.common.rest.api.service.SchemaService;
/**
@@ -38,6 +43,45 @@ public class SchemaRestClient extends BaseRestClient {
private static final long serialVersionUID = -2479730152700312373L;
+ public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final AnyTypeKind kind) {
+ final AnyTypeService client = getService(AnyTypeService.class);
+
+ final List<String> classes = new ArrayList<>();
+
+ switch (kind) {
+ case USER:
+ case GROUP:
+ final AnyTypeTO type = client.read(kind.name());
+ if (type != null) {
+ classes.addAll(type.getClasses());
+ }
+ break;
+ default:
+ for (AnyTypeTO anyTypeTO : getService(AnyTypeService.class).list()) {
+ if (anyTypeTO.getKind() != AnyTypeKind.USER && anyTypeTO.getKind() != AnyTypeKind.GROUP) {
+ classes.addAll(anyTypeTO.getClasses());
+ }
+ }
+ }
+ return getSchemas(schemaType, classes.toArray(new String[] {}));
+ }
+
+ public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final String typeName) {
+ AnyTypeTO type = null;
+
+ try {
+ type = getService(AnyTypeService.class).read(typeName);
+ } catch (SyncopeClientException e) {
+ LOG.error("While reading all any types", e);
+ }
+
+ if (type == null) {
+ return getSchemas(schemaType);
+ } else {
+ return getSchemas(schemaType, type.getClasses().toArray(new String[] {}));
+ }
+ }
+
public <T extends AbstractSchemaTO> List<T> getSchemas(final SchemaType schemaType, final String... kind) {
List<T> schemas = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index bc62538..b28998f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -144,8 +144,13 @@ public class BaseModal<T extends Serializable> extends Modal<T> {
return this;
}
- public BaseModal<T> changeCloseButtonLabel(final String label, final AjaxRequestTarget target) {
+ public BaseModal<T> changeCloseButtonLabel(final String label) {
defaultModalCloseButton.getModel().setObject(label);
+ return this;
+ }
+
+ public BaseModal<T> changeCloseButtonLabel(final String label, final AjaxRequestTarget target) {
+ changeCloseButtonLabel(label);
target.add(defaultModalCloseButton);
return this;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 0d9c074..a79e4a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -50,6 +50,7 @@ public abstract class ActionLink<T extends Serializable> implements Serializable
FO_EDIT("read"),
HTML_EDIT("read"),
TEXT_EDIT("read"),
+ COMPOSE("update"),
LAYOUT_EDIT("read"),
RESET("update"),
ENABLE("update"),
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 69bb761..85bfb20 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -65,6 +65,7 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
super.add(new Fragment("panelFoEdit", "emptyFragment", this));
super.add(new Fragment("panelHtmlEdit", "emptyFragment", this));
super.add(new Fragment("panelTextEdit", "emptyFragment", this));
+ super.add(new Fragment("panelCompose", "emptyFragment", this));
super.add(new Fragment("panelLayoutEdit", "emptyFragment", this));
super.add(new Fragment("panelReset", "emptyFragment", this));
super.add(new Fragment("panelEnable", "emptyFragment", this));
@@ -388,6 +389,25 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
}.setVisible(link.isEnabled(model.getObject())));
break;
+ case COMPOSE:
+ fragment = new Fragment("panelCompose", "fragmentCompose", this);
+
+ fragment.addOrReplace(new IndicatingAjaxLink<Void>("composeLink") {
+
+ private static final long serialVersionUID = -1876519166660008562L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target) {
+ link.onClick(target, model.getObject());
+ }
+
+ @Override
+ public String getAjaxIndicatorMarkupId() {
+ return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId();
+ }
+ }.setVisible(link.isEnabled(model.getObject())));
+ break;
+
case LAYOUT_EDIT:
fragment = new Fragment("panelLayoutEdit", "fragmentLayoutEdit", this);
@@ -904,6 +924,10 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
super.addOrReplace(new Fragment("panelCreate", "emptyFragment", this));
break;
+ case COMPOSE:
+ super.addOrReplace(new Fragment("panelCompose", "emptyFragment", this));
+ break;
+
case EDIT:
super.addOrReplace(new Fragment("panelEdit", "emptyFragment", this));
break;
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
index b0b5e94..bf16686 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
@@ -58,7 +58,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
public AjaxPalettePanel(
final String id, final IModel<List<T>> model, final Builder.Query<T> choices, final Builder<T> builder) {
- super(id, id, model);
+ super(id, builder.name == null ? id : builder.name, model);
choicesModel = new PaletteLoadableDetachableModel(builder) {
@@ -74,7 +74,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
public AjaxPalettePanel(
final String id, final IModel<List<T>> model, final ListModel<T> choices, final Builder<T> builder) {
- super(id, id, model);
+ super(id, builder.name == null ? id : builder.name, model);
choicesModel = new PaletteLoadableDetachableModel(builder) {
@@ -218,6 +218,8 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
private String filter = conf.getDefaultFilter();
+ private String name;
+
public Builder() {
this.allowMoveAll = false;
this.allowOrder = false;
@@ -225,6 +227,11 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
this.renderer = new SelectChoiceRenderer<>();
}
+ public Builder<T> setName(final String name) {
+ this.name = name;
+ return this;
+ }
+
public Builder<T> setAllowOrder(final boolean allowOrder) {
this.allowOrder = allowOrder;
return this;
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
index 9d6d76a..65dc06a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
@@ -24,11 +24,15 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEventSink;
import org.apache.wicket.extensions.wizard.WizardModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public abstract class AjaxWizardBuilder<T extends Serializable> extends AbstractModalPanelBuilder<T> {
private static final long serialVersionUID = 5241745929825564456L;
+ protected static final Logger LOG = LoggerFactory.getLogger(AjaxWizardBuilder.class);
+
protected AjaxWizard.Mode mode = AjaxWizard.Mode.CREATE;
protected IEventSink eventSink = null;
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/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 74ad18d..430ed35 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
@@ -67,6 +67,8 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
protected final AjaxLink<?> addAjaxLink;
+ protected final AjaxLink<?> exitAjaxLink;
+
protected ModalPanelBuilder<T> newItemPanelBuilder;
protected NotificationPanel notificationPanel;
@@ -123,6 +125,20 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
addAjaxLink.setVisible(false);
initialFragment.addOrReplace(addAjaxLink);
+ exitAjaxLink = new AjaxLink<T>("exit") {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target) {
+ send(WizardMgtPanel.this, Broadcast.EXACT, new ExitEvent(target));
+ }
+ };
+
+ exitAjaxLink.setEnabled(false);
+ exitAjaxLink.setVisible(false);
+ initialFragment.addOrReplace(exitAjaxLink);
+
add(new ListView<Component>("outerObjectsRepeater", outerObjects) {
private static final long serialVersionUID = -9180479401817023838L;
@@ -138,7 +154,11 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
@Override
@SuppressWarnings("unchecked")
public void onEvent(final IEvent<?> event) {
- if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
+ if (event.getPayload() instanceof ExitEvent && modal != null) {
+ final AjaxRequestTarget target = ExitEvent.class.cast(event.getPayload()).getTarget();
+ // default behaviour: change it catching the event if needed
+ modal.close(target);
+ } else if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
final AjaxWizard.NewItemEvent<T> newItemEvent = AjaxWizard.NewItemEvent.class.cast(event.getPayload());
final AjaxRequestTarget target = newItemEvent.getTarget();
final T item = newItemEvent.getItem();
@@ -169,7 +189,6 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
}
} else if (event.getPayload() instanceof AjaxWizard.NewItemCancelEvent) {
if (wizardInModal) {
- modal.show(false);
modal.close(target);
} else {
container.addOrReplace(initialFragment);
@@ -187,23 +206,21 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
@Override
protected void closeAction(final AjaxRequestTarget target) {
- modal.show(false);
modal.close(target);
}
@Override
- protected Panel customResultBody(
- final String id, final T item, final Serializable result) {
+ protected Panel customResultBody(final String id, final T item, final Serializable result) {
return WizardMgtPanel.this.customResultBody(id, item, result);
}
});
target.add(modal.getForm());
} else if (wizardInModal) {
- modal.show(false);
modal.close(target);
} else {
container.addOrReplace(initialFragment);
}
+ customActionOnCloseCallback(target);
}
if (containerAutoRefresh) {
@@ -230,6 +247,17 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
}
/**
+ * Show exit butto sending ExitEvent paylad.
+ *
+ * @return the current instance.
+ */
+ protected final WizardMgtPanel<T> enableExitButton() {
+ exitAjaxLink.setEnabled(true);
+ exitAjaxLink.setVisible(true);
+ return this;
+ }
+
+ /**
* Add object inside the main container.
*
* @param childs components to be added.
@@ -298,7 +326,6 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
@Override
public void onClose(final AjaxRequestTarget target) {
modal.show(false);
- customActionOnCloseCallback(target);
}
});
}
@@ -384,4 +411,17 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
return this;
}
}
+
+ public static class ExitEvent {
+
+ private final AjaxRequestTarget target;
+
+ public ExitEvent(final AjaxRequestTarget target) {
+ this.target = target;
+ }
+
+ public AjaxRequestTarget getTarget() {
+ return target;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index c854b05..5e3db1b 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -261,7 +261,7 @@ div.wizard-view div.wizard-view{
.wizard-view > div {
display: block;
- height: 98%;
+ height: 95%;
position: relative;
}
@@ -640,10 +640,18 @@ START - Search - AjaxDateTimePicker
width: 120px !important;
}
+.clause .type button{
+ width: 120px !important;
+}
+
.clause .property{
width: 190px;
}
+.clause .property button{
+ width: 190px;
+}
+
.clause .comparator{
width: 100px;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
index 5b05753..d63f1c0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
@@ -33,3 +33,5 @@ any.new=New Report
any.finish=Submit Report
any.cancel=Cancel Report
report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
index 89ec0ab..8449d96 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
@@ -33,3 +33,5 @@ any.new=Nuovo Report
any.finish=Conferma Report
any.cancel=Annulla Report
report.view=Esecuzioni del report '${key}'
+reportlet.conf=Configurazione reportlet per ${key}
+close=Close
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
index d13bf06..a0ad069 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
@@ -33,3 +33,5 @@ any.new=New Report
any.finish=Submit Report
any.cancel=Cancel Report
report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
index 18fee1d..f6124f7 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
@@ -41,3 +41,5 @@ any.finish=Submit Report
any.cancel=Cancel Report
# task.view=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b8 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
report.view=Executions of report '${key}'
+reportlet.conf=Reportlet configuration for ${key}
+close=Close
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
index b090ddd..1345bdb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
@@ -18,7 +18,7 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
- <div class="form-group"><span wicket:id="name">[id]</span></div>
+ <div class="form-group"><span wicket:id="name">[name]</span></div>
<div class="form-group"><span wicket:id="template">[template]</span></div>
<div class="form-group"><span wicket:id="active">[active]</span></div>
</wicket:panel>
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.properties
@@ -0,0 +1,19 @@
+# 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.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
new file mode 100644
index 0000000..7a16c3b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_it.properties
@@ -0,0 +1,19 @@
+# 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.
+reportlet=Reportlet
+profile=Profilo
+configuration=Configurazione
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_pt_BR.properties
@@ -0,0 +1,19 @@
+# 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.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
new file mode 100644
index 0000000..680d073
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletDirectoryPanel_ru.properties
@@ -0,0 +1,19 @@
+# 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.
+reportlet=Reportlet
+profile=Profile
+configuration=Configuration
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
new file mode 100644
index 0000000..3d58410
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.html
@@ -0,0 +1,28 @@
+<!--
+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:panel>
+ <div wicket:id="propView">
+ <div class="form-group inforow">
+ <label wicket:id="fieldName">[LABEL]</label>
+ <span wicket:id="value">[value]</span>
+ </div>
+ </div>
+ </wicket:panel>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
new file mode 100644
index 0000000..8d2c500
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration.properties
@@ -0,0 +1,24 @@
+# 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.
+plainAttrs=Plain Attributes
+derAttrs=Derived Attributes
+virAttrs=Virtual Attributes
+features=Features
+matchingCond=Matching Condition
+userMatchingCond=User Matching Condition
+groupMatchingCond=Group Matching Condition
+anyObjectMatchingCond=AnyObject Matching Condition
http://git-wip-us.apache.org/repos/asf/syncope/blob/2b0960de/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
new file mode 100644
index 0000000..6688f85
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportletWizardBuilder$Configuration_it.properties
@@ -0,0 +1,24 @@
+# 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.
+plainAttrs=Attributi
+derAttrs=Attributi Derivati
+virAttrs=Attributi Virtuali
+features=Features
+matchingCond=Condizione di matching
+userMatchingCond=Condizione di matching utente
+groupMatchingCond=Condizione di matching gruppo
+anyObjectMatchingCond=Condizione di matching any