You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2022/11/19 06:20:27 UTC
[syncope] branch 2_1_X updated: [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392) (#393)
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/2_1_X by this push:
new 8b9465f25e [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392) (#393)
8b9465f25e is described below
commit 8b9465f25eb0bc87275f34586175316f015c36f5
Author: Francesco Chicchiriccò <il...@users.noreply.github.com>
AuthorDate: Sat Nov 19 07:20:20 2022 +0100
[SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392) (#393)
---
.../commands/report/ReportSyncopeOperations.java | 4 +-
.../cli/commands/task/TaskSyncopeOperations.java | 4 +-
.../syncope/client/console/batch/BatchContent.java | 8 +-
.../client/console/rest/ReportRestClient.java | 9 +-
.../client/console/rest/TaskRestClient.java | 4 +-
.../rest/api/beans/AbstractTimeframeQuery.java | 107 +++++++++++++++
.../common/rest/api/beans/AccessTokenQuery.java | 1 -
.../syncope/common/rest/api/beans/AuditQuery.java | 4 +-
.../common/rest/api/beans/ExecDeleteQuery.java | 148 ---------------------
.../syncope/common/rest/api/beans/ExecQuery.java | 4 +-
.../beans/{ExecuteQuery.java => ExecSpecs.java} | 6 +-
.../common/rest/api/beans/RemediationQuery.java | 4 +-
.../common/rest/api/service/ExecutableService.java | 7 +-
.../core/logic/AbstractExecutableLogic.java | 11 +-
.../org/apache/syncope/core/logic/LoggerLogic.java | 7 +-
.../syncope/core/logic/RemediationLogic.java | 7 +-
.../org/apache/syncope/core/logic/ReportLogic.java | 36 ++---
.../org/apache/syncope/core/logic/TaskLogic.java | 22 +--
.../core/persistence/api/dao/LoggerDAO.java | 9 +-
.../core/persistence/api/dao/RemediationDAO.java | 10 +-
.../core/persistence/api/dao/ReportExecDAO.java | 14 +-
.../core/persistence/api/dao/TaskExecDAO.java | 15 ++-
.../persistence/jpa/dao/MyJPAJSONLoggerDAO.java | 22 +--
.../persistence/jpa/dao/PGJPAJSONLoggerDAO.java | 22 +--
.../core/persistence/jpa/dao/JPALoggerDAO.java | 51 ++++++-
.../persistence/jpa/dao/JPARemediationDAO.java | 43 +++++-
.../core/persistence/jpa/dao/JPAReportExecDAO.java | 107 ++++++++-------
.../core/persistence/jpa/dao/JPATaskExecDAO.java | 97 +++++++-------
.../persistence/jpa/inner/RemediationTest.java | 2 +-
.../core/persistence/jpa/inner/TaskExecTest.java | 3 +-
.../cxf/service/AbstractExecutableService.java | 15 +--
.../core/rest/cxf/service/LoggerServiceImpl.java | 2 +
.../rest/cxf/service/RemediationServiceImpl.java | 6 +-
.../jpa/dao/ElasticsearchLoggerDAO.java | 23 +++-
.../syncope/fit/core/AbstractTaskITCase.java | 4 +-
.../org/apache/syncope/fit/core/AuditITCase.java | 12 +-
.../syncope/fit/core/NotificationTaskITCase.java | 4 +-
.../syncope/fit/core/PropagationTaskITCase.java | 13 +-
.../apache/syncope/fit/core/PullTaskITCase.java | 4 +-
.../org/apache/syncope/fit/core/ReportITCase.java | 12 +-
.../apache/syncope/fit/core/SchedTaskITCase.java | 4 +-
41 files changed, 504 insertions(+), 383 deletions(-)
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
index 17c6efad48..da1d267f4a 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportSyncopeOperations.java
@@ -29,7 +29,7 @@ import org.apache.syncope.client.cli.util.XMLUtils;
import org.apache.syncope.common.lib.to.JobTO;
import org.apache.syncope.common.lib.to.ReportTO;
import org.apache.syncope.common.lib.types.ReportExecExportFormat;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.service.ReportService;
public class ReportSyncopeOperations {
@@ -98,7 +98,7 @@ public class ReportSyncopeOperations {
}
public void execute(final String reportKey) {
- reportService.execute(new ExecuteQuery.Builder().key(reportKey).build());
+ reportService.execute(new ExecSpecs.Builder().key(reportKey).build());
}
public void deleteExecution(final String executionKey) {
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
index d577968292..2314c04484 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskSyncopeOperations.java
@@ -24,7 +24,7 @@ import org.apache.syncope.common.lib.to.TaskTO;
import org.apache.syncope.common.lib.to.ExecTO;
import org.apache.syncope.common.lib.to.JobTO;
import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.TaskService;
@@ -58,6 +58,6 @@ public class TaskSyncopeOperations {
public ExecTO execute(final String executionKey, final boolean dryRun) {
return taskService.execute(
- new ExecuteQuery.Builder().key(executionKey).dryRun(dryRun).build());
+ new ExecSpecs.Builder().key(executionKey).dryRun(dryRun).build());
}
}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/batch/BatchContent.java b/client/console/src/main/java/org/apache/syncope/client/console/batch/BatchContent.java
index 7d6919c515..be473f1d14 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/batch/BatchContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/batch/BatchContent.java
@@ -58,7 +58,7 @@ import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
import org.apache.syncope.common.lib.types.StandardEntitlement;
import org.apache.syncope.common.lib.types.StatusPatchType;
import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.service.AnyObjectService;
import org.apache.syncope.common.rest.api.service.AnyService;
import org.apache.syncope.common.rest.api.service.GroupService;
@@ -300,7 +300,7 @@ public class BatchContent<T extends Serializable, S> extends MultilevelPanel.Sec
TaskTO task = (TaskTO) item;
batchTaskService.execute(
- new ExecuteQuery.Builder().dryRun(true).key(task.getKey()).build());
+ new ExecSpecs.Builder().dryRun(true).key(task.getKey()).build());
});
break;
@@ -309,12 +309,12 @@ public class BatchContent<T extends Serializable, S> extends MultilevelPanel.Sec
if (singleItem instanceof TaskTO) {
TaskTO task = (TaskTO) item;
- batchTaskService.execute(new ExecuteQuery.Builder().
+ batchTaskService.execute(new ExecSpecs.Builder().
dryRun(false).key(task.getKey()).build());
} else if (singleItem instanceof ReportTO) {
ReportTO report = (ReportTO) item;
- batchReportService.execute(new ExecuteQuery.Builder().
+ batchReportService.execute(new ExecSpecs.Builder().
key(report.getKey()).build());
}
});
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
index f783f465a8..a2ea0dad18 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
@@ -40,7 +40,7 @@ import org.apache.syncope.common.lib.types.ReportTemplateFormat;
import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.service.ReportService;
import org.apache.syncope.common.rest.api.service.ReportTemplateService;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -89,7 +89,7 @@ public class ReportRestClient extends BaseRestClient
@Override
public void startExecution(final String reportKey, final Date start) {
- getService(ReportService.class).execute(new ExecuteQuery.Builder().key(reportKey).startAt(start).build());
+ getService(ReportService.class).execute(new ExecSpecs.Builder().key(reportKey).startAt(start).build());
}
@Override
@@ -110,9 +110,8 @@ public class ReportRestClient extends BaseRestClient
public List<ExecTO> listExecutions(
final String taskKey, final int page, final int size, final SortParam<String> sort) {
- return getService(ReportService.class).
- listExecutions(new ExecQuery.Builder().key(taskKey).page(page).size(size).
- orderBy(toOrderBy(sort)).build()).getResult();
+ return getService(ReportService.class).listExecutions(new ExecQuery.Builder().
+ key(taskKey).page(page).size(size).orderBy(toOrderBy(sort)).build()).getResult();
}
@Override
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
index 6f0655b5d7..ed1f078103 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
@@ -40,7 +40,7 @@ import org.apache.syncope.common.lib.types.JobAction;
import org.apache.syncope.common.lib.types.TaskType;
import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.TaskService;
@@ -213,7 +213,7 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
public void startExecution(final String taskKey, final Date start, final boolean dryRun) {
getService(TaskService.class).execute(
- new ExecuteQuery.Builder().key(taskKey).startAt(start).dryRun(dryRun).build());
+ new ExecSpecs.Builder().key(taskKey).startAt(start).dryRun(dryRun).build());
}
@Override
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java
new file mode 100644
index 0000000000..2e7979b646
--- /dev/null
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java
@@ -0,0 +1,107 @@
+/*
+ * 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.common.rest.api.beans;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.util.Date;
+import javax.ws.rs.QueryParam;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+public abstract class AbstractTimeframeQuery extends AbstractQuery {
+
+ private static final long serialVersionUID = -6858655425207486223L;
+
+ protected abstract static class Builder<Q extends AbstractTimeframeQuery, B extends Builder<Q, B>>
+ extends AbstractQuery.Builder<Q, B> {
+
+ @Override
+ protected Q getInstance() {
+ return super.getInstance();
+ }
+
+ @SuppressWarnings("unchecked")
+ public B before(final Date before) {
+ getInstance().setBefore(before);
+ return (B) this;
+ }
+
+ @SuppressWarnings("unchecked")
+ public B after(final Date after) {
+ getInstance().setAfter(after);
+ return (B) this;
+ }
+ }
+
+ private Date before;
+
+ private Date after;
+
+ @Parameter(name = "before", in = ParameterIn.QUERY, schema =
+ @Schema(implementation = Date.class))
+ public Date getBefore() {
+ return before;
+ }
+
+ @QueryParam("before")
+ public void setBefore(final Date before) {
+ this.before = before;
+ }
+
+ @Parameter(name = "after", in = ParameterIn.QUERY, schema =
+ @Schema(implementation = Date.class))
+ public Date getAfter() {
+ return after;
+ }
+
+ @QueryParam("after")
+ public void setAfter(final Date after) {
+ this.after = after;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ AbstractTimeframeQuery other = (AbstractTimeframeQuery) obj;
+ return new EqualsBuilder().
+ appendSuper(super.equals(obj)).
+ append(before, other.before).
+ append(after, other.after).
+ build();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().
+ appendSuper(super.hashCode()).
+ append(before).
+ append(after).
+ build();
+ }
+}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
index abdea3f897..e7e8ce3bbd 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
@@ -29,5 +29,4 @@ public class AccessTokenQuery extends AbstractQuery {
return new AccessTokenQuery();
}
}
-
}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
index 71814c35eb..ac843d947d 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
@@ -28,11 +28,11 @@ import javax.ws.rs.QueryParam;
import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.common.rest.api.service.JAXRSService;
-public class AuditQuery extends AbstractQuery {
+public class AuditQuery extends AbstractTimeframeQuery {
private static final long serialVersionUID = -2863334226169614417L;
- public static class Builder extends AbstractQuery.Builder<AuditQuery, Builder> {
+ public static class Builder extends AbstractTimeframeQuery.Builder<AuditQuery, Builder> {
@Override
protected AuditQuery newInstance() {
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
deleted file mode 100644
index 664a705b95..0000000000
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
+++ /dev/null
@@ -1,148 +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.common.rest.api.beans;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-
-public class ExecDeleteQuery implements Serializable {
-
- private static final long serialVersionUID = 3846547401120638351L;
-
- public static class Builder {
-
- private final ExecDeleteQuery instance = new ExecDeleteQuery();
-
- public Builder key(final String key) {
- instance.setKey(key);
- return this;
- }
-
- public Builder startedBefore(final Date date) {
- instance.setStartedBefore(date);
- return this;
- }
-
- public Builder startedAfter(final Date date) {
- instance.setStartedAfter(date);
- return this;
- }
-
- public Builder endedBefore(final Date date) {
- instance.setEndedBefore(date);
- return this;
- }
-
- public Builder endedAfter(final Date date) {
- instance.setEndedAfter(date);
- return this;
- }
-
- public ExecDeleteQuery build() {
- return instance;
- }
- }
-
- private String key;
-
- private Date startedBefore;
-
- private Date startedAfter;
-
- private Date endedBefore;
-
- private Date endedAfter;
-
- public String getKey() {
- return key;
- }
-
- @NotNull
- @PathParam("key")
- public void setKey(final String key) {
- this.key = key;
- }
-
- public Date getStartedBefore() {
- if (startedBefore != null) {
- return new Date(startedBefore.getTime());
- }
- return null;
- }
-
- @QueryParam("startedBefore")
- public void setStartedBefore(final Date startedBefore) {
- if (startedBefore != null) {
- this.startedBefore = new Date(startedBefore.getTime());
- } else {
- this.startedBefore = null;
- }
- }
-
- public Date getStartedAfter() {
- if (startedAfter != null) {
- return new Date(startedAfter.getTime());
- }
- return null;
- }
-
- @QueryParam("startedAfter")
- public void setStartedAfter(final Date startedAfter) {
- if (startedAfter != null) {
- this.startedAfter = new Date(startedAfter.getTime());
- } else {
- this.startedAfter = null;
- }
- }
-
- public Date getEndedBefore() {
- if (endedBefore != null) {
- return new Date(endedBefore.getTime());
- }
- return null;
- }
-
- @QueryParam("endedBefore")
- public void setEndedBefore(final Date endedBefore) {
- if (endedBefore != null) {
- this.endedBefore = new Date(endedBefore.getTime());
- } else {
- this.endedBefore = null;
- }
- }
-
- public Date getEndedAfter() {
- if (endedAfter != null) {
- return new Date(endedAfter.getTime());
- }
- return null;
- }
-
- @QueryParam("endedAfter")
- public void setEndedAfter(final Date endedAfter) {
- if (endedAfter != null) {
- this.endedAfter = new Date(endedAfter.getTime());
- } else {
- this.endedAfter = null;
- }
- }
-}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
index e307d3e2bc..abf444541d 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
@@ -23,11 +23,11 @@ import javax.ws.rs.PathParam;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
-public class ExecQuery extends AbstractQuery {
+public class ExecQuery extends AbstractTimeframeQuery {
private static final long serialVersionUID = -8792519310029596796L;
- public static class Builder extends AbstractQuery.Builder<ExecQuery, Builder> {
+ public static class Builder extends AbstractTimeframeQuery.Builder<ExecQuery, Builder> {
@Override
protected ExecQuery newInstance() {
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecSpecs.java
similarity index 93%
rename from common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java
rename to common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecSpecs.java
index ac6ef36d79..bc4dce0bc4 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecuteQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecSpecs.java
@@ -25,13 +25,13 @@ import javax.ws.rs.DefaultValue;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
-public class ExecuteQuery implements Serializable {
+public class ExecSpecs implements Serializable {
private static final long serialVersionUID = 3846547401120638351L;
public static class Builder {
- private final ExecuteQuery instance = new ExecuteQuery();
+ private final ExecSpecs instance = new ExecSpecs();
public Builder key(final String key) {
instance.setKey(key);
@@ -48,7 +48,7 @@ public class ExecuteQuery implements Serializable {
return this;
}
- public ExecuteQuery build() {
+ public ExecSpecs build() {
return instance;
}
}
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
index f70858c3eb..d237c49c9f 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
@@ -18,11 +18,11 @@
*/
package org.apache.syncope.common.rest.api.beans;
-public class RemediationQuery extends AbstractQuery {
+public class RemediationQuery extends AbstractTimeframeQuery {
private static final long serialVersionUID = 4000880445378096031L;
- public static class Builder extends AbstractQuery.Builder<RemediationQuery, Builder> {
+ public static class Builder extends AbstractTimeframeQuery.Builder<RemediationQuery, Builder> {
@Override
protected RemediationQuery newInstance() {
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
index 808aae818f..dc8fb11664 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
@@ -39,9 +39,8 @@ import org.apache.syncope.common.lib.to.JobTO;
import org.apache.syncope.common.lib.to.PagedResult;
import org.apache.syncope.common.lib.types.JobAction;
import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
public interface ExecutableService extends JAXRSService {
@@ -91,7 +90,7 @@ public interface ExecutableService extends JAXRSService {
description = "Batch results available, returned as Response entity"))
@Path("{key}/executions")
@Produces(RESTHeaders.MULTIPART_MIXED)
- Response deleteExecutions(@BeanParam ExecDeleteQuery query);
+ Response deleteExecutions(@BeanParam ExecQuery query);
/**
* Executes the executable matching the given query.
@@ -102,7 +101,7 @@ public interface ExecutableService extends JAXRSService {
@POST
@Path("{key}/execute")
@Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
- ExecTO execute(@BeanParam ExecuteQuery query);
+ ExecTO execute(@BeanParam ExecSpecs query);
/**
* Returns job (running or scheduled) for the executable matching the given key.
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
index a030cacb75..a6f592f4ff 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
@@ -33,14 +33,21 @@ public abstract class AbstractExecutableLogic<T extends EntityTO> extends Abstra
public abstract ExecTO execute(String key, Date startAt, boolean dryRun);
public abstract Pair<Integer, List<ExecTO>> listExecutions(
- String key, int page, int size, List<OrderByClause> orderByClauses);
+ String key,
+ Date before,
+ Date after,
+ int page,
+ int size,
+ List<OrderByClause> orderByClauses);
public abstract List<ExecTO> listRecentExecutions(int max);
public abstract ExecTO deleteExecution(String executionKey);
public abstract List<BatchResponseItem> deleteExecutions(
- String key, Date startedBefore, Date startedAfter, Date endedBefore, Date endedAfter);
+ String key,
+ Date before,
+ Date after);
public abstract JobTO getJob(String key);
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index 09384620bb..228f24753d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.logic;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -406,11 +407,13 @@ public class LoggerLogic extends AbstractTransactionalLogic<EntityTO> {
final String subcategory,
final List<String> events,
final AuditElements.Result result,
+ final Date before,
+ final Date after,
final List<OrderByClause> orderByClauses) {
- int count = loggerDAO.countAuditEntries(entityKey, type, category, subcategory, events, result);
+ int count = loggerDAO.countAuditEntries(entityKey, type, category, subcategory, events, result, before, after);
List<AuditEntry> matching = loggerDAO.findAuditEntries(
- entityKey, page, size, type, category, subcategory, events, result, orderByClauses);
+ entityKey, page, size, type, category, subcategory, events, result, before, after, orderByClauses);
return Pair.of(count, matching);
}
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
index 9b593e4884..214240467f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.logic;
import java.lang.reflect.Method;
+import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -67,13 +68,15 @@ public class RemediationLogic extends AbstractLogic<RemediationTO> {
@PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_LIST + "')")
@Transactional(readOnly = true)
public Pair<Integer, List<RemediationTO>> list(
+ final Date before,
+ final Date after,
final int page,
final int size,
final List<OrderByClause> orderByClauses) {
- int count = remediationDAO.count();
+ int count = remediationDAO.count(before, after);
- List<RemediationTO> result = remediationDAO.findAll(page, size, orderByClauses).stream().
+ List<RemediationTO> result = remediationDAO.findAll(before, after, page, size, orderByClauses).stream().
map(binder::getRemediationTO).collect(Collectors.toList());
return Pair.of(count, result);
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
index 250abcec52..417389c9e4 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
@@ -24,10 +24,12 @@ import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.stream.Collectors;
import java.util.zip.ZipInputStream;
import javax.ws.rs.core.Response;
@@ -219,7 +221,7 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
// streaming SAX handler from a compressed byte array stream
try (ByteArrayInputStream bais = new ByteArrayInputStream(reportExec.getExecResult());
- ZipInputStream zis = new ZipInputStream(bais)) {
+ ZipInputStream zis = new ZipInputStream(bais)) {
// a single ZipEntry in the ZipInputStream (see ReportJob)
zis.getNextEntry();
@@ -300,16 +302,19 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
@PreAuthorize("hasRole('" + StandardEntitlement.REPORT_READ + "')")
@Override
public Pair<Integer, List<ExecTO>> listExecutions(
- final String key, final int page, final int size, final List<OrderByClause> orderByClauses) {
+ final String key,
+ final Date before,
+ final Date after,
+ final int page,
+ final int size,
+ final List<OrderByClause> orderByClauses) {
- Report report = reportDAO.find(key);
- if (report == null) {
- throw new NotFoundException("Report " + key);
- }
+ Report report = Optional.ofNullable(reportDAO.find(key)).
+ orElseThrow(() -> new NotFoundException("Report " + key));
- Integer count = reportExecDAO.count(key);
+ Integer count = reportExecDAO.count(report, before, after);
- List<ExecTO> result = reportExecDAO.findAll(report, page, size, orderByClauses).stream().
+ List<ExecTO> result = reportExecDAO.findAll(report, before, after, page, size, orderByClauses).stream().
map(reportExec -> binder.getExecTO(reportExec)).collect(Collectors.toList());
return Pair.of(count, result);
@@ -339,16 +344,15 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
@Override
public List<BatchResponseItem> deleteExecutions(
final String key,
- final Date startedBefore, final Date startedAfter, final Date endedBefore, final Date endedAfter) {
+ final Date before,
+ final Date after) {
- Report report = reportDAO.find(key);
- if (report == null) {
- throw new NotFoundException("Report " + key);
- }
+ Report report = Optional.ofNullable(reportDAO.find(key)).
+ orElseThrow(() -> new NotFoundException("Report " + key));
List<BatchResponseItem> batchResponseItems = new ArrayList<>();
- reportExecDAO.findAll(report, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
+ reportExecDAO.findAll(report, before, after, -1, -1, Collections.emptyList()).forEach(exec -> {
BatchResponseItem item = new BatchResponseItem();
item.getHeaders().put(RESTHeaders.RESOURCE_KEY, Arrays.asList(exec.getKey()));
batchResponseItems.add(item);
@@ -372,8 +376,8 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
Report report = reportDAO.find(key);
return report == null
- ? null
- : Triple.of(JobType.REPORT, key, binder.buildRefDesc(report));
+ ? null
+ : Triple.of(JobType.REPORT, key, binder.buildRefDesc(report));
}
@PreAuthorize("hasRole('" + StandardEntitlement.REPORT_LIST + "')")
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
index f43e588800..a844bde5d4 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.logic;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -335,17 +336,22 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
@PreAuthorize("hasRole('" + StandardEntitlement.TASK_READ + "')")
@Override
public Pair<Integer, List<ExecTO>> listExecutions(
- final String key, final int page, final int size, final List<OrderByClause> orderByClauses) {
+ final String key,
+ final Date before,
+ final Date after,
+ final int page,
+ final int size,
+ final List<OrderByClause> orderByClauses) {
Task task = taskDAO.find(key);
if (task == null) {
throw new NotFoundException("Task " + key);
}
- Integer count = taskExecDAO.count(key);
+ Integer count = taskExecDAO.count(task, before, after);
- List<ExecTO> result = taskExecDAO.findAll(task, page, size, orderByClauses).stream().
- map(taskExec -> binder.getExecTO(taskExec)).collect(Collectors.toList());
+ List<ExecTO> result = taskExecDAO.findAll(task, before, after, page, size, orderByClauses).stream().
+ map(exec -> binder.getExecTO(exec)).collect(Collectors.toList());
return Pair.of(count, result);
}
@@ -374,10 +380,8 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
@Override
public List<BatchResponseItem> deleteExecutions(
final String key,
- final Date startedBefore,
- final Date startedAfter,
- final Date endedBefore,
- final Date endedAfter) {
+ final Date before,
+ final Date after) {
Task task = taskDAO.find(key);
if (task == null) {
@@ -386,7 +390,7 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
List<BatchResponseItem> batchResponseItems = new ArrayList<>();
- taskExecDAO.findAll(task, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
+ taskExecDAO.findAll(task, before, after, -1, -1, Collections.emptyList()).forEach(exec -> {
BatchResponseItem item = new BatchResponseItem();
item.getHeaders().put(RESTHeaders.RESOURCE_KEY, Arrays.asList(exec.getKey()));
batchResponseItems.add(item);
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
index a4c355d50f..be56715805 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/LoggerDAO.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.persistence.api.dao;
+import java.util.Date;
import java.util.List;
import org.apache.syncope.common.lib.log.AuditEntry;
import org.apache.syncope.common.lib.types.AuditElements;
@@ -31,6 +32,8 @@ public interface LoggerDAO extends DAO<Logger> {
String AUDIT_MESSAGE_COLUMN = "MESSAGE";
+ String AUDIT_ENTRY_EVENT_DATE_COLUMN = "EVENT_DATE";
+
Logger find(String key);
List<Logger> findAll(LoggerType type);
@@ -47,7 +50,9 @@ public interface LoggerDAO extends DAO<Logger> {
String category,
String subcategory,
List<String> events,
- AuditElements.Result result);
+ AuditElements.Result result,
+ Date before,
+ Date after);
List<AuditEntry> findAuditEntries(
String entityKey,
@@ -58,5 +63,7 @@ public interface LoggerDAO extends DAO<Logger> {
String subcategory,
List<String> events,
AuditElements.Result result,
+ Date before,
+ Date after,
List<OrderByClause> orderBy);
}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
index 73216b30cf..ca415665db 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.persistence.api.dao;
+import java.util.Date;
import java.util.List;
import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -32,9 +33,14 @@ public interface RemediationDAO extends DAO<Remediation> {
List<Remediation> findByPullTask(PullTask pullTask);
- int count();
+ int count(Date before, Date after);
- List<Remediation> findAll(int page, int itemsPerPage, List<OrderByClause> orderByClauses);
+ List<Remediation> findAll(
+ Date before,
+ Date after,
+ int page,
+ int itemsPerPage,
+ List<OrderByClause> orderByClauses);
Remediation save(Remediation remediation);
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
index 61c7cfcfed..f662cbc06c 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
@@ -34,11 +34,15 @@ public interface ReportExecDAO extends DAO<ReportExec> {
ReportExec findLatestEnded(Report report);
- int count(String reportKey);
-
- List<ReportExec> findAll(Report report, int page, int itemsPerPage, List<OrderByClause> orderByClauses);
-
- List<ReportExec> findAll(Report report, Date startedBefore, Date startedAfter, Date endedBefore, Date endedAfter);
+ int count(Report report, Date before, Date after);
+
+ List<ReportExec> findAll(
+ Report report,
+ Date before,
+ Date after,
+ int page,
+ int itemsPerPage,
+ List<OrderByClause> orderByClauses);
ReportExec save(ReportExec execution);
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
index e90cc8d25b..29389b2fd1 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
@@ -34,12 +34,15 @@ public interface TaskExecDAO extends DAO<TaskExec> {
<T extends Task> TaskExec findLatestEnded(T task);
- int count(String taskKey);
-
- <T extends Task> List<TaskExec> findAll(T task, int page, int itemsPerPage, List<OrderByClause> orderByClauses);
-
- <T extends Task> List<TaskExec> findAll(
- T task, Date startedBefore, Date startedAfter, Date endedBefore, Date endedAfter);
+ int count(Task task, Date before, Date after);
+
+ List<TaskExec> findAll(
+ Task task,
+ Date before,
+ Date after,
+ int page,
+ int itemsPerPage,
+ List<OrderByClause> orderByClauses);
TaskExec save(TaskExec execution);
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
index bbffaedafa..6b388d1e3a 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONLoggerDAO.java
@@ -29,16 +29,22 @@ public class MyJPAJSONLoggerDAO extends AbstractJPAJSONLoggerDAO {
@Override
protected String doBuild(final List<ObjectNode> containers) {
- query.append('(').append(AUDIT_MESSAGE_COLUMN).append(" -> '$.before' LIKE '%").append(entityKey).
- append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" -> '$.input' LIKE '%").append(entityKey).
- append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" -> '$.output' LIKE '%").append(entityKey).
- append("%')");
+ if (entityKey != null) {
+ query.append(andIfNeeded()).append('(').
+ append(AUDIT_MESSAGE_COLUMN).append("->'$.before' LIKE '%").append(entityKey).
+ append("%' OR ").
+ append(AUDIT_MESSAGE_COLUMN).append("->'$.input' LIKE '%").append(entityKey).
+ append("%' OR ").
+ append(AUDIT_MESSAGE_COLUMN).append("->'$.output' LIKE '%").append(entityKey).
+ append("%')");
+ }
if (!containers.isEmpty()) {
- query.append(" AND (").
- append(containers.stream().map(container -> "JSON_CONTAINS(" + AUDIT_MESSAGE_COLUMN + ", '"
- + POJOHelper.serialize(container).replace("'", "''")
- + "')").collect(Collectors.joining(" OR "))).
+ query.append(andIfNeeded()).append('(').
+ append(containers.stream().
+ map(container -> "JSON_CONTAINS(" + AUDIT_MESSAGE_COLUMN + ", '"
+ + POJOHelper.serialize(container).replace("'", "''")
+ + "')").collect(Collectors.joining(" OR "))).
append(')');
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
index 2eb15ffa8b..8928dd74d0 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONLoggerDAO.java
@@ -30,16 +30,22 @@ public class PGJPAJSONLoggerDAO extends AbstractJPAJSONLoggerDAO {
@Override
protected String doBuild(final List<ObjectNode> containers) {
- query.append('(').append(AUDIT_MESSAGE_COLUMN).append(" ->> 'before' LIKE '%").append(entityKey).
- append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" ->> 'input' LIKE '%").append(entityKey).
- append("%' OR ").append(AUDIT_MESSAGE_COLUMN).append(" ->> 'output' LIKE '%").append(entityKey).
- append("%')");
+ if (entityKey != null) {
+ query.append(andIfNeeded()).append('(').
+ append(AUDIT_MESSAGE_COLUMN).append(" ->> 'before' LIKE '%").append(entityKey).
+ append("%' OR ").
+ append(AUDIT_MESSAGE_COLUMN).append(" ->> 'input' LIKE '%").append(entityKey).
+ append("%' OR ").
+ append(AUDIT_MESSAGE_COLUMN).append(" ->> 'output' LIKE '%").append(entityKey).
+ append("%')");
+ }
if (!containers.isEmpty()) {
- query.append(" AND (").
- append(containers.stream().map(container -> AUDIT_MESSAGE_COLUMN + "::jsonb @> '"
- + POJOHelper.serialize(container).replace("'", "''")
- + "'::jsonb").collect(Collectors.joining(" OR "))).
+ query.append(andIfNeeded()).append('(').
+ append(containers.stream().
+ map(container -> AUDIT_MESSAGE_COLUMN + "::jsonb @> '"
+ + POJOHelper.serialize(container).replace("'", "''")
+ + "'::jsonb").collect(Collectors.joining(" OR "))).
append(')');
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
index 1b6f0c0ff6..8da2346c47 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPALoggerDAO.java
@@ -20,6 +20,8 @@ package org.apache.syncope.core.persistence.jpa.dao;
import java.sql.Clob;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -47,6 +49,11 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
return query.length() == 0 ? " " : " AND ";
}
+ protected int setParameter(final List<Object> parameters, final Object parameter) {
+ parameters.add(parameter);
+ return parameters.size();
+ }
+
protected MessageCriteriaBuilder entityKey(final String entityKey) {
if (entityKey != null) {
query.append(andIfNeeded()).append(AUDIT_MESSAGE_COLUMN).
@@ -98,6 +105,22 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
return this;
}
+ public MessageCriteriaBuilder before(final Date before, final List<Object> parameters) {
+ if (before != null) {
+ query.append(andIfNeeded()).append(AUDIT_ENTRY_EVENT_DATE_COLUMN).
+ append(" <= ?").append(setParameter(parameters, before));
+ }
+ return this;
+ }
+
+ public MessageCriteriaBuilder after(final Date after, final List<Object> parameters) {
+ if (after != null) {
+ query.append(andIfNeeded()).append(AUDIT_ENTRY_EVENT_DATE_COLUMN).
+ append(" >= ?").append(setParameter(parameters, after));
+ }
+ return this;
+ }
+
public String build() {
return query.toString();
}
@@ -144,6 +167,16 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
return new MessageCriteriaBuilder().entityKey(entityKey);
}
+ protected void fillWithParameters(final Query query, final List<Object> parameters) {
+ for (int i = 0; i < parameters.size(); i++) {
+ if (parameters.get(i) instanceof Boolean) {
+ query.setParameter(i + 1, ((Boolean) parameters.get(i)) ? 1 : 0);
+ } else {
+ query.setParameter(i + 1, parameters.get(i));
+ }
+ }
+ }
+
@Override
public int countAuditEntries(
final String entityKey,
@@ -151,8 +184,11 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
final String category,
final String subcategory,
final List<String> events,
- final AuditElements.Result result) {
+ final AuditElements.Result result,
+ final Date before,
+ final Date after) {
+ List<Object> parameters = new ArrayList<>();
String queryString = "SELECT COUNT(0)"
+ " FROM " + AUDIT_TABLE
+ " WHERE " + messageCriteriaBuilder(entityKey).
@@ -161,10 +197,13 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
subcategory(subcategory).
result(result).
events(events).
+ before(before, parameters).
+ after(after, parameters).
build();
- Query countQuery = entityManager().createNativeQuery(queryString);
+ Query query = entityManager().createNativeQuery(queryString);
+ fillWithParameters(query, parameters);
- return ((Number) countQuery.getSingleResult()).intValue();
+ return ((Number) query.getSingleResult()).intValue();
}
protected String select() {
@@ -182,8 +221,11 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
final String subcategory,
final List<String> events,
final AuditElements.Result result,
+ final Date before,
+ final Date after,
final List<OrderByClause> orderBy) {
+ List<Object> parameters = new ArrayList<>();
String queryString = "SELECT " + select()
+ " FROM " + AUDIT_TABLE
+ " WHERE " + messageCriteriaBuilder(entityKey).
@@ -192,6 +234,8 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
subcategory(subcategory).
result(result).
events(events).
+ before(before, parameters).
+ after(after, parameters).
build();
if (!orderBy.isEmpty()) {
queryString += " ORDER BY " + orderBy.stream().
@@ -200,6 +244,7 @@ public class JPALoggerDAO extends AbstractDAO<Logger> implements LoggerDAO {
}
Query query = entityManager().createNativeQuery(queryString);
+ fillWithParameters(query, parameters);
query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
if (itemsPerPage >= 0) {
query.setMaxResults(itemsPerPage);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
index f8aefa169b..b1ca843bd7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.dao;
import java.lang.reflect.Field;
+import java.util.Date;
import java.util.List;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
@@ -59,20 +60,47 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
return query.getResultList();
}
+ protected StringBuilder query(
+ final StringBuilder select,
+ final Date before,
+ final Date after) {
+
+ StringBuilder query = select.
+ append(JPARemediation.class.getSimpleName()).
+ append(" e WHERE 1=1 ");
+ if (before != null) {
+ query.append("AND e.instant <= :before ");
+ }
+ if (after != null) {
+ query.append("AND e.instant >= :after ");
+ }
+ return query;
+ }
+
@Override
- public int count() {
- Query query = entityManager().createNativeQuery("SELECT COUNT(id) FROM " + JPARemediation.TABLE);
+ public int count(final Date before, final Date after) {
+ StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), before, after);
+
+ Query query = entityManager().createQuery(queryString.toString());
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
+
return ((Number) query.getSingleResult()).intValue();
}
@Override
public List<Remediation> findAll(
+ final Date before,
+ final Date after,
final int page,
final int itemsPerPage,
final List<OrderByClause> orderByClauses) {
- StringBuilder queryString = new StringBuilder(
- "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e");
+ StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after);
if (!orderByClauses.isEmpty()) {
queryString.append(" ORDER BY ");
@@ -104,7 +132,12 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
}
TypedQuery<Remediation> query = entityManager().createQuery(queryString.toString(), Remediation.class);
-
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
if (itemsPerPage > 0) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
index e26ce3127a..d945ac3f19 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
@@ -49,7 +49,7 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
return query.getResultList();
}
- private ReportExec findLatest(final Report report, final String field) {
+ protected ReportExec findLatest(final Report report, final String field) {
TypedQuery<ReportExec> query = entityManager().createQuery(
"SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e "
+ "WHERE e.report=:report ORDER BY e." + field + " DESC", ReportExec.class);
@@ -72,16 +72,44 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
return findLatest(report, "end");
}
+ protected StringBuilder query(
+ final StringBuilder select,
+ final Date before,
+ final Date after) {
+
+ StringBuilder query = select.
+ append(JPAReportExec.class.getSimpleName()).
+ append(" e WHERE e.report=:report ");
+ if (before != null) {
+ query.append("AND e.start <= :before ");
+ }
+ if (after != null) {
+ query.append("AND e.start >= :after ");
+ }
+ return query;
+ }
+
@Override
- public int count(final String reportKey) {
- Query countQuery = entityManager().createNativeQuery(
- "SELECT COUNT(e.id) FROM " + JPAReportExec.TABLE + " e WHERE e.report_id=?1");
- countQuery.setParameter(1, reportKey);
+ public int count(
+ final Report report,
+ final Date before,
+ final Date after) {
+
+ StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), before, after);
- return ((Number) countQuery.getSingleResult()).intValue();
+ Query query = entityManager().createQuery(queryString.toString());
+ query.setParameter("report", report);
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
+
+ return ((Number) query.getSingleResult()).intValue();
}
- private String toOrderByStatement(final List<OrderByClause> orderByClauses) {
+ protected String toOrderByStatement(final List<OrderByClause> orderByClauses) {
StringBuilder statement = new StringBuilder();
for (OrderByClause clause : orderByClauses) {
@@ -92,23 +120,33 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
}
if (statement.length() == 0) {
- statement.append("ORDER BY e.id DESC");
+ statement.append(" ORDER BY e.id DESC");
} else {
- statement.insert(0, "ORDER BY ");
+ statement.insert(0, " ORDER BY ");
}
return statement.toString();
}
@Override
- public List<ReportExec> findAll(final Report report,
- final int page, final int itemsPerPage, final List<OrderByClause> orderByClauses) {
+ public List<ReportExec> findAll(
+ final Report report,
+ final Date before,
+ final Date after,
+ final int page,
+ final int itemsPerPage,
+ final List<OrderByClause> orderByClauses) {
- String queryString =
- "SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e WHERE e.report=:report "
- + toOrderByStatement(orderByClauses);
+ StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after).
+ append(toOrderByStatement(orderByClauses));
- TypedQuery<ReportExec> query = entityManager().createQuery(queryString, ReportExec.class);
+ TypedQuery<ReportExec> query = entityManager().createQuery(queryString.toString(), ReportExec.class);
query.setParameter("report", report);
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
// page starts from 1, while setFirtResult() starts from 0
query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
@@ -120,45 +158,6 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
return query.getResultList();
}
- @Override
- public List<ReportExec> findAll(
- final Report report,
- final Date startedBefore, final Date startedAfter, final Date endedBefore, final Date endedAfter) {
-
- StringBuilder queryString = new StringBuilder("SELECT e FROM ").append(JPAReportExec.class.getSimpleName()).
- append(" e WHERE e.report=:report ");
-
- if (startedBefore != null) {
- queryString.append(" AND e.start < :startedBefore");
- }
- if (startedAfter != null) {
- queryString.append(" AND e.start > :startedAfter");
- }
- if (endedBefore != null) {
- queryString.append(" AND e.end < :endedBefore");
- }
- if (endedAfter != null) {
- queryString.append(" AND e.end > :endedAfter");
- }
-
- TypedQuery<ReportExec> query = entityManager().createQuery(queryString.toString(), ReportExec.class);
- query.setParameter("report", report);
- if (startedBefore != null) {
- query.setParameter("startedBefore", startedBefore);
- }
- if (startedAfter != null) {
- query.setParameter("startedAfter", startedAfter);
- }
- if (endedBefore != null) {
- query.setParameter("endedBefore", endedBefore);
- }
- if (endedAfter != null) {
- query.setParameter("endedAfter", endedAfter);
- }
-
- return query.getResultList();
- }
-
@Transactional(rollbackFor = Throwable.class)
@Override
public ReportExec save(final ReportExec execution) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
index e694dfb982..42ccf2c7e5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
@@ -77,52 +77,43 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec> implements TaskExecDAO
return findLatest(task, "end");
}
- @Override
- public <T extends Task> List<TaskExec> findAll(
- final T task,
- final Date startedBefore, final Date startedAfter, final Date endedBefore, final Date endedAfter) {
-
- StringBuilder queryString = new StringBuilder("SELECT e FROM ").append(JPATaskExec.class.getSimpleName()).
+ protected StringBuilder query(
+ final StringBuilder select,
+ final Task task,
+ final Date before,
+ final Date after) {
+
+ StringBuilder query = select.
+ append(JPATaskExec.class.getSimpleName()).
append(" e WHERE e.task=:task ");
-
- if (startedBefore != null) {
- queryString.append(" AND e.start < :startedBefore");
- }
- if (startedAfter != null) {
- queryString.append(" AND e.start > :startedAfter");
- }
- if (endedBefore != null) {
- queryString.append(" AND e.end < :endedBefore");
- }
- if (endedAfter != null) {
- queryString.append(" AND e.end > :endedAfter");
- }
-
- TypedQuery<TaskExec> query = entityManager().createQuery(queryString.toString(), TaskExec.class);
- query.setParameter("task", task);
- if (startedBefore != null) {
- query.setParameter("startedBefore", startedBefore);
- }
- if (startedAfter != null) {
- query.setParameter("startedAfter", startedAfter);
- }
- if (endedBefore != null) {
- query.setParameter("endedBefore", endedBefore);
+ if (before != null) {
+ query.append("AND e.start <= :before ");
}
- if (endedAfter != null) {
- query.setParameter("endedAfter", endedAfter);
+ if (after != null) {
+ query.append("AND e.start >= :after ");
}
- return query.getResultList();
+ return query;
}
@Override
- public int count(final String taskKey) {
- Query countQuery = entityManager().createNativeQuery(
- "SELECT COUNT(e.id) FROM " + JPATaskExec.TABLE + " e WHERE e.task_id=?1");
- countQuery.setParameter(1, taskKey);
+ public int count(
+ final Task task,
+ final Date before,
+ final Date after) {
+
+ StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), task, before, after);
+
+ Query query = entityManager().createQuery(queryString.toString());
+ query.setParameter("task", task);
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
- return ((Number) countQuery.getSingleResult()).intValue();
+ return ((Number) query.getSingleResult()).intValue();
}
private String toOrderByStatement(final List<OrderByClause> orderByClauses) {
@@ -136,23 +127,33 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec> implements TaskExecDAO
});
if (statement.length() == 0) {
- statement.append("ORDER BY e.id DESC");
+ statement.append(" ORDER BY e.id DESC");
} else {
- statement.insert(0, "ORDER BY ");
+ statement.insert(0, " ORDER BY ");
}
return statement.toString();
}
@Override
- public <T extends Task> List<TaskExec> findAll(
- final T task, final int page, final int itemsPerPage, final List<OrderByClause> orderByClauses) {
-
- String queryString =
- "SELECT e FROM " + JPATaskExec.class.getSimpleName() + " e WHERE e.task=:task "
- + toOrderByStatement(orderByClauses);
-
- TypedQuery<TaskExec> query = entityManager().createQuery(queryString, TaskExec.class);
+ public List<TaskExec> findAll(
+ final Task task,
+ final Date before,
+ final Date after,
+ final int page,
+ final int itemsPerPage,
+ final List<OrderByClause> orderByClauses) {
+
+ StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), task, before, after).
+ append(toOrderByStatement(orderByClauses));
+
+ Query query = entityManager().createQuery(queryString.toString());
query.setParameter("task", task);
+ if (before != null) {
+ query.setParameter("before", before);
+ }
+ if (after != null) {
+ query.setParameter("after", after);
+ }
// page starts from 1, while setFirtResult() starts from 0
query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
index 15e3e5baae..3a8261f438 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
@@ -55,7 +55,7 @@ public class RemediationTest extends AbstractTest {
@Test
public void findAll() {
- List<Remediation> remediations = remediationDAO.findAll(1, 1, Collections.emptyList());
+ List<Remediation> remediations = remediationDAO.findAll(null, null, 1, 1, Collections.emptyList());
assertTrue(remediations.isEmpty());
}
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
index af257f5112..fad0702357 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.Calendar;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.syncope.common.lib.types.ExecStatus;
@@ -52,7 +53,7 @@ public class TaskExecTest extends AbstractTest {
calendar.clear();
calendar.set(2015, 11, 18, 0, 0, 0);
- List<TaskExec> execs = taskExecDAO.findAll(task, calendar.getTime(), null, null, null);
+ List<TaskExec> execs = taskExecDAO.findAll(task, calendar.getTime(), null, -1, -1, Collections.emptyList());
assertNotNull(execs);
assertEquals(1, execs.size());
}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
index 10936bfbcb..a42b1df757 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
@@ -28,9 +28,8 @@ import org.apache.syncope.common.lib.types.JobAction;
import org.apache.syncope.common.rest.api.RESTHeaders;
import org.apache.syncope.common.rest.api.batch.BatchPayloadGenerator;
import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.service.ExecutableService;
import org.apache.syncope.common.rest.api.service.JAXRSService;
import org.apache.syncope.core.logic.AbstractExecutableLogic;
@@ -44,6 +43,8 @@ public abstract class AbstractExecutableService extends AbstractServiceImpl impl
public PagedResult<ExecTO> listExecutions(final ExecQuery query) {
Pair<Integer, List<ExecTO>> result = getExecutableLogic().listExecutions(
query.getKey(),
+ query.getBefore(),
+ query.getAfter(),
query.getPage(),
query.getSize(),
getOrderByClauses(query.getOrderBy()));
@@ -61,13 +62,11 @@ public abstract class AbstractExecutableService extends AbstractServiceImpl impl
}
@Override
- public Response deleteExecutions(final ExecDeleteQuery query) {
+ public Response deleteExecutions(final ExecQuery query) {
List<BatchResponseItem> batchResponseItems = getExecutableLogic().deleteExecutions(
query.getKey(),
- query.getStartedBefore(),
- query.getStartedAfter(),
- query.getEndedBefore(),
- query.getEndedAfter());
+ query.getBefore(),
+ query.getAfter());
String boundary = "deleteExecutions_" + SecureRandomUtils.generateRandomUUID().toString();
return Response.ok(BatchPayloadGenerator.generate(
@@ -77,7 +76,7 @@ public abstract class AbstractExecutableService extends AbstractServiceImpl impl
}
@Override
- public ExecTO execute(final ExecuteQuery query) {
+ public ExecTO execute(final ExecSpecs query) {
return getExecutableLogic().execute(query.getKey(), query.getStartAt(), query.getDryRun());
}
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index b8ab5b4ac7..5fffd67039 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -138,6 +138,8 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
auditQuery.getSubcategory(),
auditQuery.getEvents(),
auditQuery.getResult(),
+ auditQuery.getBefore(),
+ auditQuery.getAfter(),
getOrderByClauses(auditQuery.getOrderBy()));
return buildPagedResult(result.getRight(), auditQuery.getPage(), auditQuery.getSize(), result.getLeft());
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
index b6ba6e673a..ba4b00dda7 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
@@ -56,7 +56,11 @@ public class RemediationServiceImpl extends AbstractServiceImpl implements Remed
@Override
public PagedResult<RemediationTO> list(final RemediationQuery query) {
Pair<Integer, List<RemediationTO>> result = logic.list(
- query.getPage(), query.getSize(), getOrderByClauses(query.getOrderBy()));
+ query.getBefore(),
+ query.getAfter(),
+ query.getPage(),
+ query.getSize(),
+ getOrderByClauses(query.getOrderBy()));
return buildPagedResult(result.getRight(), query.getPage(), query.getSize(), result.getLeft());
}
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchLoggerDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchLoggerDAO.java
index 78be158a96..2e100d446f 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchLoggerDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchLoggerDAO.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -63,7 +64,9 @@ public class ElasticsearchLoggerDAO extends JPALoggerDAO {
final String category,
final String subcategory,
final List<String> events,
- final AuditElements.Result result) {
+ final AuditElements.Result result,
+ final Date before,
+ final Date after) {
List<QueryBuilder> queryBuilders = new ArrayList<>();
@@ -101,6 +104,14 @@ public class ElasticsearchLoggerDAO extends JPALoggerDAO {
queryBuilders.add(QueryBuilders.termQuery("message.logger.result", result.name()));
}
+ if (before != null) {
+ queryBuilders.add(QueryBuilders.rangeQuery("instant").lte(before.getTime()));
+ }
+
+ if (after != null) {
+ queryBuilders.add(QueryBuilders.rangeQuery("instant").gte(after.getTime()));
+ }
+
BoolQueryBuilder bool = QueryBuilders.boolQuery();
queryBuilders.forEach(bool::must);
return bool;
@@ -113,11 +124,13 @@ public class ElasticsearchLoggerDAO extends JPALoggerDAO {
final String category,
final String subcategory,
final List<String> events,
- final AuditElements.Result result) {
+ final AuditElements.Result result,
+ final Date before,
+ final Date after) {
CountRequest request = new CountRequest(
ElasticsearchUtils.getAuditIndex(AuthContextUtils.getDomain())).
- query(getQueryBuilder(entityKey, type, category, subcategory, events, result));
+ query(getQueryBuilder(entityKey, type, category, subcategory, events, result, before, after));
try {
return (int) client.count(request, RequestOptions.DEFAULT).getCount();
} catch (IOException e) {
@@ -147,10 +160,12 @@ public class ElasticsearchLoggerDAO extends JPALoggerDAO {
final String subcategory,
final List<String> events,
final AuditElements.Result result,
+ final Date before,
+ final Date after,
final List<OrderByClause> orderBy) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().
- query(getQueryBuilder(entityKey, type, category, subcategory, events, result)).
+ query(getQueryBuilder(entityKey, type, category, subcategory, events, result, before, after)).
from(itemsPerPage * (page <= 0 ? 0 : page - 1)).
size(itemsPerPage < 0 ? elasticsearchUtils.getIndexMaxResultWindow() : itemsPerPage);
sortBuilders(orderBy).forEach(sourceBuilder::sort);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
index b9f0f4b240..43a742ad82 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AbstractTaskITCase.java
@@ -41,7 +41,7 @@ import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
import org.apache.syncope.common.lib.types.TaskType;
import org.apache.syncope.common.rest.api.beans.AnyQuery;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.TaskService;
import org.apache.syncope.core.provisioning.java.job.notification.NotificationJob;
@@ -127,7 +127,7 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
AtomicReference<TaskTO> taskTO = new AtomicReference<>(taskService.read(type, taskKey, true));
int preSyncSize = taskTO.get().getExecutions().size();
- ExecTO execution = taskService.execute(new ExecuteQuery.Builder().key(taskKey).dryRun(dryRun).build());
+ ExecTO execution = taskService.execute(new ExecSpecs.Builder().key(taskKey).dryRun(dryRun).build());
assertEquals(initialStatus, execution.getStatus());
await().atMost(maxWaitSeconds, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS).until(() -> {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
index edcf9d7586..e3c0654ed0 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
@@ -25,10 +25,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import com.fasterxml.jackson.core.JsonProcessingException;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.log.AuditEntry;
@@ -84,8 +86,13 @@ public class AuditITCase extends AbstractITCase {
UserTO userTO = createUser(UserITCase.getUniqueSampleTO("audit@syncope.org")).getEntity();
assertNotNull(userTO.getKey());
- AuditQuery query = new AuditQuery.Builder().entityKey(userTO.getKey()).orderBy("event_date desc").
- page(1).size(1).build();
+ AuditQuery query = new AuditQuery.Builder().
+ entityKey(userTO.getKey()).
+ before(DateUtils.addSeconds(new Date(), 30)).
+ page(1).
+ size(1).
+ orderBy("event_date desc").
+ build();
AuditEntry entry = queryWithFailure(query, MAX_WAIT_SECONDS);
assertNotNull(entry);
userService.delete(userTO.getKey());
@@ -105,6 +112,7 @@ public class AuditITCase extends AbstractITCase {
category(UserLogic.class.getSimpleName()).
event("create").
result(AuditElements.Result.SUCCESS).
+ after(DateUtils.addSeconds(new Date(), -30)).
build();
AuditEntry entry = queryWithFailure(query, MAX_WAIT_SECONDS);
assertNotNull(entry);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationTaskITCase.java
index 4c1d0b4593..a67dd9da85 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationTaskITCase.java
@@ -41,7 +41,7 @@ import org.apache.syncope.common.lib.types.ImplementationType;
import org.apache.syncope.common.lib.types.TaskType;
import org.apache.syncope.common.lib.types.TraceLevel;
import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.NotificationService;
import org.apache.syncope.core.provisioning.java.job.notification.NotificationJob;
@@ -186,7 +186,7 @@ public class NotificationTaskITCase extends AbstractNotificationTaskITCase {
assertNotNull(taskTO.getNotification());
assertTrue(taskTO.getExecutions().isEmpty());
- taskService.execute(new ExecuteQuery.Builder().key(taskTO.getKey()).build());
+ taskService.execute(new ExecSpecs.Builder().key(taskTO.getKey()).build());
try {
Thread.sleep(5);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
index f3b7e66e49..1325d511e9 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
@@ -47,6 +48,7 @@ import javax.ws.rs.core.GenericType;
import javax.xml.ws.WebServiceException;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.patch.AttrPatch;
@@ -83,7 +85,7 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
import org.apache.syncope.common.lib.types.SchemaType;
import org.apache.syncope.common.lib.types.TaskType;
import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.TaskService;
@@ -357,9 +359,9 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
@Test
public void issueSYNCOPE741() {
for (int i = 0; i < 3; i++) {
- taskService.execute(new ExecuteQuery.Builder().
+ taskService.execute(new ExecSpecs.Builder().
key("1e697572-b896-484c-ae7f-0c8f63fcbc6c").build());
- taskService.execute(new ExecuteQuery.Builder().
+ taskService.execute(new ExecSpecs.Builder().
key("316285cc-ae52-4ea2-a33b-7355e189ac3f").build());
}
try {
@@ -395,8 +397,9 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
assertFalse(task.getExecutions().isEmpty());
// check list executions
- PagedResult<ExecTO> execs = taskService.listExecutions(new ExecQuery.Builder().key(
- "1e697572-b896-484c-ae7f-0c8f63fcbc6c").
+ PagedResult<ExecTO> execs = taskService.listExecutions(new ExecQuery.Builder().
+ key("1e697572-b896-484c-ae7f-0c8f63fcbc6c").
+ before(DateUtils.addSeconds(new Date(), 30)).
page(1).size(2).build());
assertTrue(execs.getTotalCount() >= execs.getResult().size());
}
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index ef431aed48..8f3ed2391a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -53,6 +53,7 @@ import javax.ws.rs.core.Response;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.syncope.client.lib.SyncopeClient;
@@ -856,7 +857,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
assertEquals(ClientExceptionType.Reconciliation, sce.getType());
}
Optional<RemediationTO> remediation = remediationService.list(
- new RemediationQuery.Builder().page(1).size(1000).build()).getResult().stream().
+ new RemediationQuery.Builder().after(DateUtils.addSeconds(new Date(), -30)).
+ page(1).size(1000).build()).getResult().stream().
filter(r -> "uid=pullFromLDAP,ou=People,o=isp".equalsIgnoreCase(r.getRemoteName())).
findFirst();
assertTrue(remediation.isPresent());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
index 62bd2d6530..9ae1a65f39 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
@@ -54,8 +54,8 @@ import org.apache.syncope.common.lib.types.ReportExecExportFormat;
import org.apache.syncope.common.lib.types.ReportExecStatus;
import org.apache.syncope.common.rest.api.RESTHeaders;
import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
import org.apache.syncope.fit.AbstractITCase;
import org.junit.jupiter.api.Test;
@@ -65,7 +65,7 @@ public class ReportITCase extends AbstractITCase {
protected static String execReport(final String reportKey) {
AtomicReference<ReportTO> reportTO = new AtomicReference<>(reportService.read(reportKey));
int preExecSize = reportTO.get().getExecutions().size();
- reportService.execute(new ExecuteQuery.Builder().key(reportKey).build());
+ reportService.execute(new ExecSpecs.Builder().key(reportKey).build());
await().atMost(MAX_WAIT_SECONDS, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS).until(() -> {
try {
@@ -290,7 +290,7 @@ public class ReportITCase extends AbstractITCase {
Date end = new Date();
Response response = reportService.deleteExecutions(
- new ExecDeleteQuery.Builder().key(reportTO.getKey()).startedAfter(start).endedBefore(end).build());
+ new ExecQuery.Builder().key(reportTO.getKey()).after(start).before(end).build());
List<BatchResponseItem> batchResponseItems = parseBatchResponse(response);
assertEquals(1, batchResponseItems.size());
assertEquals(execKey, batchResponseItems.get(0).getHeaders().get(RESTHeaders.RESOURCE_KEY).get(0));
@@ -345,7 +345,7 @@ public class ReportITCase extends AbstractITCase {
reportTO = createReport(reportTO);
assertNotNull(reportTO);
- ExecTO execution = reportService.execute(new ExecuteQuery.Builder().key(reportTO.getKey()).build());
+ ExecTO execution = reportService.execute(new ExecSpecs.Builder().key(reportTO.getKey()).build());
assertNotNull(execution);
int maxit = MAX_WAIT_SECONDS;
@@ -374,7 +374,7 @@ public class ReportITCase extends AbstractITCase {
// Execute (multiple requests)
for (int i = 0; i < 10; i++) {
- assertNotNull(reportService.execute(new ExecuteQuery.Builder().key(reportKey).build()));
+ assertNotNull(reportService.execute(new ExecSpecs.Builder().key(reportKey).build()));
}
// Wait for one execution
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
index 94ca3df933..56948646ed 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
@@ -46,7 +46,7 @@ import org.apache.syncope.common.lib.to.TaskTO;
import org.apache.syncope.common.lib.types.ImplementationType;
import org.apache.syncope.common.lib.types.JobAction;
import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecSpecs;
import org.apache.syncope.common.rest.api.beans.ExecQuery;
import org.apache.syncope.common.rest.api.beans.TaskQuery;
import org.apache.syncope.common.rest.api.service.TaskService;
@@ -111,7 +111,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
AtomicReference<TaskTO> taskTO = new AtomicReference<>(task);
int preSyncSize = taskTO.get().getExecutions().size();
- taskService.execute(new ExecuteQuery.Builder().key(task.getKey()).startAt(later).build());
+ taskService.execute(new ExecSpecs.Builder().key(task.getKey()).startAt(later).build());
await().atMost(MAX_WAIT_SECONDS, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS).until(() -> {
try {