Project

General

Profile

Download (4.03 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2015 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
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.
8
*/
9
package eu.etaxonomy.cdm.api.service;
10

    
11
import java.io.Serializable;
12
import java.util.UUID;
13

    
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.security.core.context.SecurityContextHolder;
16
import org.springframework.stereotype.Service;
17

    
18
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
19
import eu.etaxonomy.cdm.common.monitor.IRestServiceProgressMonitor;
20
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitor;
21
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitorThread;
22
import eu.etaxonomy.cdm.model.permission.User;
23
import eu.etaxonomy.cdm.persistence.permission.ICdmPermissionEvaluator;
24
import eu.etaxonomy.cdm.persistence.permission.Role;
25

    
26
/**
27
 * @author cmathew
28
 * @since 14 Oct 2015
29
 */
30
@Service
31
public class ProgressMonitorServiceImpl implements IProgressMonitorService {
32

    
33
    @Autowired
34
    public ProgressMonitorManager<IRestServiceProgressMonitor> progressMonitorManager;
35

    
36
    @Autowired
37
    public ICdmPermissionEvaluator permissionEvaluator;
38

    
39
    @Override
40
    public UUID registerNewRemotingMonitor(RemotingProgressMonitorThread monitorThread) {
41
        RemotingProgressMonitor monitor = new RemotingProgressMonitor();
42
        monitorThread.setMonitor(monitor);
43
        UUID uuid = progressMonitorManager.registerMonitor(monitor, monitorThread);
44
        User user = User.getCurrentAuthenticatedUser();
45
        if(user == null) {
46
            throw new IllegalStateException("Current authenticated user is null");
47
        }
48
        monitor.setOwner(user.getUsername());
49
        return uuid;
50
    }
51

    
52
    @Override
53
    public IRemotingProgressMonitor getRemotingMonitor(UUID uuid) {
54
        try{
55
            IRestServiceProgressMonitor monitor = progressMonitorManager.getMonitor(uuid);
56
            // lookup remoting monitors
57
            if(monitor != null && monitor instanceof IRemotingProgressMonitor ) {
58
                IRemotingProgressMonitor remotingMonitor = (IRemotingProgressMonitor)monitor;
59
                String monitorOwner = remotingMonitor.getOwner();
60
                User currentUser = User.getCurrentAuthenticatedUser();
61
                // ensure that current user is admin or is the same as the owner of
62
                // the monitor
63
                if(currentUser != null &&
64
                        (currentUser.getUsername().equals(monitorOwner) ||
65
                                permissionEvaluator.hasOneOfRoles(SecurityContextHolder.getContext().getAuthentication(), Role.ROLE_ADMIN))) {
66
                    return remotingMonitor;
67
                }
68
            }
69
        }catch (Exception e){
70
            return null;
71
        }
72
        return null;
73
    }
74

    
75
    public void releaseRemotingMonitor(UUID uuid){
76
        progressMonitorManager.releaseMonitor(uuid);
77
    }
78

    
79
    @Override
80
    public void interrupt(UUID uuid) {
81
        IRemotingProgressMonitor remotingMonitor = getRemotingMonitor(uuid);
82
        if(remotingMonitor!= null) {
83
            remotingMonitor.interrupt();
84
            progressMonitorManager.getThread(uuid).interrupt();
85
        }
86
    }
87

    
88
    @Override
89
    public boolean isMonitorThreadRunning(UUID uuid) {
90
        IRemotingProgressMonitor remotingMonitor = getRemotingMonitor(uuid);
91
        if(remotingMonitor != null) {
92
            return remotingMonitor.isMonitorThreadRunning();
93
        }
94
        return false;
95
    }
96

    
97
    @Override
98
    public void cancel(UUID uuid) {
99
        IRestServiceProgressMonitor monitor = progressMonitorManager.getMonitor(uuid);
100
        if(monitor != null) {
101
            monitor.setCanceled(true);
102
            monitor.done();
103
        }
104
    }
105

    
106
    @Override
107
    public void setFeedback(UUID uuid, Serializable feedback) {
108
        IRemotingProgressMonitor remotingMonitor = getRemotingMonitor(uuid);
109
        if(remotingMonitor != null) {
110
            remotingMonitor.setFeedback(feedback);
111
        }
112
    }
113
}
(79-79/97)