]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/PrivilegedJob.java
SLC UI building (except Dist)
[gpl/argeo-slc.git] / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / PrivilegedJob.java
1 package org.argeo.slc.client.ui.dist;
2
3 import java.security.AccessController;
4 import java.security.PrivilegedAction;
5
6 import javax.security.auth.Subject;
7
8 import org.eclipse.core.runtime.IProgressMonitor;
9 import org.eclipse.core.runtime.IStatus;
10 import org.eclipse.core.runtime.jobs.Job;
11 import org.springframework.security.authentication.Authentication;
12 import org.springframework.security.core.context.SecurityContextHolder;
13
14 /**
15 * Propagate authentication to an eclipse job. Typically to execute a privileged
16 * action outside the UI thread
17 */
18 public abstract class PrivilegedJob extends Job {
19
20 private final Authentication authentication;
21 private Subject subject;
22
23 public PrivilegedJob(String jobName) {
24 super(jobName);
25 authentication = SecurityContextHolder.getContext().getAuthentication();
26 subject = Subject.getSubject(AccessController.getContext());
27 }
28
29 @Override
30 protected IStatus run(final IProgressMonitor progressMonitor) {
31 PrivilegedAction<IStatus> privilegedAction = new PrivilegedAction<IStatus>() {
32 public IStatus run() {
33 SecurityContextHolder.getContext().setAuthentication(
34 authentication);
35 return doRun(progressMonitor);
36 }
37 };
38 return Subject.doAs(subject, privilegedAction);
39 }
40
41 /** Implement here what should be executed with default context authentication*/
42 protected abstract IStatus doRun(IProgressMonitor progressMonitor);
43 }