/* * Copyright 2007 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.services.blitz.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import org.springframework.context.ApplicationListener; import ome.api.IAdmin; import ome.logic.HardWiredInterceptor; import ome.model.internal.Permissions; import ome.model.meta.Experimenter; import ome.model.meta.ExperimenterGroup; import ome.model.meta.Session; import ome.security.SecuritySystem; import ome.security.basic.PrincipalHolder; import ome.services.blitz.fire.AopContextInitializer; import ome.services.blitz.impl.AbstractAmdServant; import ome.services.blitz.impl.AdminI; import ome.services.blitz.impl.ConfigI; import ome.services.blitz.impl.QueryI; import ome.services.blitz.impl.ServiceFactoryI; import ome.services.blitz.impl.ShareI; import ome.services.blitz.impl.UpdateI; import ome.services.blitz.util.BlitzExecutor; import ome.services.blitz.util.RegisterServantMessage; import ome.services.sessions.SessionManager; import ome.services.util.Executor; import ome.system.EventContext; import ome.system.OmeroContext; import ome.system.Principal; import ome.system.ServiceFactory; import ome.testing.InterceptingServiceFactory; import ome.tools.hibernate.ExtendedMetadata; import ome.tools.spring.InternalServiceFactory; import ome.util.messages.MessageException; /** * This fixture is copied from components/server/test/ome/server/itests/ * Obviously copying is less clean then we would like, but for the moment, * sharing between test code is not supported in the ant build (Nov2008) * * @author Josh Moore, josh at glencoesoftware.com * @since Beta4 * @DEV.TODO Reunite with server code. */ public class ManagedContextFixture { public final Ice.ObjectAdapter adapter; public final OmeroContext ctx; public final SessionManager mgr; public final ExtendedMetadata em; public final Executor ex; public final ServiceFactoryI sf; public final ServiceFactory managedSf; public final ServiceFactory internalSf; public final SecuritySystem security; public final PrincipalHolder holder; public final LoginInterceptor login; public final AopContextInitializer init; public final BlitzExecutor be; public final SessionManager sm; public final SecuritySystem ss; protected final List<HardWiredInterceptor> cptors; // Servants public final AdminI admin; public final ConfigI config; public final QueryI query; public final ShareI share; public final UpdateI update; public ManagedContextFixture() throws Exception { this(OmeroContext.getManagedServerContext()); } public void close() { ctx.closeAll(); } public ManagedContextFixture(OmeroContext ctx) throws Exception { this(ctx, false); } /** * Calls {@link #ManagedContextFixture(OmeroContext, boolean, String)} with * private permissions. */ public ManagedContextFixture(OmeroContext ctx, boolean newUser) throws Exception { this(ctx, false, "rw----"); } /** * Create the fixture. Based on {@link #newUser} either creates a new * user or logins the root user. * @param ctx * @param newUser */ public ManagedContextFixture(OmeroContext ctx, boolean newUser, String permissions) throws Exception { this.ctx = ctx; sm = (SessionManager) ctx.getBean("sessionManager"); ss = (SecuritySystem) ctx.getBean("securitySystem"); be = (BlitzExecutor) ctx.getBean("throttlingStrategy"); adapter = (Ice.ObjectAdapter) ctx.getBean("adapter"); mgr = (SessionManager) ctx.getBean("sessionManager"); em = (ExtendedMetadata) ctx.getBean("extendedMetadata"); ex = (Executor) ctx.getBean("executor"); security = (SecuritySystem) ctx.getBean("securitySystem"); holder = (PrincipalHolder) ctx.getBean("principalHolder"); login = new LoginInterceptor(holder); managedSf = new InterceptingServiceFactory(new ServiceFactory(ctx), login); internalSf = new InternalServiceFactory(ctx); cptors = HardWiredInterceptor .parse(new String[] { "ome.security.basic.BasicSecurityWiring" }); HardWiredInterceptor.configure(cptors, ctx); setCurrentUserAndGroup("root", "system"); if (newUser) { loginNewUserNewGroup(permissions); } sf = createServiceFactoryI(); init = new AopContextInitializer( new ServiceFactory(ctx), login.p, new AtomicBoolean(true)); ServiceFactory regular = new ServiceFactory(ctx); update = new UpdateI(regular.getUpdateService(), be); query = new QueryI(regular.getQueryService(), be); admin = new AdminI(regular.getAdminService(), be); config = new ConfigI(regular.getConfigService(), be); share = new ShareI(regular.getShareService(), be); configure(update, init); configure(query, init); configure(admin, init); configure(config, init); configure(share, init); this.ctx.addApplicationListener( new ApplicationListener<RegisterServantMessage>(){ public void onApplicationEvent(RegisterServantMessage msg) { Ice.Current curr = msg.getCurrent(); if (curr.id.category.equals(getPrincipal().getName())) { try { Ice.Identity newId = new Ice.Identity(UUID.randomUUID().toString(), curr.id.name); msg.setServiceFactory(newId, sf); } catch (Throwable t) { throw new MessageException( "ManagedContextFixture.onApplicationEvent", t); } } }}); } private ServiceFactoryI createServiceFactoryI() throws omero.ApiUsageException { Ice.Current current = new Ice.Current(); current.adapter = adapter; current.ctx = new HashMap<String, String>(); current.ctx.put(omero.constants.CLIENTUUID.value, UUID.randomUUID().toString()); ServiceFactoryI factory = new ServiceFactoryI(current, new omero.util.ServantHolder(getPrincipal().getName()), null, ctx, mgr, ex, getPrincipal(), new ArrayList<HardWiredInterceptor>(), null, null); return factory; } protected void configure(AbstractAmdServant servant, AopContextInitializer ini) { servant.setApplicationContext(ctx); servant.applyHardWiredInterceptors(cptors, ini); } public void tearDown() throws Exception { ctx.close(); } // UTILITIES // ========================================================================= public String uuid() { return UUID.randomUUID().toString(); } // LOGIN / PERMISSIONS // ========================================================================= public long newGroup() { return newGroup(Permissions.USER_PRIVATE); } public long newGroup(Permissions permissions) { IAdmin admin = managedSf.getAdminService(); String groupName = uuid(); ExperimenterGroup g = new ExperimenterGroup(); g.getDetails().setPermissions(permissions); g.setName(groupName); return admin.createGroup(g); } public void addUserToGroup(long user, long group) { addUserToGroup(user, group, false); } public void addUserToGroup(long user, long group, boolean admin) { final IAdmin iAdmin = managedSf.getAdminService(); final Experimenter e = new Experimenter(user, false); final ExperimenterGroup g = new ExperimenterGroup(group, false); iAdmin.addGroups(e, g); if (admin) { iAdmin.addGroupOwners(g, e); } } /** * Create a new user in the given group */ public String newUser(String group) { IAdmin admin = managedSf.getAdminService(); Experimenter e = new Experimenter(); String uuid = uuid(); e.setOmeName(uuid); e.setFirstName("managed"); e.setMiddleName("context"); e.setLastName("test"); admin.createUser(e, group); return uuid; } /** * Login a new user into a new private group and return */ public String loginNewUserNewGroup() { return loginNewUserNewGroup("rw----"); } /** * Long a new user into a new group with the given permissions and return */ public String loginNewUserNewGroup(String perms) { IAdmin admin = managedSf.getAdminService(); String groupName = uuid(); ExperimenterGroup g = new ExperimenterGroup(); g.setName(groupName); g.getDetails().setPermissions(Permissions.parseString(perms)); admin.createGroup(g); String name = newUser(groupName); setCurrentUser(name); return name; } public String getCurrentUser() { return managedSf.getAdminService().getEventContext() .getCurrentUserName(); } public EventContext getCurrentEventContext() { return managedSf.getAdminService().getEventContext(); } public void setCurrentUser(String user) { setCurrentUserAndGroup(user, "user"); } public void setCurrentUserAndGroup(String user, String group) { Principal p = new Principal(user, group, "Test"); Session s = mgr.createWithAgent(p, "ManagedFixture", "127.0.0.1"); p = new Principal(s.getUuid(), group, "Test"); login.p = p; } public Principal getPrincipal() { return login.p; } }