/*
* Copyright 2012 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.security;
import java.util.Map;
import org.hibernate.Session;
import ome.model.internal.Details;
import ome.security.basic.AllGroupsSecurityFilter;
import ome.security.basic.CurrentDetails;
import ome.security.basic.OneGroupSecurityFilter;
import ome.security.basic.SharingSecurityFilter;
import ome.system.EventContext;
/**
* Security dispatcher holding each currently active {@link SecurityFilter}
* instance and allowing dispatching between them.
*
* @author Josh Moore, josh at glencoesoftware.com
* @see SecurityFilter
* @since 4.4
*/
public class SecurityFilterHolder implements SecurityFilter {
final protected AllGroupsSecurityFilter allgroups;
final protected OneGroupSecurityFilter onegroup;
final protected SharingSecurityFilter share;
final protected CurrentDetails cd;
protected ThreadLocal<SecurityFilter> current = new ThreadLocal<SecurityFilter>() {
@Override
protected SecurityFilter initialValue() {
return onegroup;
}
};
public SecurityFilterHolder(CurrentDetails cd,
OneGroupSecurityFilter onegroup,
AllGroupsSecurityFilter allgroups,
SharingSecurityFilter share) {
this.cd = cd;
this.onegroup = onegroup;
this.allgroups = allgroups;
this.share = share;
}
public SecurityFilter choose() {
final EventContext ec = cd.getCurrentEventContext();
final Long groupId = ec.getCurrentGroupId();
final Long shareId = ec.getCurrentShareId();
if (shareId != null && shareId >= 0) {
return share;
} else if (groupId < 0) {
return allgroups;
} else {
return onegroup;
}
}
// Delegation
// =========================================================================
public String getName() {
return choose().getName();
}
public String getDefaultCondition() {
return choose().getDefaultCondition();
}
public Map<String, String> getParameterTypes() {
return choose().getParameterTypes();
}
public void enable(Session sess, EventContext ec) {
choose().enable(sess, ec);
}
public void disable(Session sess) {
choose().disable(sess);
}
public boolean passesFilter(Session s, Details d, EventContext c) {
return choose().passesFilter(s, d, c);
}
}