package com.airbnb.airpal.core;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.joda.time.Duration;
import org.secnod.shiro.jersey.TypeFactory;
import static java.lang.String.format;
public class AirpalUserFactory extends TypeFactory<AirpalUser>
{
private final String defaultAccessLevel;
private final String defaultSchema;
private final Duration defaultQueryTimeout;
public AirpalUserFactory(String defaultSchema, Duration queryTimeout, String accessLevel)
{
super(AirpalUser.class);
this.defaultSchema = defaultSchema;
this.defaultQueryTimeout = queryTimeout;
this.defaultAccessLevel = accessLevel;
}
@Override
public AirpalUser provide()
{
Subject subject = SecurityUtils.getSubject();
Object principal = subject.getPrincipal();
if (principal instanceof ToAirpalUser) {
return ((ToAirpalUser)principal).toAirpalUser(subject);
} else if (principal instanceof String) {
return new AirpalUserImpl((String) principal, defaultSchema, defaultQueryTimeout, defaultAccessLevel, subject);
} else if (principal instanceof AirpalUser) {
return (AirpalUser) principal;
} else {
throw new IllegalArgumentException(format("Could not marshall %s to AirpalUser", principal));
}
}
}