package com.hwlcn.security.subject.support; import com.hwlcn.security.util.CollectionUtils; import com.hwlcn.security.util.ThreadContext; import com.hwlcn.security.mgt.SecurityManager; import com.hwlcn.security.subject.Subject; import com.hwlcn.security.util.ThreadState; import java.util.Map; public class SubjectThreadState implements ThreadState { private Map<Object, Object> originalResources; private final Subject subject; private transient SecurityManager securityManager; public SubjectThreadState(Subject subject) { if (subject == null) { throw new IllegalArgumentException("Subject argument cannot be null."); } this.subject = subject; SecurityManager securityManager = null; if ( subject instanceof DelegatingSubject) { securityManager = ((DelegatingSubject)subject).getSecurityManager(); } if ( securityManager == null) { securityManager = ThreadContext.getSecurityManager(); } this.securityManager = securityManager; } protected Subject getSubject() { return this.subject; } public void bind() { SecurityManager securityManager = this.securityManager; if ( securityManager == null ) { securityManager = ThreadContext.getSecurityManager(); } this.originalResources = ThreadContext.getResources(); ThreadContext.remove(); ThreadContext.bind(this.subject); if (securityManager != null) { ThreadContext.bind(securityManager); } } public void restore() { ThreadContext.remove(); if (!CollectionUtils.isEmpty(this.originalResources)) { ThreadContext.setResources(this.originalResources); } } public void clear() { ThreadContext.remove(); } }