/* * Copyright (C) 2015 University of Dundee & Open Microscopy Environment. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package omero.cmd.admin; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import ome.parameters.Parameters; import ome.security.basic.CurrentDetails; import ome.services.sessions.SessionManager; import ome.system.EventContext; import ome.system.SimpleEventContext; import omero.RType; import omero.cmd.CurrentSessionsRequest; import omero.cmd.CurrentSessionsResponse; import omero.cmd.HandleI.Cancel; import omero.cmd.Helper; import omero.cmd.IRequest; import omero.cmd.Response; import omero.model.Session; import omero.util.IceMapper; import omero.util.ObjectFactoryRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import Ice.Communicator; import com.google.common.collect.ImmutableMap; @SuppressWarnings("serial") public class CurrentSessionsRequestI extends CurrentSessionsRequest implements IRequest { private final Logger log = LoggerFactory.getLogger(CurrentSessionsRequestI.class); public static class Factory extends ObjectFactoryRegistry { private final ObjectFactory factory; public Factory(final CurrentDetails current, final SessionManager sessionManager) { factory = new ObjectFactory(ice_staticId()) { @Override public Ice.Object create(String name) { return new CurrentSessionsRequestI( current, sessionManager); }}; } @Override public Map<String, ObjectFactory> createFactories(Communicator ic) { return new ImmutableMap.Builder<String, ObjectFactory>() .put(ice_staticId(), factory).build(); } } protected Helper helper; protected final CurrentDetails current; protected final SessionManager manager; protected Map<String, Map<String, Object>> contexts; public CurrentSessionsRequestI(CurrentDetails current, SessionManager manager) { this.current = current; this.manager = manager; } // // CMD API // @Override public Map<String, String> getCallContext() { return null; } public void init(Helper helper) { this.helper = helper; this.helper.setSteps(1); } public Object step(int step) throws Cancel { helper.assertStep(step); contexts = manager.getSessionData(); if (contexts.isEmpty()) { return Collections.emptyList(); } return helper.getServiceFactory().getQueryService(). findAllByQuery("select s from Session s where s.uuid in (:uuid)", new Parameters().addList("uuid", new ArrayList<String>( contexts.keySet()))); } @Override public void finish() throws Cancel { // no-op } @SuppressWarnings("unchecked") public void buildResponse(int step, Object object) { helper.assertResponse(step); List<ome.model.meta.Session> rv = (List<ome.model.meta.Session>) object; Map<String, Session> objects = new HashMap<String, Session>(); IceMapper mapper = new IceMapper(); for (ome.model.meta.Session obj : rv) { objects.put(obj.getUuid(), (Session) mapper.map(obj)); } if (helper.isLast(step)) { final int size = contexts.size(); CurrentSessionsResponse rsp = new CurrentSessionsResponse(); rsp.sessions = new ArrayList<Session>(size); rsp.contexts = new ArrayList<omero.sys.EventContext>(size); rsp.data = new Map[size]; int count = 0; for (Map.Entry<String, Map<String, Object>> entry : contexts.entrySet()) { String uuid = entry.getKey(); Map<String, Object> data = entry.getValue(); EventContext orig = new SimpleEventContext( (EventContext) data.get("sessionContext")); Session s = objects.get(uuid); rsp.sessions.add(s); if (s == null) { // Non-admin omero.sys.EventContext ec = new omero.sys.EventContext(); rsp.contexts.add(ec); ec.userId = orig.getCurrentUserId(); ec.userName = orig.getCurrentUserName(); ec.groupId = orig.getCurrentGroupId(); ec.groupName = orig.getCurrentGroupName(); ec.isAdmin = orig.isCurrentUserAdmin(); rsp.data[count++] = new HashMap<String, RType>(); } else { rsp.contexts.add(IceMapper.convert(orig)); rsp.data[count++] = parseData(rsp, data); } } helper.setResponseIfNull(rsp); } } private Map<String, RType> parseData(CurrentSessionsResponse rsp, Map<String, Object> data) { Map<String, RType> parsed = new HashMap<String, RType>(); for (Map.Entry<String, Object> entry2 : data.entrySet()) { String key2 = entry2.getKey(); Object obj2 = entry2.getValue(); RType wrapped = null; try { if (key2.endsWith("Time")) { wrapped = omero.rtypes.rtime((Long)obj2); } else { wrapped = omero.rtypes.wrap(obj2); } } catch (omero.ClientError ce) { log.warn("Failed to convert {}", obj2, ce); wrapped = omero.rtypes.rstring(obj2.toString()); } parsed.put(key2, wrapped); } parsed.remove("sessionContext"); parsed.remove("class"); return parsed; } public Response getResponse() { return helper.getResponse(); } }