2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.api
.service
.longrunningService
;
11 import java
.io
.Serializable
;
12 import java
.util
.Collection
;
14 import java
.util
.UUID
;
16 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
17 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
18 import org
.springframework
.stereotype
.Service
;
19 import org
.springframework
.transaction
.annotation
.Transactional
;
21 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
22 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptiveDataSetService
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IProgressMonitorService
;
24 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonNodeService
;
25 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
26 import eu
.etaxonomy
.cdm
.api
.service
.config
.CacheUpdaterConfigurator
;
27 import eu
.etaxonomy
.cdm
.api
.service
.config
.DeleteDescriptiveDataSetConfigurator
;
28 import eu
.etaxonomy
.cdm
.api
.service
.config
.ForSubtreeConfiguratorBase
;
29 import eu
.etaxonomy
.cdm
.api
.service
.config
.PublishForSubtreeConfigurator
;
30 import eu
.etaxonomy
.cdm
.api
.service
.config
.SecundumForSubtreeConfigurator
;
31 import eu
.etaxonomy
.cdm
.api
.service
.config
.SortIndexUpdaterConfigurator
;
32 import eu
.etaxonomy
.cdm
.api
.service
.description
.DescriptionAggregationBase
;
33 import eu
.etaxonomy
.cdm
.api
.service
.description
.DescriptionAggregationConfigurationBase
;
34 import eu
.etaxonomy
.cdm
.api
.service
.dto
.SpecimenRowWrapperDTO
;
35 import eu
.etaxonomy
.cdm
.common
.JvmLimitsException
;
36 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
37 import eu
.etaxonomy
.cdm
.common
.monitor
.RemotingProgressMonitorThread
;
38 import eu
.etaxonomy
.cdm
.model
.metadata
.SecReferenceHandlingEnum
;
44 @Service("longRunningTasksService")
45 @Transactional(readOnly
= false)
46 public class LongRunningTasksService
implements ILongRunningTasksService
{
49 private ITaxonNodeService taxonNodeService
;
52 private IDescriptiveDataSetService descriptiveDataSetService
;
55 private IProgressMonitorService progressMonitorService
;
58 private CacheUpdater updater
;
61 private SortIndexUpdaterWrapper sortIndexUpdater
;
64 @Qualifier("cdmRepository")
65 private ICdmRepository repository
;
68 public UUID
monitGetRowWrapper(UUID descriptiveDataSetUuid
) {
69 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
71 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
72 return (Serializable
)descriptiveDataSetService
.getRowWrapper(descriptiveDataSetUuid
, monitor
);
75 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
76 monitorThread
.setPriority(3);
77 monitorThread
.start();
82 public <T
extends DescriptionAggregationBase
<T
,C
>, C
extends DescriptionAggregationConfigurationBase
<T
>>
83 UUID
invoke(C config
){
85 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
87 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
88 T task
= config
.getTaskInstance();
89 UpdateResult updateResult
= null;
91 updateResult
= task
.invoke(config
, repository
);
92 for(Exception e
: updateResult
.getExceptions()) {
93 monitor
.addReport(e
.getMessage());
95 } catch (JvmLimitsException e
) {
96 String warning
= "Memory problem. Java Virtual Machine limits exceeded. Task was interrupted";
97 monitor
.warning(warning
, e
);
98 monitor
.addReport(warning
);
100 monitor
.setResult(updateResult
);
105 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
106 monitorThread
.setPriority(2);
107 monitorThread
.start();
112 public UUID
addRowWrapperToDataset(Collection
<SpecimenRowWrapperDTO
> wrapper
, UUID datasetUuid
){
113 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
115 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
116 UpdateResult updateResult
= descriptiveDataSetService
.addRowWrapperToDataset(wrapper
, datasetUuid
);
117 for(Exception e
: updateResult
.getExceptions()) {
118 monitor
.addReport(e
.getMessage());
120 monitor
.setResult(updateResult
);
124 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
125 monitorThread
.setPriority(2);
126 monitorThread
.start();
131 public UUID
generatePolytomousKey(UUID datasetUuid
, UUID taxonUuid
){
132 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
134 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
135 UpdateResult updateResult
= descriptiveDataSetService
.generatePolytomousKey(datasetUuid
, taxonUuid
);
136 for(Exception e
: updateResult
.getExceptions()) {
137 monitor
.addReport(e
.getMessage());
139 monitor
.setResult(updateResult
);
143 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
144 monitorThread
.setPriority(2);
145 monitorThread
.start();
150 public UUID
deleteDescriptiveDataset(UUID datasetUuid
, DeleteDescriptiveDataSetConfigurator config
){
151 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
153 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
154 UpdateResult updateResult
= descriptiveDataSetService
.delete(datasetUuid
, config
, monitor
);
155 for(Exception e
: updateResult
.getExceptions()) {
156 monitor
.addReport(e
.getMessage());
158 monitor
.setResult(updateResult
);
162 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
163 monitorThread
.setPriority(2);
164 monitorThread
.start();
169 public UUID
monitLongRunningTask(ForSubtreeConfiguratorBase config
) {
171 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
173 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
174 config
.setMonitor(monitor
);
176 UpdateResult result
= updateData(config
);
177 for(Exception e
: result
.getExceptions()) {
178 monitor
.addReport(e
.getMessage());
180 monitor
.setResult(result
);
184 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
185 monitorThread
.setPriority(2);
186 monitorThread
.start();
190 private UpdateResult
updateData(ForSubtreeConfiguratorBase config
){
191 if (config
instanceof SecundumForSubtreeConfigurator
){
192 return taxonNodeService
.setSecundumForSubtree((SecundumForSubtreeConfigurator
)config
);
194 return taxonNodeService
.setPublishForSubtree((PublishForSubtreeConfigurator
) config
);
199 public UUID
monitLongRunningTask(Set
<UUID
> movingUuids
, UUID targetTreeNodeUuid
, int movingType
, SecReferenceHandlingEnum secHandling
, UUID secUuid
) {
201 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
203 public Serializable
doRun(IRemotingProgressMonitor remotingMonitor
) {
206 result
= taxonNodeService
.moveTaxonNodes(movingUuids
,targetTreeNodeUuid
, movingType
, secHandling
, secUuid
, remotingMonitor
);
207 for(Exception e
: result
.getExceptions()) {
208 remotingMonitor
.addReport(e
.getMessage());
210 remotingMonitor
.setResult(result
);
214 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
215 monitorThread
.setPriority(2);
216 monitorThread
.start();
221 public UUID
monitLongRunningTask(CacheUpdaterConfigurator configurator
) {
222 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
224 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
227 configurator
.setMonitor(monitor
);
229 result
= updater
.doInvoke(configurator
);
231 for(Exception e
: result
.getExceptions()) {
232 monitor
.addReport(e
.getMessage());
234 monitor
.setResult(result
);
238 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
239 monitorThread
.setPriority(2);
240 monitorThread
.start();
245 public UUID
monitLongRunningTask(SortIndexUpdaterConfigurator configurator
) {
246 RemotingProgressMonitorThread monitorThread
= new RemotingProgressMonitorThread() {
248 public Serializable
doRun(IRemotingProgressMonitor monitor
) {
250 configurator
.setMonitor(monitor
);
251 UpdateResult result
= sortIndexUpdater
.doInvoke(configurator
);
253 for(Exception e
: result
.getExceptions()) {
254 monitor
.addReport(e
.getMessage());
256 monitor
.setResult(result
);
260 UUID uuid
= progressMonitorService
.registerNewRemotingMonitor(monitorThread
);
261 monitorThread
.setPriority(2);
262 monitorThread
.start();