Merge branch 'release/5.45.0'
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TestServiceImpl.java
index 679f1cb3a49e3046d939643fc0893153fe34ce83..1398857de8b5dcaec1c07d420a1b19b02d2678ce 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2015 EDIT
 * European Distributed Institute of Taxonomy
 */
 package eu.etaxonomy.cdm.api.service;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.etaxonomy.cdm.api.service.UpdateResult.Status;
+import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier;
+import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
+import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitorThread;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 
 /**
  * @author cmathew
- * @date 26 Jun 2015
- *
+ * @since 26 Jun 2015
  */
 @Service
 public class TestServiceImpl implements ITestService {
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.ITestService#wait(int)
-     */
+    private static final Logger logger = LogManager.getLogger();
+
+    @Autowired
+    private ITaxonNodeService taxonNodeService;
+
+    @Autowired
+    private IProgressMonitorService progressMonitorService;
+
     @Override
+    @PreAuthorize("hasRole('ROLE_ADMIN')")
     public void waitFor(long timeToWaitInMs) throws InterruptedException {
         Thread.sleep(timeToWaitInMs);
     }
 
-}
+    @Override
+    public UpdateResult returnResult(UpdateResult result) {
+        return result;
+    }
+
+    @Override
+    public UpdateResult throwException(Exception ex) {
+        throw new RuntimeException(ex);
+    }
+
+    @Override
+    @Transactional(readOnly = false)
+    public UpdateResult addChild(CdmEntityIdentifier taxonNodeCei) {
+        TaxonNode taxonNode = taxonNodeService.find(taxonNodeCei.getId());
+        TaxonNode child = taxonNode.addChildTaxon(Taxon.NewInstance(null, null), null, null);
+        taxonNodeService.saveOrUpdate(child);
+        UpdateResult result = new UpdateResult();
+        result.addUpdatedCdmId(taxonNodeCei);
+        result.setStatus(Status.OK);
+        return result;
+    }
+
+    @Override
+    public UUID monitLongRunningMethod(final RuntimeException ex, final List<String> feedbacks, final long feedbackWaitTimeout) {
+
+        RemotingProgressMonitorThread monitorThread = new RemotingProgressMonitorThread() {
+            @Override
+            public Serializable doRun(IRemotingProgressMonitor monitor)  {
+                Serializable result = longRunningMethod(monitor, ex, feedbacks, feedbackWaitTimeout);
+                if(!monitor.isCanceled()) {
+                    monitor.addReport("Report");
+                }
+                return result;
+            }
+        };
+
+        UUID uuid = progressMonitorService.registerNewRemotingMonitor(monitorThread);
+        monitorThread.setPriority(3);
+        monitorThread.start();
+        return uuid;
+    }
+
+    @Override
+    public String longRunningMethod(IRemotingProgressMonitor monitor,
+            RuntimeException ex,
+            List<String> feedbacks,
+            long feedbackWaitTimeout) {
+
+        int noOfSteps = 10;
+        int stepToThrowException = noOfSteps / 2;
+        int stepToWaitForFeedback = noOfSteps / 2;
+        monitor.beginTask("Long Running Task", noOfSteps);
+        for(int i=0; i<noOfSteps; i++) {
+            try {
+                Thread.sleep(1000);
+                if(i == stepToThrowException && ex != null) {
+                    throw ex;
+                }
+                if(feedbacks != null && feedbacks.size() > 0 && i == stepToWaitForFeedback) {
+                    for(String feedback : feedbacks) {
+                        logger.warn("Monitor waiting for feedback");
+                        if(feedbackWaitTimeout <= 0) {
+                            monitor.waitForFeedback();
+                        } else {
+                            monitor.waitForFeedback(feedbackWaitTimeout);
+                        }
+                        logger.warn(" .. feedback received : " + monitor.getFeedback());
+                        monitor.addReport(feedback);
+                    }
+                }
+                if(monitor.isCanceled()) {
+                    return "Cancelled";
+                }
+            } catch (InterruptedException e) {
+                throw ex;
+            }
+            monitor.worked(1);
+        }
+        monitor.done();
+        return "Success";
+    }
+}
\ No newline at end of file