package codeine.permissions; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import org.apache.log4j.Logger; import codeine.executer.ThreadPoolUtils; import codeine.jsons.global.ExperimentalConfJsonStore; import codeine.utils.ExceptionUtils; import codeine.utils.os_process.ProcessExecuter; import com.google.common.base.Splitter; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.Lists; public class PluginGroupsManager extends GroupsManager{ private static final Logger log = Logger.getLogger(PluginGroupsManager.class); private static final String $USER = "$user"; private static final int MAX_USERS = 1000; @Inject private ExperimentalConfJsonStore experimentalConfJsonStore; private LoadingCache<String, List<String>> groups = CacheBuilder.newBuilder().maximumSize(MAX_USERS) .refreshAfterWrite(20, TimeUnit.MINUTES) .build(CacheLoader.asyncReloading(new CacheLoader<String, List<String>>() { @Override public List<String> load(String user) { if (null == experimentalConfJsonStore.get().groups_plugin()) { return Lists.newArrayList(); } List<String> $ = Splitter.on(",").omitEmptyStrings().splitToList( ProcessExecuter.executeSuccess( experimentalConfJsonStore.get().groups_plugin().replace($USER, user))); log.info("resolved groups for user " + user + " : " + $); return $; } }, ThreadPoolUtils.newFixedThreadPool(2, "PluginGroupsManager"))); @Override public List<String> groups(String user) { try { return groups.get(user); } catch (ExecutionException e) { throw ExceptionUtils.asUnchecked(e); } } }