diff --git a/DLCM-Common/src/main/java/ch/dlcm/config/DLCMProperties.java b/DLCM-Common/src/main/java/ch/dlcm/config/DLCMProperties.java index ac1a410009fd6b291524d0e57cdfe318534b0a00..a9f8ac33ddd07317c40f3659b581d669c9b6b871 100644 --- a/DLCM-Common/src/main/java/ch/dlcm/config/DLCMProperties.java +++ b/DLCM-Common/src/main/java/ch/dlcm/config/DLCMProperties.java @@ -30,6 +30,8 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import jakarta.annotation.PostConstruct; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties; @@ -37,8 +39,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.util.unit.DataSize; -import jakarta.annotation.PostConstruct; - import ch.unige.solidify.IndexApplicationProperties; import ch.unige.solidify.IndexConstants; import ch.unige.solidify.config.SolidifyProperties; @@ -926,7 +926,7 @@ public class DLCMProperties implements IndexApplicationProperties { private int weekDay = 7; // 1 for Monday, 2 for Tuesday, etc. private int monthDay = 1; private int month = 4; // 1 for January, 2 for February, 3 March, etc. - private int timeToKeepOrders = 30; // measured in days + private int timeToKeepOrders = 100; // measured in days public int getTimeToKeepOrders() { return this.timeToKeepOrders; @@ -1452,7 +1452,7 @@ public class DLCMProperties implements IndexApplicationProperties { public String[] getArchivalStoragePublicUrls() { return this.getModule().getArchivalStorage().getPublicUrls(); } - + // Get default/master archival storage module public String getDefaultArchivalStorageUrl() { return this.getModule().getArchivalStorage().getUrls()[0]; diff --git a/DLCM-Model/src/main/java/ch/dlcm/model/preservation/JobType.java b/DLCM-Model/src/main/java/ch/dlcm/model/preservation/JobType.java index b3798305af8bea1df1c9a89c8b2f57c79a107ae0..2fc8a0f8114995e517f54bf67b492a643709cc81 100644 --- a/DLCM-Model/src/main/java/ch/dlcm/model/preservation/JobType.java +++ b/DLCM-Model/src/main/java/ch/dlcm/model/preservation/JobType.java @@ -40,7 +40,7 @@ public enum JobType { DISPOSAL("Trigger Disposal Processes", true, true), FIXITY("Fixity", true, true), METADATA_MIGRATION("Metadata Version Migration", false, true), - PURGE_ORDER("Purge order", true, false), + PURGE_ORDER("Purge order", true, true), PURGE_SUBMISSION_TEMP_FILES("Purge Submission Temporary Files", true, false), REINDEX_ALL("Re-index on all storage", false, true), REINDEX("Re-index on main storage", false, true), diff --git a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/controller/preservationplanning/PreservationJobController.java b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/controller/preservationplanning/PreservationJobController.java index 5bc2a9b978004ce81ce7db995eb95a7cd3e05ea7..cb8a607954fe594f18e0671a838b7388930b1313 100644 --- a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/controller/preservationplanning/PreservationJobController.java +++ b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/controller/preservationplanning/PreservationJobController.java @@ -9,12 +9,12 @@ * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. @@ -220,6 +220,9 @@ public class PreservationJobController extends ResourceController<PreservationJo if (this.createPreservationJob(JobType.ARCHIVE_PRELOAD_SMALL, JobRecurrence.DAILY)) { count++; } + if (this.createPreservationJob(JobType.PURGE_ORDER, JobRecurrence.WEEKLY)) { + count++; + } return count; } @@ -230,6 +233,17 @@ public class PreservationJobController extends ResourceController<PreservationJo presJob.setJobType(jobType); presJob.setJobRecurrence(jobFrequency); presJob.setEnable(false); + // Specific parameters + switch (jobType) { + case FIXITY -> { + presJob.setMaxItems(100); + presJob.setParameters("sort=lastUpdate.when,asc"); + } + case PURGE_ORDER -> presJob.setParameters("sort=creation.when,asc"); + default -> { + // no specific parameter + } + } this.itemService.save(presJob); log.info("Preservation Job '{}' created", jobType.getLabel()); return true; diff --git a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/job/PurgeOrderJob.java b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/job/PurgeOrderJob.java index 8a1a93fd738a789c23007cb753f26b85cf149fa7..c29e46ee62524b48e684e98562db5deb05e6631b 100644 --- a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/job/PurgeOrderJob.java +++ b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/job/PurgeOrderJob.java @@ -29,17 +29,23 @@ import java.util.ArrayList; import org.springframework.data.domain.Pageable; +import ch.unige.solidify.exception.SolidifyCheckingException; +import ch.unige.solidify.exception.SolidifyResourceNotFoundException; import ch.unige.solidify.exception.SolidifyRestException; import ch.unige.solidify.rest.RestCollection; import ch.unige.solidify.service.MessageService; +import ch.unige.solidify.util.StringTool; import ch.dlcm.config.DLCMProperties; import ch.dlcm.model.access.Order; +import ch.dlcm.model.access.QueryType; import ch.dlcm.model.oais.ArchivalInfoPackage; import ch.dlcm.model.oais.DisseminationInfoPackage; import ch.dlcm.model.preservation.PreservationJob; +import ch.dlcm.model.settings.ArchiveStatistics; import ch.dlcm.service.JobProcessingService; import ch.dlcm.service.rest.trusted.TrustedAIPDownloadRemoteResourceService; +import ch.dlcm.service.rest.trusted.TrustedArchiveStatisticsRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedDisseminationInfoPackageRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedOrderRemoteResourceService; @@ -48,6 +54,7 @@ public class PurgeOrderJob extends AbstractJob { private final TrustedOrderRemoteResourceService orderRemoteResourceService; private final TrustedDisseminationInfoPackageRemoteResourceService disseminationInfoPackageRemoteResourceService; private final TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService; + private final TrustedArchiveStatisticsRemoteResourceService archiveStatisticsRemoteResourceService; private ArrayList<String> dipIds; private ArrayList<String> aipDownloadIds; private final int timeToKeep; @@ -58,11 +65,13 @@ public class PurgeOrderJob extends AbstractJob { JobProcessingService jobProcessingService, TrustedOrderRemoteResourceService orderRemoteResourceService, TrustedDisseminationInfoPackageRemoteResourceService disseminationInfoPackageRemoteResourceService, - TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService) { + TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService, + TrustedArchiveStatisticsRemoteResourceService archiveStatisticsRemoteResourceService) { super(dlcmProperties, messageService, jobProcessingService); this.orderRemoteResourceService = orderRemoteResourceService; this.disseminationInfoPackageRemoteResourceService = disseminationInfoPackageRemoteResourceService; this.aipDownloadRemoteResourceService = aipDownloadRemoteResourceService; + this.archiveStatisticsRemoteResourceService = archiveStatisticsRemoteResourceService; this.timeToKeep = dlcmProperties.getPreservationPlanning().getTimeToKeepOrders(); } @@ -72,53 +81,36 @@ public class PurgeOrderJob extends AbstractJob { final long total = this.getTotal(); this.dipIds = new ArrayList<>(); this.aipDownloadIds = new ArrayList<>(); - job = this.deleteCompletedOrder(job, executionId, total); - this.deleteDIPAndAIPLinkedToOrders(job, executionId, total); + this.deleteCompletedOrder(job, executionId, total); } - private PreservationJob deleteCompletedOrder(PreservationJob job, String executionId, long total) { - Pageable pageable = this.getPageRequest(job.getMaxItems()); + private void deleteCompletedOrder(PreservationJob job, String executionId, long total) { + Pageable orderPageable = this.getPageRequest(job.getMaxItems()); RestCollection<Order> collection; do { - collection = this.orderRemoteResourceService.getCompletedOrder(pageable); + if (StringTool.isNullOrEmpty(job.getParameters())) { + collection = this.orderRemoteResourceService.getCompletedOrder(orderPageable); + } else { + collection = this.orderRemoteResourceService.getCompletedOrderWithParameters(job.getParameters(), orderPageable); + } // check time to keep - pageable = pageable.next(); + orderPageable = orderPageable.next(); for (final Order order : collection.getData()) { - // Check if order creation time - if (order.getCreation().getWhen().plusDays(this.timeToKeep).isAfter(OffsetDateTime.now(ZoneOffset.UTC))) { - job = this.addIgnoredItem(job, executionId, order.getResId(), this.getOrderPublicUrl(order.getResId()), - "Too early to remove the order"); - continue; - } - // Get all dip and aip ids to preserve them since it is needed to delete first the order - Pageable dipPageable = this.getPageRequest(job.getMaxItems()); - RestCollection<DisseminationInfoPackage> dipList; - do { - dipList = this.disseminationInfoPackageRemoteResourceService.getDIPByOrder(order.getResId(), dipPageable); - dipPageable = dipPageable.next(); - dipList.getData().forEach(d -> { - if (!this.dipIds.contains(d.getResId())) { - this.dipIds.add(d.getResId()); - } - }); - } while (dipList.getPage().hasNext()); - - Pageable aipPageable = this.getPageRequest(job.getMaxItems()); - RestCollection<ArchivalInfoPackage> aipList; - do { - aipList = this.aipDownloadRemoteResourceService.getAipsByOrder(order.getResId(), aipPageable); - aipPageable = dipPageable.next(); - aipList.getData().forEach(d -> { - if (!this.aipDownloadIds.contains(d.getResId())) { - this.aipDownloadIds.add(d.getResId()); - } - }); - } while (aipList.getPage().hasNext()); - try { - this.orderRemoteResourceService.deleteOrder(order.getResId()); - job = this.addProcessedItem(job, executionId, order.getResId(), null); - + // Check if order is candidate for purge + if (this.isCandidateToBePurged(order)) { + // list DIP of the order + this.listOrderDIP(order); + // list Downloaded AIP of the order + this.listOrderAIPDownload(order); + // Delete the order + + this.orderRemoteResourceService.deleteOrder(order.getResId()); + job = this.addProcessedItem(job, executionId, order.getResId(), null); + } else { + job = this.addIgnoredItem(job, executionId, order.getResId(), this.getOrderPublicUrl(order.getResId()), + "The order is not ready to be purged"); + } } catch (final Exception e) { job = this.addInErrorItem(job, executionId, order.getResId(), this.getOrderPublicUrl(order.getResId()), e.getMessage()); } @@ -126,7 +118,52 @@ public class PurgeOrderJob extends AbstractJob { } } while (collection.getPage().hasNext() && this.jobProcessingService.checkIfMaxItems(job, executionId)); - return job; + // Delete identified DIP and downloaded AIP + this.deleteDIPAndAIPLinkedToOrders(job, executionId, total); + + } + + private boolean isCandidateToBePurged(Order order) { + if (order.getQueryType() == QueryType.DIRECT) { + try { + final ArchiveStatistics archiveStatistics = this.archiveStatisticsRemoteResourceService.findOne(order.getQuery()); + return archiveStatistics.getLastUpdate().getWhen().plusDays(this.timeToKeep).isBefore(OffsetDateTime.now(ZoneOffset.UTC)); + } catch (SolidifyResourceNotFoundException e) { + // check order last update + } catch (Exception e) { + throw new SolidifyCheckingException("Error in getting archive statistics", e); + } + } + return order.getLastUpdate().getWhen().plusDays(this.timeToKeep).isBefore(OffsetDateTime.now(ZoneOffset.UTC)); + } + + private void listOrderAIPDownload(Order order) { + Pageable aipPageable = this.getPageRequest(0); + RestCollection<ArchivalInfoPackage> aipList; + do { + aipList = this.aipDownloadRemoteResourceService.getAipsByOrder(order.getResId(), aipPageable); + aipPageable = aipPageable.next(); + aipList.getData().forEach(d -> { + if (!this.aipDownloadIds.contains(d.getResId())) { + this.aipDownloadIds.add(d.getResId()); + } + }); + } while (aipList.getPage().hasNext()); + } + + private void listOrderDIP(Order order) { + // Get all dip and aip ids to preserve them since it is needed to delete first the order + Pageable dipPageable = this.getPageRequest(0); + RestCollection<DisseminationInfoPackage> dipList; + do { + dipList = this.disseminationInfoPackageRemoteResourceService.getDIPByOrder(order.getResId(), dipPageable); + dipPageable = dipPageable.next(); + dipList.getData().forEach(d -> { + if (!this.dipIds.contains(d.getResId())) { + this.dipIds.add(d.getResId()); + } + }); + } while (dipList.getPage().hasNext()); } private void deleteDIPAndAIPLinkedToOrders(PreservationJob job, String executionId, long total) { diff --git a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/service/JobService.java b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/service/JobService.java index 582e3acd1304a10bdc4ea7c2dc8534576cc8b8a1..71e8903aed2143f316ff9baed1c785f8ee8e005d 100644 --- a/DLCM-PreservationPlanning/src/main/java/ch/dlcm/service/JobService.java +++ b/DLCM-PreservationPlanning/src/main/java/ch/dlcm/service/JobService.java @@ -57,6 +57,7 @@ import ch.dlcm.service.rest.trusted.TrustedAIPDownloadRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedArchivalInfoPackageRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedArchiveDownloadRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedArchivePublicMetadataRemoteResourceService; +import ch.dlcm.service.rest.trusted.TrustedArchiveStatisticsRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedDepositRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedDisseminationInfoPackageRemoteResourceService; import ch.dlcm.service.rest.trusted.TrustedOrderRemoteResourceService; @@ -80,6 +81,7 @@ public class JobService extends DLCMService { private final TrustedOrderRemoteResourceService orderRemoteResourceService; private final TrustedDisseminationInfoPackageRemoteResourceService disseminationInfoPackageRemoteResourceService; private final TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService; + private final TrustedArchiveStatisticsRemoteResourceService archiveStatisticsRemoteResourceService; private final DLCMProperties dlcmProperties; private final int nbProcessors = Runtime.getRuntime().availableProcessors(); @@ -98,7 +100,8 @@ public class JobService extends DLCMService { TrustedArchiveDownloadRemoteResourceService archiveDownloadRemoteResourceService, TrustedOrderRemoteResourceService orderRemoteResourceService, TrustedDisseminationInfoPackageRemoteResourceService disseminationInfoPackageRemoteResourceService, - TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService) { + TrustedAIPDownloadRemoteResourceService aipDownloadRemoteResourceService, + TrustedArchiveStatisticsRemoteResourceService archiveStatisticsRemoteResourceService) { super(messageService, dlcmProperties); this.preservationJobService = preservationJobService; this.replicationService = replicationService; @@ -112,6 +115,7 @@ public class JobService extends DLCMService { this.orderRemoteResourceService = orderRemoteResourceService; this.disseminationInfoPackageRemoteResourceService = disseminationInfoPackageRemoteResourceService; this.aipDownloadRemoteResourceService = aipDownloadRemoteResourceService; + this.archiveStatisticsRemoteResourceService = archiveStatisticsRemoteResourceService; this.dlcmProperties = dlcmProperties; } @@ -155,7 +159,8 @@ public class JobService extends DLCMService { this.depositRemoteResourceService, this.sipRemoteResourceService, this.aipRemoteResourceService, this.archiveMetadataRemoteResourceService); case PURGE_ORDER -> new PurgeOrderJob(this.dlcmProperties, this.messageService, this.jobProcessingService, this.orderRemoteResourceService, - this.disseminationInfoPackageRemoteResourceService, this.aipDownloadRemoteResourceService); + this.disseminationInfoPackageRemoteResourceService, this.aipDownloadRemoteResourceService, + this.archiveStatisticsRemoteResourceService); case DISPOSAL -> new DisposalJob(this.dlcmProperties, this.messageService, this.jobProcessingService, this.archiveMetadataRemoteResourceService, this.aipRemoteResourceService); case CHECK_COMPLIANCE_LEVEL -> new CheckComplianceLevelJob(this.dlcmProperties, this.messageService, this.jobProcessingService, diff --git a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java index 49f0bb76b97777b3ae2b21300dc12f138bb689f0..aa67c54c8144655325f8b7d69ced5da2e95fdad9 100644 --- a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java +++ b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/ArchivalInfoPackageRemoteResourceService.java @@ -337,7 +337,6 @@ public abstract class ArchivalInfoPackageRemoteResourceService extends RemoteRes public RestCollection<ArchivalInfoPackage> getAipListWithParameters(String storageUrl, String queryParameters, Pageable pageable) { if (StringTool.isNullOrEmpty(queryParameters)) { throw new SolidifyCheckingException("The parameter list is missing"); - } String jsonString = this.restClientService.getResource(storageUrl + "/" + ResourceName.AIP + "?" + queryParameters, pageable); return new RestCollection<>(jsonString, ArchivalInfoPackage.class); diff --git a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/OrderRemoteResourceService.java b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/OrderRemoteResourceService.java index 84a9e96142b35d3679113bce15a80fbcf67e5981..4f8ab0bddbf6addd9c5744b8adf9acd4c3f18438 100644 --- a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/OrderRemoteResourceService.java +++ b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/abstractservice/OrderRemoteResourceService.java @@ -9,12 +9,12 @@ * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. @@ -25,16 +25,17 @@ package ch.dlcm.service.rest.abstractservice; import org.springframework.data.domain.Pageable; +import ch.unige.solidify.exception.SolidifyCheckingException; import ch.unige.solidify.rest.ActionName; import ch.unige.solidify.rest.RestCollection; import ch.unige.solidify.rest.Result; import ch.unige.solidify.service.RemoteResourceService; import ch.unige.solidify.service.SolidifyRestClientService; +import ch.unige.solidify.util.StringTool; import ch.dlcm.config.DLCMProperties; import ch.dlcm.model.PackageStatus; import ch.dlcm.model.access.Order; -import ch.dlcm.model.access.QueryType; import ch.dlcm.rest.DLCMActionName; import ch.dlcm.rest.ResourceName; @@ -72,16 +73,23 @@ public abstract class OrderRemoteResourceService extends RemoteResourceService<O } public RestCollection<Order> getCompletedOrder(Pageable pageable) { - String url = this.accessUrl + "/" + ResourceName.ORDER + "?status=" + PackageStatus.READY +"&queryType=" + QueryType.SIMPLE; - String jsonString = this.restClientService.getResource( - url, - pageable); + String url = this.accessUrl + "/" + ResourceName.ORDER + "?status=" + PackageStatus.READY; + String jsonString = this.restClientService.getResource(url, pageable); + return new RestCollection<>(jsonString, Order.class); + } + + public RestCollection<Order> getCompletedOrderWithParameters(String queryParameters, Pageable pageable) { + if (StringTool.isNullOrEmpty(queryParameters)) { + throw new SolidifyCheckingException("The parameter list is missing"); + } + String url = this.accessUrl + "/" + ResourceName.ORDER + "?status=" + PackageStatus.READY + "&" + queryParameters; + String jsonString = this.restClientService.getResource(url, pageable); return new RestCollection<>(jsonString, Order.class); } public void deleteOrder(String orderId) { String url = this.accessUrl + "/" + ResourceName.ORDER + "/" + orderId; - restClientService.deleteResource(url); + this.restClientService.deleteResource(url); } @Override diff --git a/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/trusted/TrustedArchiveStatisticsRemoteResourceService.java b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/trusted/TrustedArchiveStatisticsRemoteResourceService.java new file mode 100644 index 0000000000000000000000000000000000000000..aabd5b7d897d1ee05c20fe7efe42d2faad87f0b3 --- /dev/null +++ b/DLCM-ResourceServerCommon/src/main/java/ch/dlcm/service/rest/trusted/TrustedArchiveStatisticsRemoteResourceService.java @@ -0,0 +1,40 @@ +/*- + * %%---------------------------------------------------------------------------------------------- + * DLCM Technology - DLCM Resource Server Common - TrustedArchiveStatisticsRemoteResourceService.java + * SPDX-License-Identifier: GPL-2.0-or-later + * %----------------------------------------------------------------------------------------------% + * Copyright (C) 2017 - 2022 University of Geneva + * %----------------------------------------------------------------------------------------------% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * ----------------------------------------------------------------------------------------------%% + */ + +package ch.dlcm.service.rest.trusted; + +import org.springframework.stereotype.Service; + +import ch.unige.solidify.service.TrustedRestClientService; + +import ch.dlcm.config.DLCMProperties; +import ch.dlcm.service.rest.abstractservice.ArchiveStatisticsRemoteResourceService; + +@Service +public class TrustedArchiveStatisticsRemoteResourceService extends ArchiveStatisticsRemoteResourceService { + + public TrustedArchiveStatisticsRemoteResourceService(DLCMProperties dlcmProperties, TrustedRestClientService restClientService) { + super(dlcmProperties, restClientService); + } + +}