-// $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