This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/master by this push: new 37f44bf [SYNCOPE-1531] Better busy management for CSV export 37f44bf is described below commit 37f44bf5573a5d0c1c1f99e6e2658824a7fd0a3c Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Sun Mar 15 11:09:16 2020 +0100 [SYNCOPE-1531] Better busy management for CSV export --- ...AnyDirectoryPanelAdditionalActionsProvider.java | 25 +++--- .../console/wizards/CSVPushWizardBuilder.java | 16 +++- .../client/ui/commons/HttpResourceStream.java | 44 +++------- .../ResponseHolder.java} | 51 +++--------- .../client/ui/commons/wizards/AjaxWizard.java | 97 +++++++++++----------- .../ui/commons/wizards/AjaxWizardBuilder.java | 19 +++-- .../client/console/SerializableSupplier.java | 26 ------ .../syncope/client/console/pages/BasePage.java | 5 +- .../console/reports/ReportExecutionDetails.java | 21 ++--- .../console/tasks/SchedTaskDirectoryPanel.java | 14 +++- .../wicket/ajax/form/AjaxDownloadBehavior.java | 19 ++--- .../wicket/markup/html/form/BinaryFieldPanel.java | 3 +- .../wicket/markup/html/link/VeilPopupSettings.java | 3 +- .../enduser/markup/html/form/BinaryFieldPanel.java | 4 +- .../enduser/wizards/any/AnyWizardBuilder.java | 5 +- .../client/lib/SyncopeClientFactoryBean.java | 1 + .../core/provisioning/java/VirAttrHandlerImpl.java | 2 +- .../client/console/panels/SAML2SPPanel.java | 5 +- 18 files changed, 155 insertions(+), 205 deletions(-) diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java index 8118fc4..4d05f8f 100644 --- a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java +++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionsProvider.java @@ -88,12 +88,6 @@ public class IdMAnyDirectoryPanelAdditionalActionsProvider implements AnyDirecto AjaxWizard.NewItemFinishEvent<?> payload = (AjaxWizard.NewItemFinishEvent) event.getPayload(); Optional<AjaxRequestTarget> target = payload.getTarget(); - SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED)); - if (target.isPresent()) { - ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target.get()); - target.get().add(container); - } - if (payload.getResult() instanceof ArrayList) { modal.setContent(new ResultPage<Serializable>( null, @@ -116,13 +110,20 @@ public class IdMAnyDirectoryPanelAdditionalActionsProvider implements AnyDirecto } }); target.ifPresent(t -> t.add(modal.getForm())); + + SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED)); } else if (Constants.OPERATION_SUCCEEDED.equals(payload.getResult())) { - target.ifPresent(t -> { - if (csvDownloadBehavior.hasResponse()) { - csvDownloadBehavior.initiate(t); - } - modal.close(t); - }); + target.ifPresent(modal::close); + SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED)); + } else if (payload.getResult() instanceof Exception) { + SyncopeConsoleSession.get().onException((Exception) payload.getResult()); + } else { + SyncopeConsoleSession.get().error(payload.getResult()); + } + + if (target.isPresent()) { + ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target.get()); + target.get().add(container); } } } diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java index ee2af97..2f07a4e 100644 --- a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java +++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/CSVPushWizardBuilder.java @@ -29,6 +29,7 @@ import org.apache.syncope.client.ui.commons.Constants; import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel; import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel; import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.syncope.common.lib.to.EntityTO; import org.apache.syncope.common.lib.types.IdMImplementationType; import org.apache.syncope.common.lib.types.MatchingRule; @@ -36,6 +37,7 @@ import org.apache.syncope.common.lib.types.UnmatchingRule; import org.apache.syncope.common.rest.api.beans.AnyQuery; import org.apache.syncope.common.rest.api.beans.CSVPushSpec; import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.event.IEventSink; import org.apache.wicket.extensions.wizard.WizardModel; import org.apache.wicket.extensions.wizard.WizardStep; @@ -43,6 +45,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.util.ListModel; +import org.apache.wicket.request.cycle.RequestCycle; public class CSVPushWizardBuilder extends BaseAjaxWizardBuilder<CSVPushSpec> { @@ -71,8 +74,17 @@ public class CSVPushWizardBuilder extends BaseAjaxWizardBuilder<CSVPushSpec> { @Override protected Serializable onApplyInternal(final CSVPushSpec modelObject) { - downloadBehavior.setResponse(() -> ReconciliationRestClient.push(query, modelObject)); - return Constants.OPERATION_SUCCEEDED; + return RequestCycle.get().find(AjaxRequestTarget.class).map(target -> { + try { + downloadBehavior.setResponse(new ResponseHolder(ReconciliationRestClient.push(query, modelObject))); + downloadBehavior.initiate(target); + + return Constants.OPERATION_SUCCEEDED; + } catch (Exception e) { + LOG.error("While dowloading CSV export", e); + return e; + } + }).orElse(Constants.ERROR); } @Override diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java index eb08743..7bc8191 100644 --- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java +++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java @@ -22,11 +22,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Optional; - -import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.wicket.util.lang.Bytes; import org.apache.wicket.util.resource.AbstractResourceStream; import org.apache.wicket.util.resource.IFixedLocationResourceStream; @@ -36,46 +33,25 @@ public class HttpResourceStream extends AbstractResourceStream implements IFixed private static final long serialVersionUID = 5811207817876330189L; - private transient InputStream inputStream; - - private String contentType; - - private String location; + private final ResponseHolder responseHolder; - private String filename; - - public HttpResourceStream(final Response response) { + public HttpResourceStream(final ResponseHolder responseHolder) { super(); - - Object entity = response.getEntity(); - if (response.getStatusInfo().getStatusCode() == Response.Status.OK.getStatusCode() - && (entity instanceof InputStream)) { - - this.inputStream = (InputStream) entity; - this.contentType = response.getHeaderString(HttpHeaders.CONTENT_TYPE); - this.location = response.getLocation() == null ? null : response.getLocation().toASCIIString(); - String contentDisposition = response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION); - if (StringUtils.isNotBlank(contentDisposition)) { - String[] splitted = contentDisposition.split("="); - if (splitted.length > 1) { - this.filename = splitted[1].trim(); - } - } - } + this.responseHolder = responseHolder; } @Override public InputStream getInputStream() throws ResourceStreamNotFoundException { - return inputStream == null + return responseHolder.getInputStream() == null ? new ByteArrayInputStream(new byte[0]) - : inputStream; + : responseHolder.getInputStream(); } @Override public Bytes length() { - return inputStream == null + return responseHolder.getInputStream() == null ? Bytes.bytes(0) : null; } @@ -87,15 +63,15 @@ public class HttpResourceStream extends AbstractResourceStream implements IFixed @Override public String locationAsString() { - return location; + return responseHolder.getLocation(); } @Override public String getContentType() { - return Optional.ofNullable(contentType).orElse(MediaType.APPLICATION_OCTET_STREAM); + return Optional.ofNullable(responseHolder.getContentType()).orElse(MediaType.APPLICATION_OCTET_STREAM); } public String getFilename() { - return filename; + return responseHolder.getFilename(); } } diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/rest/ResponseHolder.java similarity index 59% copy from client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java copy to client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/rest/ResponseHolder.java index eb08743..8c8b186 100644 --- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/HttpResourceStream.java +++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/rest/ResponseHolder.java @@ -16,25 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.syncope.client.ui.commons; +package org.apache.syncope.client.ui.commons.rest; -import java.io.ByteArrayInputStream; -import java.io.IOException; import java.io.InputStream; -import java.util.Optional; - +import java.io.Serializable; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; -import org.apache.wicket.util.lang.Bytes; -import org.apache.wicket.util.resource.AbstractResourceStream; -import org.apache.wicket.util.resource.IFixedLocationResourceStream; -import org.apache.wicket.util.resource.ResourceStreamNotFoundException; -public class HttpResourceStream extends AbstractResourceStream implements IFixedLocationResourceStream { +public class ResponseHolder implements Serializable { - private static final long serialVersionUID = 5811207817876330189L; + private static final long serialVersionUID = 2627155013246805827L; private transient InputStream inputStream; @@ -44,9 +36,7 @@ public class HttpResourceStream extends AbstractResourceStream implements IFixed private String filename; - public HttpResourceStream(final Response response) { - super(); - + public ResponseHolder(final Response response) { Object entity = response.getEntity(); if (response.getStatusInfo().getStatusCode() == Response.Status.OK.getStatusCode() && (entity instanceof InputStream)) { @@ -57,44 +47,25 @@ public class HttpResourceStream extends AbstractResourceStream implements IFixed String contentDisposition = response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION); if (StringUtils.isNotBlank(contentDisposition)) { String[] splitted = contentDisposition.split("="); - if (splitted.length > 1) { + if (splitted != null && splitted.length > 1) { this.filename = splitted[1].trim(); } } } } - @Override - public InputStream getInputStream() - throws ResourceStreamNotFoundException { - - return inputStream == null - ? new ByteArrayInputStream(new byte[0]) - : inputStream; - } - - @Override - public Bytes length() { - return inputStream == null - ? Bytes.bytes(0) - : null; + public InputStream getInputStream() { + return inputStream; } - @Override - public void close() throws IOException { - // No need for explict closing + public String getContentType() { + return contentType; } - @Override - public String locationAsString() { + public String getLocation() { return location; } - @Override - public String getContentType() { - return Optional.ofNullable(contentType).orElse(MediaType.APPLICATION_OCTET_STREAM); - } - public String getFilename() { return filename; } diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.java index a0191aa..8b6edc3 100644 --- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.java +++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizard.java @@ -77,19 +77,20 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard private final Mode mode; + private final boolean async; + private IEventSink eventSink; private final PageReference pageRef; - private AjaxWizardMgtButtonBar<T> buttonBar; - /** * Construct. * - * @param id The component id. - * @param item model object. + * @param id The component id + * @param item model object * @param model wizard model - * @param mode {@code true} if edit mode. + * @param mode mode + * @param async should apply go async or not? * @param pageRef caller page reference. */ public AjaxWizard( @@ -97,10 +98,13 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard final T item, final WizardModel model, final Mode mode, + final boolean async, final PageReference pageRef) { + super(id); this.item = item; this.mode = mode; + this.async = async; this.pageRef = pageRef; if (mode == Mode.READONLY) { @@ -147,7 +151,7 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard getForm().remove(FEEDBACK_ID); if (mode == Mode.READONLY) { - final Iterator<IWizardStep> iter = wizardModel.stepIterator(); + Iterator<IWizardStep> iter = wizardModel.stepIterator(); while (iter.hasNext()) { WizardStep.class.cast(iter.next()).setEnabled(false); } @@ -156,12 +160,7 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard @Override protected Component newButtonBar(final String id) { - this.buttonBar = new AjaxWizardMgtButtonBar<>(id, this, mode); - return this.buttonBar; - } - - public AjaxWizardMgtButtonBar<T> getButtonBar() { - return buttonBar; + return new AjaxWizardMgtButtonBar<>(id, this, mode); } protected abstract void onCancelInternal(); @@ -246,6 +245,43 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard return this; } + @Override + public void onSubmit(final AjaxRequestTarget target) { + try { + onApply(target); + } catch (TimeoutException te) { + LOG.warn("Operation took too long", te); + send(eventSink, Broadcast.EXACT, new NewItemCancelEvent<>(item, target)); + sendWarning(getString("timeout")); + ((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target); + } + } + + @Override + public void onError(final AjaxRequestTarget target) { + ((BaseWebPage) getPage()).getNotificationPanel().refresh(target); + } + + private Serializable onApply(final AjaxRequestTarget target) throws TimeoutException { + try { + Future<Pair<Serializable, Serializable>> executor = execute(new ApplyFuture(target)); + + Pair<Serializable, Serializable> res = + executor.get(getMaxWaitTimeInSeconds(), TimeUnit.SECONDS); + + if (res.getLeft() != null) { + send(pageRef.getPage(), Broadcast.BUBBLE, res.getLeft()); + } + + return res.getRight(); + } catch (InterruptedException | ExecutionException e) { + if (e.getCause() instanceof CaptchaNotMatchingException) { + throw (CaptchaNotMatchingException) e.getCause(); + } + throw new WicketRuntimeException(e); + } + } + public abstract static class NewItemEvent<T extends Serializable> { private final T item; @@ -372,43 +408,6 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard } } - @Override - public void onSubmit(final AjaxRequestTarget target) { - try { - onApply(target); - } catch (TimeoutException te) { - LOG.warn("Operation took too long", te); - send(eventSink, Broadcast.EXACT, new NewItemCancelEvent<>(item, target)); - sendWarning(getString("timeout")); - ((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target); - } - } - - @Override - public void onError(final AjaxRequestTarget target) { - ((BaseWebPage) getPage()).getNotificationPanel().refresh(target); - } - - private Serializable onApply(final AjaxRequestTarget target) throws TimeoutException { - try { - Future<Pair<Serializable, Serializable>> executor = execute(new ApplyFuture(target)); - - Pair<Serializable, Serializable> res = - executor.get(getMaxWaitTimeInSeconds(), TimeUnit.SECONDS); - - if (res.getLeft() != null) { - send(pageRef.getPage(), Broadcast.BUBBLE, res.getLeft()); - } - - return res.getRight(); - } catch (InterruptedException | ExecutionException e) { - if (e.getCause() instanceof CaptchaNotMatchingException) { - throw (CaptchaNotMatchingException) e.getCause(); - } - throw new WicketRuntimeException(e); - } - } - private class ApplyFuture implements Callable<Pair<Serializable, Serializable>>, Serializable { private static final long serialVersionUID = -4657123322652656848L; diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java index ea517e4..5c8575a 100644 --- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java +++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/AjaxWizardBuilder.java @@ -43,6 +43,8 @@ public abstract class AjaxWizardBuilder<T extends Serializable> extends Abstract protected final List<Component> outerObjects = new ArrayList<>(); + private boolean async = true; + /** * Construct. * @@ -53,14 +55,19 @@ public abstract class AjaxWizardBuilder<T extends Serializable> extends Abstract super(defaultItem, pageRef); } - public final AjaxWizardBuilder<T> addOuterObject(final Component... childs) { + public AjaxWizardBuilder<T> setAsync(final boolean async) { + this.async = async; + return this; + } + + public AjaxWizardBuilder<T> addOuterObject(final Component... childs) { outerObjects.addAll(List.of(childs)); return this; } @Override public AjaxWizard<T> build(final String id, final int index, final AjaxWizard.Mode mode) { - final AjaxWizard<T> wizard = build(id, mode); + AjaxWizard<T> wizard = build(id, mode); for (int i = 1; i < index; i++) { wizard.getWizardModel().next(); } @@ -88,20 +95,20 @@ public abstract class AjaxWizardBuilder<T extends Serializable> extends Abstract this.mode = mode; // get the specified item if available - final T modelObject = newModelObject(); + T modelObj = newModelObject(); - return new AjaxWizard<T>(id, modelObject, buildModelSteps(modelObject, new WizardModel()), mode, pageRef) { + return new AjaxWizard<T>(id, modelObj, buildModelSteps(modelObj, new WizardModel()), mode, async, pageRef) { private static final long serialVersionUID = 7770507663760640735L; @Override protected void onCancelInternal() { - AjaxWizardBuilder.this.onCancelInternal(modelObject); + AjaxWizardBuilder.this.onCancelInternal(modelObj); } @Override protected Pair<Serializable, Serializable> onApplyInternal(final AjaxRequestTarget target) { - Serializable res = AjaxWizardBuilder.this.onApplyInternal(modelObject); + Serializable res = AjaxWizardBuilder.this.onApplyInternal(modelObj); Serializable payload; switch (mode) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java deleted file mode 100644 index da3eb79..0000000 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SerializableSupplier.java +++ /dev/null @@ -1,26 +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; - -import java.io.Serializable; -import java.util.function.Supplier; - -@FunctionalInterface -public interface SerializableSupplier<T> extends Supplier<T>, Serializable { -} diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java index 324769b..d2c1e32 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java @@ -35,6 +35,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas import org.apache.syncope.client.console.widgets.ExtAlertWidget; import org.apache.syncope.client.ui.commons.Constants; import org.apache.syncope.client.ui.commons.pages.BaseWebPage; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.info.PlatformInfo; import org.apache.syncope.common.lib.info.SystemInfo; @@ -121,8 +122,8 @@ public class BasePage extends BaseWebPage { @Override public void onClick() { try { - HttpResourceStream stream = - new HttpResourceStream(SyncopeRestClient.exportInternalStorageContent()); + HttpResourceStream stream = new HttpResourceStream( + new ResponseHolder(SyncopeRestClient.exportInternalStorageContent())); ResourceStreamRequestHandler rsrh = new ResourceStreamRequestHandler(stream); rsrh.setFileName(stream.getFilename() == null diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java index 2009bbb..5d820e0 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java @@ -25,6 +25,7 @@ import org.apache.syncope.client.console.tasks.ExecutionsDirectoryPanel; import org.apache.syncope.client.console.wicket.ajax.form.AjaxDownloadBehavior; 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.ui.commons.rest.ResponseHolder; import org.apache.syncope.common.lib.to.ExecTO; import org.apache.syncope.common.lib.to.ReportTO; import org.apache.syncope.common.lib.types.IdRepoEntitlement; @@ -85,8 +86,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel { @Override public void onClick(final AjaxRequestTarget target, final ExecTO ignore) { - downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult( - model.getObject().getKey(), ReportExecExportFormat.CSV)); + downloadBehavior.setResponse(new ResponseHolder(ReportRestClient.exportExecutionResult( + model.getObject().getKey(), ReportExecExportFormat.CSV))); downloadBehavior.initiate(target); } }, ActionLink.ActionType.EXPORT_CSV, IdRepoEntitlement.REPORT_READ); @@ -97,8 +98,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel { @Override public void onClick(final AjaxRequestTarget target, final ExecTO ignore) { - downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult( - model.getObject().getKey(), ReportExecExportFormat.HTML)); + downloadBehavior.setResponse(new ResponseHolder(ReportRestClient.exportExecutionResult( + model.getObject().getKey(), ReportExecExportFormat.HTML))); downloadBehavior.initiate(target); } }, ActionLink.ActionType.EXPORT_HTML, IdRepoEntitlement.REPORT_READ); @@ -109,8 +110,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel { @Override public void onClick(final AjaxRequestTarget target, final ExecTO ignore) { - downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult( - model.getObject().getKey(), ReportExecExportFormat.PDF)); + downloadBehavior.setResponse(new ResponseHolder(ReportRestClient.exportExecutionResult( + model.getObject().getKey(), ReportExecExportFormat.PDF))); downloadBehavior.initiate(target); } }, ActionLink.ActionType.EXPORT_PDF, IdRepoEntitlement.REPORT_READ); @@ -121,8 +122,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel { @Override public void onClick(final AjaxRequestTarget target, final ExecTO ignore) { - downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult( - model.getObject().getKey(), ReportExecExportFormat.RTF)); + downloadBehavior.setResponse(new ResponseHolder(ReportRestClient.exportExecutionResult( + model.getObject().getKey(), ReportExecExportFormat.RTF))); downloadBehavior.initiate(target); } }, ActionLink.ActionType.EXPORT_RTF, IdRepoEntitlement.REPORT_READ); @@ -133,8 +134,8 @@ public class ReportExecutionDetails extends MultilevelPanel.SecondLevel { @Override public void onClick(final AjaxRequestTarget target, final ExecTO ignore) { - downloadBehavior.setResponse(() -> ReportRestClient.exportExecutionResult( - model.getObject().getKey(), ReportExecExportFormat.XML)); + downloadBehavior.setResponse(new ResponseHolder(ReportRestClient.exportExecutionResult( + model.getObject().getKey(), ReportExecExportFormat.XML))); downloadBehavior.initiate(target); } }, ActionLink.ActionType.EXPORT_XML, IdRepoEntitlement.REPORT_READ); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java index 2cfa4a4..ff0fd28 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java @@ -32,6 +32,7 @@ import org.apache.syncope.client.console.commons.TaskDataProvider; import org.apache.syncope.client.console.pages.BasePage; import org.apache.syncope.client.console.panels.MultilevelPanel; import org.apache.syncope.client.console.rest.TaskRestClient; +import org.apache.syncope.client.console.wicket.ajax.IndicatorAjaxTimerBehavior; 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; @@ -65,6 +66,7 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; +import org.apache.wicket.util.time.Duration; /** * Tasks page. @@ -112,6 +114,17 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO> initResultTable(); + container.add(new IndicatorAjaxTimerBehavior(Duration.seconds(10)) { + + private static final long serialVersionUID = -4661303265651934868L; + + @Override + protected void onTimer(final AjaxRequestTarget target) { + container.modelChanged(); + target.add(container); + } + }); + startAt = new TaskStartAtTogglePanel(container, pageRef); addInnerObject(startAt); @@ -128,7 +141,6 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO> return targetObject; } }; - addInnerObject(templates); } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java index 01cf3ec..3a38e91 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/form/AjaxDownloadBehavior.java @@ -18,9 +18,8 @@ */ package org.apache.syncope.client.console.wicket.ajax.form; -import javax.ws.rs.core.Response; -import org.apache.syncope.client.console.SerializableSupplier; import org.apache.syncope.client.ui.commons.HttpResourceStream; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.AbstractAjaxBehavior; import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; @@ -34,14 +33,10 @@ public class AjaxDownloadBehavior extends AbstractAjaxBehavior { protected static final Logger LOG = LoggerFactory.getLogger(AjaxDownloadBehavior.class); - protected SerializableSupplier<Response> response; + protected ResponseHolder responseHolder; - public boolean hasResponse() { - return response != null; - } - - public void setResponse(final SerializableSupplier<Response> response) { - this.response = response; + public void setResponse(final ResponseHolder response) { + this.responseHolder = response; } /** @@ -57,9 +52,9 @@ public class AjaxDownloadBehavior extends AbstractAjaxBehavior { protected HttpResourceStream getResourceStream() { HttpResourceStream stream = null; - if (response != null) { - stream = new HttpResourceStream(response.get()); - response = null; + if (responseHolder != null) { + stream = new HttpResourceStream(responseHolder); + responseHolder = null; } return stream; diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java index 5ce72d7..ee4ff43 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java @@ -41,6 +41,7 @@ import org.apache.syncope.client.ui.commons.HttpResourceStream; import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel; import org.apache.syncope.client.ui.commons.markup.html.form.preview.AbstractBinaryPreviewer; import org.apache.syncope.client.ui.commons.markup.html.form.BaseBinaryFieldPanel; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; @@ -155,7 +156,7 @@ public class BinaryFieldPanel extends BaseBinaryFieldPanel { @Override protected HttpResourceStream getResourceStream() { - return new HttpResourceStream(buildResponse()); + return new HttpResourceStream(new ResponseHolder(buildResponse())); } }; diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/link/VeilPopupSettings.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/link/VeilPopupSettings.java index e7ce827..418e190 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/link/VeilPopupSettings.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/link/VeilPopupSettings.java @@ -35,7 +35,6 @@ public class VeilPopupSettings extends PopupSettings { + " window.location.reload(false);" + " }" + "}, 1000);" - + "return false"; + + "return false;"; } - } diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/BinaryFieldPanel.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/BinaryFieldPanel.java index e7a629e..5343661 100644 --- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/BinaryFieldPanel.java +++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/BinaryFieldPanel.java @@ -40,6 +40,7 @@ import org.apache.syncope.client.ui.commons.markup.html.form.BaseBinaryFieldPane import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel; import org.apache.syncope.client.ui.commons.markup.html.form.preview.AbstractBinaryPreviewer; import org.apache.syncope.client.ui.commons.pages.BaseWebPage; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; @@ -153,9 +154,8 @@ public class BinaryFieldPanel extends BaseBinaryFieldPanel { @Override protected HttpResourceStream getResourceStream() { - return new HttpResourceStream(buildResponse()); + return new HttpResourceStream(new ResponseHolder(buildResponse())); } - }; add(fileDownload); diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/AnyWizardBuilder.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/AnyWizardBuilder.java index 13c3339..a78560b 100644 --- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/AnyWizardBuilder.java +++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/AnyWizardBuilder.java @@ -172,8 +172,8 @@ public abstract class AnyWizardBuilder extends AbstractAnyWizardBuilder<UserTO> // get the specified item if available final AnyWrapper<UserTO> modelObject = newModelObject(); - return new AjaxWizard<AnyWrapper<UserTO>>(id, modelObject, buildModelSteps(modelObject, new WizardModel()), - mode, this.pageRef) { + return new AjaxWizard<AnyWrapper<UserTO>>( + id, modelObject, buildModelSteps(modelObject, new WizardModel()), mode, true, this.pageRef) { private static final long serialVersionUID = 7770507663760640735L; @@ -294,5 +294,4 @@ public abstract class AnyWizardBuilder extends AbstractAnyWizardBuilder<UserTO> }.setEventSink(eventSink).addOuterObject(outerObjects); } - } diff --git a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java index 7244a4d..572bc1a 100644 --- a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java +++ b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java @@ -228,6 +228,7 @@ public class SyncopeClientFactoryBean { * Sets the client TLS configuration. * * @param tlsClientParameters client TLS configuration + * @return the current instance */ public SyncopeClientFactoryBean setTlsClientParameters(final TLSClientParameters tlsClientParameters) { this.tlsClientParameters = tlsClientParameters; diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java index 11cdc39..5e6787a 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java @@ -66,7 +66,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler { @Override public void setValues(final Any<?> any, final ConnectorObject connObj) { if (any == null) { - LOG.warn("Null any passed, ignoring"); + LOG.debug("Null any passed, ignoring"); return; } diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPPanel.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPPanel.java index 81bfeef..1cfe352 100644 --- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPPanel.java +++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPPanel.java @@ -21,6 +21,7 @@ package org.apache.syncope.client.console.panels; import javax.ws.rs.client.ClientBuilder; import org.apache.syncope.client.console.SyncopeConsoleSession; import org.apache.syncope.client.ui.commons.HttpResourceStream; +import org.apache.syncope.client.ui.commons.rest.ResponseHolder; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.request.Url; @@ -47,10 +48,10 @@ public class SAML2SPPanel extends Panel { @Override public void onClick() { try { - HttpResourceStream stream = new HttpResourceStream(ClientBuilder.newClient(). + HttpResourceStream stream = new HttpResourceStream(new ResponseHolder(ClientBuilder.newClient(). target(RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse( UrlUtils.rewriteToContextRelative("saml2sp/metadata", RequestCycle.get())))). - request().get()); + request().get())); ResourceStreamRequestHandler rsrh = new ResourceStreamRequestHandler(stream); rsrh.setFileName(stream.getFilename() == null