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/21 14:39:11 UTC

[syncope] branch master updated (c17d1a0a17 -> 28b3368aae)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


    from c17d1a0a17 [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392)
     new 436013b788 [SYNCOPE-1713] Fixing missing update in RemediationDAO
     new 1bbbbc29b9 Bump upgrades
     new 28b3368aae Fixing openapi.json content from javadocs at first access

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../syncope/core/logic/RemediationLogic.java       |  2 +-
 .../core/rest/cxf/IdRepoRESTCXFContext.java        | 40 +++++++++++++--
 .../core/rest/cxf/SyncopeOpenApiCustomizer.java    | 57 +++-------------------
 .../core/persistence/api/dao/RemediationDAO.java   |  2 +-
 .../core/persistence/jpa/dao/JPAJobStatusDAO.java  |  1 -
 .../persistence/jpa/dao/JPARemediationDAO.java     | 39 +++++++++++----
 .../provisioning/java/job/JobStatusUpdater.java    |  6 +++
 fit/core-reference/pom.xml                         |  2 +
 pom.xml                                            | 18 +++----
 sra/pom.xml                                        |  8 +--
 10 files changed, 94 insertions(+), 81 deletions(-)


[syncope] 02/03: Bump upgrades

Posted by il...@apache.org.
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

commit 1bbbbc29b9eba6f7619828aecae4a825a169a064
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Nov 21 15:19:15 2022 +0100

    Bump upgrades
---
 fit/core-reference/pom.xml |  2 ++
 pom.xml                    | 18 +++++++++---------
 sra/pom.xml                |  8 ++++----
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/fit/core-reference/pom.xml b/fit/core-reference/pom.xml
index 463a410996..e35c70ae07 100644
--- a/fit/core-reference/pom.xml
+++ b/fit/core-reference/pom.xml
@@ -383,6 +383,7 @@ under the License.
         <filtering>true</filtering>
         <excludes>
           <exclude>saml.keystore.jks</exclude>
+          <exclude>test.pdf</exclude>
         </excludes>
       </testResource>
       <testResource>
@@ -390,6 +391,7 @@ under the License.
         <filtering>false</filtering>
         <includes>
           <include>saml.keystore.jks</include>
+          <include>test.pdf</include>
         </includes>
       </testResource>
       <testResource>
diff --git a/pom.xml b/pom.xml
index 1bf2d4bfe4..ebccf27983 100644
--- a/pom.xml
+++ b/pom.xml
@@ -446,7 +446,7 @@ under the License.
     <commons-codec.version>1.15</commons-codec.version>
     <commons-logging.version>1.1.3</commons-logging.version>
 
-    <modernizer-maven.version>2.4.0</modernizer-maven.version>
+    <modernizer-maven.version>2.5.0</modernizer-maven.version>
 
     <pac4j.version>5.5.0</pac4j.version>
 
@@ -455,8 +455,8 @@ under the License.
 
     <h2.version>2.1.214</h2.version>
 
-    <swagger-core.version>2.2.3</swagger-core.version>
-    <swagger-ui.version>4.14.3</swagger-ui.version>
+    <swagger-core.version>2.2.7</swagger-core.version>
+    <swagger-ui.version>4.15.5</swagger-ui.version>
 
     <jquery-slimscroll.version>1.3.8</jquery-slimscroll.version>
     <jquery-cookie.version>1.4.1-1</jquery-cookie.version>
@@ -477,7 +477,7 @@ under the License.
 
     <antlr4.version>4.11.1</antlr4.version>
 
-    <curator.version>5.3.0</curator.version>
+    <curator.version>5.4.0</curator.version>
     <zookeeper.version>3.8.0</zookeeper.version>
 
     <testds.port>1389</testds.port>
@@ -1871,7 +1871,7 @@ under the License.
         <plugin>
           <groupId>org.codehaus.cargo</groupId>
           <artifactId>cargo-maven3-plugin</artifactId>
-          <version>1.10.2</version>
+          <version>1.10.3</version>
           <configuration>
             <configuration>
               <type>standalone</type>
@@ -2066,7 +2066,7 @@ under the License.
       <plugin>
         <groupId>org.codehaus.gmavenplus</groupId>
         <artifactId>gmavenplus-plugin</artifactId>
-        <version>2.0.0</version>
+        <version>2.1.0</version>
         <dependencies>
           <dependency>
             <groupId>org.apache.groovy</groupId>
@@ -2156,7 +2156,7 @@ under the License.
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
-        <version>3.1.0</version>
+        <version>3.3.0</version>
         <executions>
           <execution>
             <id>copy-artifact-legal-files</id>
@@ -2325,7 +2325,7 @@ under the License.
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-gpg-plugin</artifactId>
-            <version>1.6</version>
+            <version>3.0.1</version>
             <executions>
               <execution>
                 <id>sign-artifacts</id>
@@ -2384,7 +2384,7 @@ under the License.
               <dependency>
                 <groupId>org.asciidoctor</groupId>
                 <artifactId>asciidoctorj-pdf</artifactId>
-                <version>2.3.0</version>
+                <version>2.3.3</version>
               </dependency>
             </dependencies>
             <configuration>
diff --git a/sra/pom.xml b/sra/pom.xml
index fcc3d92b24..162456830a 100644
--- a/sra/pom.xml
+++ b/sra/pom.xml
@@ -258,16 +258,16 @@ under the License.
         <directory>${basedir}/src/test/resources</directory>
         <filtering>true</filtering>
         <excludes>
-          <exclude>*.p12</exclude>
-          <exclude>*.jks</exclude>
+          <exclude>**/*.p12</exclude>
+          <exclude>**/*.jks</exclude>
         </excludes>
       </testResource>
       <testResource>
         <directory>${basedir}/src/test/resources</directory>
         <filtering>false</filtering>
         <includes>
-          <include>*.p12</include>
-          <include>*.jks</include>
+          <include>**/*.p12</include>
+          <include>**/*.jks</include>
         </includes>
       </testResource>
     </testResources>


[syncope] 03/03: Fixing openapi.json content from javadocs at first access

Posted by il...@apache.org.
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

commit 28b3368aae75866178ef935acb54de5087a90c69
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Nov 21 15:20:17 2022 +0100

    Fixing openapi.json content from javadocs at first access
---
 .../core/rest/cxf/IdRepoRESTCXFContext.java        | 40 +++++++++++++--
 .../core/rest/cxf/SyncopeOpenApiCustomizer.java    | 57 +++-------------------
 .../core/persistence/jpa/dao/JPAJobStatusDAO.java  |  1 -
 .../provisioning/java/job/JobStatusUpdater.java    |  6 +++
 4 files changed, 48 insertions(+), 56 deletions(-)

diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
index ab01ca51ad..51755161c8 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider;
 import com.fasterxml.jackson.jaxrs.yaml.JacksonYAMLProvider;
 import io.swagger.v3.oas.models.security.SecurityScheme;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +36,8 @@ import org.apache.cxf.jaxrs.ext.search.SearchContext;
 import org.apache.cxf.jaxrs.ext.search.SearchContextImpl;
 import org.apache.cxf.jaxrs.ext.search.SearchContextProvider;
 import org.apache.cxf.jaxrs.ext.search.SearchUtils;
+import org.apache.cxf.jaxrs.model.doc.JavaDocProvider;
+import org.apache.cxf.jaxrs.openapi.OpenApiCustomizer;
 import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
 import org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor;
@@ -130,6 +133,8 @@ import org.apache.syncope.core.rest.cxf.service.SyncopeServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.TaskServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserSelfServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -146,6 +151,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 @Configuration(proxyBeanMethods = false)
 public class IdRepoRESTCXFContext {
 
+    private static final Logger LOG = LoggerFactory.getLogger(IdRepoRESTCXFContext.class);
+
     @Bean
     public ThreadPoolTaskExecutor batchExecutor(final RESTProperties props) {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
@@ -243,11 +250,38 @@ public class IdRepoRESTCXFContext {
         return new AddETagFilter();
     }
 
+    @ConditionalOnMissingBean(name = { "openApiCustomizer", "syncopeOpenApiCustomizer" })
+    @Bean
+    public OpenApiCustomizer openApiCustomizer(final DomainHolder domainHolder, final Environment env) {
+        JavaDocProvider javaDocProvider = null;
+
+        URL[] javaDocURLs = JavaDocUtils.getJavaDocURLs();
+        if (javaDocURLs == null) {
+            String[] javaDocPaths = JavaDocUtils.getJavaDocPaths(env);
+            if (javaDocPaths != null) {
+                try {
+                    javaDocProvider = new JavaDocProvider(javaDocPaths);
+                } catch (Exception e) {
+                    LOG.error("Could not set javadoc paths from {}", List.of(javaDocPaths), e);
+                }
+            }
+        } else {
+            javaDocProvider = new JavaDocProvider(javaDocURLs);
+        }
+
+        SyncopeOpenApiCustomizer openApiCustomizer = new SyncopeOpenApiCustomizer(domainHolder);
+        openApiCustomizer.setDynamicBasePath(false);
+        openApiCustomizer.setReplaceTags(false);
+        openApiCustomizer.setJavadocProvider(javaDocProvider);
+        return openApiCustomizer;
+    }
+
     @ConditionalOnMissingBean
     @Bean
-    public OpenApiFeature openapiFeature(final ApplicationContext ctx) {
+    public OpenApiFeature openapiFeature(final OpenApiCustomizer openApiCustomizer, final ApplicationContext ctx) {
         String version = ctx.getEnvironment().getProperty("version");
         OpenApiFeature openapiFeature = new OpenApiFeature();
+        openapiFeature.setUseContextBasedConfig(true);
         openapiFeature.setTitle("Apache Syncope");
         openapiFeature.setVersion(version);
         openapiFeature.setDescription("Apache Syncope " + version);
@@ -256,10 +290,6 @@ public class IdRepoRESTCXFContext {
         openapiFeature.setContactUrl("https://syncope.apache.org");
         openapiFeature.setScan(false);
         openapiFeature.setResourcePackages(Set.of("org.apache.syncope.common.rest.api.service"));
-
-        SyncopeOpenApiCustomizer openApiCustomizer = new SyncopeOpenApiCustomizer(ctx.getEnvironment());
-        openApiCustomizer.setDynamicBasePath(false);
-        openApiCustomizer.setReplaceTags(false);
         openapiFeature.setCustomizer(openApiCustomizer);
 
         Map<String, SecurityScheme> securityDefinitions = new HashMap<>();
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java
index b47f7a1f6d..0d515e39af 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java
@@ -33,8 +33,6 @@ import io.swagger.v3.oas.models.parameters.Parameter;
 import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
 import io.swagger.v3.oas.models.servers.Server;
-import java.net.URL;
-import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -45,7 +43,6 @@ import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.jaxrs.ext.MessageContext;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
-import org.apache.cxf.jaxrs.model.doc.JavaDocProvider;
 import org.apache.cxf.jaxrs.openapi.OpenApiCustomizer;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -53,60 +50,20 @@ import org.apache.syncope.common.lib.to.ErrorTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.core.persistence.api.DomainHolder;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
 
 public class SyncopeOpenApiCustomizer extends OpenApiCustomizer {
 
-    private static final Logger LOG = LoggerFactory.getLogger(SyncopeOpenApiCustomizer.class);
+    private final DomainHolder domainHolder;
 
-    private final Environment env;
-
-    private List<String> domains;
-
-    private boolean inited = false;
-
-    public SyncopeOpenApiCustomizer(final Environment env) {
-        this.env = env;
-    }
-
-    private void init() {
-        synchronized (this) {
-            if (!inited) {
-                JavaDocProvider javaDocProvider = null;
-
-                URL[] javaDocURLs = JavaDocUtils.getJavaDocURLs();
-                if (javaDocURLs == null) {
-                    String[] javaDocPaths = JavaDocUtils.getJavaDocPaths(env);
-                    if (javaDocPaths != null) {
-                        try {
-                            javaDocProvider = new JavaDocProvider(javaDocPaths);
-                        } catch (Exception e) {
-                            LOG.error("Could not set javadoc paths from {}", List.of(javaDocPaths), e);
-                        }
-                    }
-                } else {
-                    javaDocProvider = new JavaDocProvider(javaDocURLs);
-                }
-                super.setJavadocProvider(javaDocProvider);
-
-                domains = new ArrayList<>(ApplicationContextProvider.getApplicationContext().
-                        getBean(DomainHolder.class).getDomains().keySet());
-
-                inited = true;
-            }
-        }
+    public SyncopeOpenApiCustomizer(final DomainHolder domainHolder) {
+        this.domainHolder = domainHolder;
     }
 
     @Override
     public OpenAPIConfiguration customize(final OpenAPIConfiguration configuration) {
-        init();
         super.customize(configuration);
 
-        MessageContext ctx = JAXRSUtils.createContextValue(
-                JAXRSUtils.getCurrentMessage(), null, MessageContext.class);
+        MessageContext ctx = JAXRSUtils.createContextValue(JAXRSUtils.getCurrentMessage(), null, MessageContext.class);
 
         String url = StringUtils.substringBeforeLast(ctx.getUriInfo().getRequestUri().getRawPath(), "/");
         configuration.getOpenAPI().setServers(List.of(new Server().url(url)));
@@ -116,8 +73,8 @@ public class SyncopeOpenApiCustomizer extends OpenApiCustomizer {
 
     @Override
     protected void addParameters(final List<Parameter> parameters) {
-        Optional<Parameter> domainHeaderParameter = parameters.stream().filter(parameter
-                -> parameter instanceof HeaderParameter && RESTHeaders.DOMAIN.equals(parameter.getName())).findFirst();
+        Optional<Parameter> domainHeaderParameter = parameters.stream().
+                filter(p -> p instanceof HeaderParameter && RESTHeaders.DOMAIN.equals(p.getName())).findFirst();
         if (domainHeaderParameter.isEmpty()) {
             HeaderParameter parameter = new HeaderParameter();
             parameter.setName(RESTHeaders.DOMAIN);
@@ -130,7 +87,7 @@ public class SyncopeOpenApiCustomizer extends OpenApiCustomizer {
             Schema<String> schema = new Schema<>();
             schema.setDescription("Domains are built to facilitate multitenancy.");
             schema.setExternalDocs(extDoc);
-            schema.setEnum(domains);
+            schema.setEnum(domainHolder.getDomains().keySet().stream().sorted().collect(Collectors.toList()));
             schema.setDefault(SyncopeConstants.MASTER_DOMAIN);
             parameter.setSchema(schema);
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java
index 560efd1d13..79a3818aaa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java
@@ -44,6 +44,5 @@ public class JPAJobStatusDAO extends AbstractDAO<JobStatus> implements JobStatus
         if (jobStatus != null) {
             entityManager().remove(jobStatus);
         }
-
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java
index 04bba663ac..ed39b658cc 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java
@@ -22,11 +22,15 @@ import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.JobStatus;
 import org.apache.syncope.core.provisioning.api.event.JobStatusEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 
 public class JobStatusUpdater {
 
+    protected static final Logger LOG = LoggerFactory.getLogger(JobStatusUpdater.class);
+
     protected final JobStatusDAO jobStatusDAO;
 
     protected final EntityFactory entityFactory;
@@ -50,8 +54,10 @@ public class JobStatusUpdater {
     @EventListener
     public void update(final JobStatusEvent event) {
         if (event.getJobStatus() == null) {
+            LOG.debug("Deleting status for job '{}'", event.getJobRefDesc());
             jobStatusDAO.delete(event.getJobRefDesc());
         } else {
+            LOG.debug("Updating job '{}' with status '{}'", event.getJobRefDesc(), event.getJobStatus());
             JobStatus jobStatus = entityFactory.newEntity(JobStatus.class);
             jobStatus.setKey(event.getJobRefDesc());
             jobStatus.setStatus(event.getJobStatus());


[syncope] 01/03: [SYNCOPE-1713] Fixing missing update in RemediationDAO

Posted by il...@apache.org.
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

commit 436013b788938a6e13112f9c96034b4cb2c5a419
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Nov 18 18:43:27 2022 +0100

    [SYNCOPE-1713] Fixing missing update in RemediationDAO
---
 .../syncope/core/logic/RemediationLogic.java       |  2 +-
 .../core/persistence/api/dao/RemediationDAO.java   |  2 +-
 .../persistence/jpa/dao/JPARemediationDAO.java     | 39 ++++++++++++++++------
 3 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
index e366c1f031..0fa145302a 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
@@ -80,7 +80,7 @@ public class RemediationLogic extends AbstractLogic<RemediationTO> {
             final int size,
             final List<OrderByClause> orderByClauses) {
 
-        int count = remediationDAO.count();
+        int count = remediationDAO.count(before, after);
 
         List<RemediationTO> result = remediationDAO.findAll(before, after, page, size, orderByClauses).stream().
                 map(binder::getRemediationTO).collect(Collectors.toList());
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 62cefea481..6ae0936f4f 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
@@ -33,7 +33,7 @@ public interface RemediationDAO extends DAO<Remediation> {
 
     List<Remediation> findByPullTask(PullTask pullTask);
 
-    int count();
+    int count(OffsetDateTime before, OffsetDateTime after);
 
     List<Remediation> findAll(
             OffsetDateTime before,
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 dbca9f6073..2f77611fd8 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
@@ -58,9 +58,35 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
         return query.getResultList();
     }
 
+    protected StringBuilder query(
+            final StringBuilder select,
+            final OffsetDateTime before,
+            final OffsetDateTime 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 OffsetDateTime before, final OffsetDateTime 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();
     }
 
@@ -72,14 +98,7 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
             final int itemsPerPage,
             final List<OrderByClause> orderByClauses) {
 
-        StringBuilder queryString = new StringBuilder(
-                "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e WHERE 1=1 ");
-        if (before != null) {
-            queryString.append(" AND e.instant <= :before");
-        }
-        if (after != null) {
-            queryString.append(" AND e.instant >= :after");
-        }
+        StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after);
 
         if (!orderByClauses.isEmpty()) {
             queryString.append(" ORDER BY ");