/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2015 University of Dundee. 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 org.openmicroscopy.shoola.env.data;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.apache.commons.collections.CollectionUtils;
import org.openmicroscopy.shoola.util.CommonsLangUtils;
import omero.model.Experimenter;
import omero.model.ExperimenterGroup;
import omero.sys.Roles;
import org.openmicroscopy.shoola.env.LookupNames;
import org.openmicroscopy.shoola.env.config.AgentInfo;
import org.openmicroscopy.shoola.env.config.Registry;
import org.openmicroscopy.shoola.env.data.events.DSCallAdapter;
import org.openmicroscopy.shoola.env.data.login.UserCredentials;
import org.openmicroscopy.shoola.env.data.model.AdminObject;
import org.openmicroscopy.shoola.env.data.model.DiskQuota;
import omero.gateway.util.PojoMapper;
import omero.gateway.SecurityContext;
import omero.gateway.exception.DSAccessException;
import omero.gateway.exception.DSOutOfServiceException;
import omero.gateway.model.DataObject;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
/**
* Implementation of the {@link AdminService} I/F.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* @since 3.0-Beta4
*/
class AdminServiceImpl
implements AdminService
{
/** Uses it to gain access to the container's services. */
private Registry context;
/** Reference to the entry point to access the <i>OMERO</i> services. */
private OMEROGateway gateway;
/**
* Updates the experimenter.
*
* @param exp The experimenter to update.
* @param group The current group to set if any.
* @param asAdmin Pass <code>true</code> if updated as an administrator,
* <code>false</code> otherwise.
* @return See above.
* @throws DSOutOfServiceException If the connection is broken, or logged in
* @throws DSAccessException If an error occurred while trying to
* retrieve data from OMERO service.
*/
private ExperimenterData updateExperimenter(SecurityContext ctx,
ExperimenterData exp, GroupData group, boolean asAdmin)
throws DSOutOfServiceException, DSAccessException
{
ExperimenterData currentUser = (ExperimenterData)
context.lookup(LookupNames.CURRENT_USER_DETAILS);
if (!asAdmin && exp.getId() != currentUser.getId()) return exp;
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
gateway.updateExperimenter(ctx, exp.asExperimenter(),
currentUser.getId());
ExperimenterData data;
if (group != null && exp.getDefaultGroup().getId() != group.getId()) {
gateway.changeCurrentGroup(ctx, exp, group.getId());
}
String userName = uc.getUserName();
if (asAdmin) userName = exp.getUserName();
data = gateway.getUserDetails(ctx, userName, true);
if (currentUser.getId() != exp.getId())
return data;
context.bind(LookupNames.CURRENT_USER_DETAILS, data);
// Bind user details to all agents' registry.
List agents = (List) context.lookup(LookupNames.AGENTS);
Iterator i = agents.iterator();
AgentInfo agentInfo;
while (i.hasNext()) {
agentInfo = (AgentInfo) i.next();
if (agentInfo.isActive()) {
agentInfo.getRegistry().bind(
LookupNames.CURRENT_USER_DETAILS, data);
}
}
return data;
}
/**
* Creates a new instance.
*
* @param gateway Reference to the OMERO entry point.
* Mustn't be <code>null</code>.
* @param registry Reference to the registry. Mustn't be <code>null</code>.
*/
AdminServiceImpl(OMEROGateway gateway, Registry registry)
{
if (registry == null)
throw new IllegalArgumentException("No registry.");
if (gateway == null)
throw new IllegalArgumentException("No gateway.");
context = registry;
this.gateway = gateway;
}
/**
* Implemented as specified by {@link OmeroDataService}.
* @see OmeroDataService#getServerName()
*/
public String getServerName()
{
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
if (uc == null) return "";
return uc.getHostName();
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#getServerVersion()
*/
public String getServerVersion()
{
try {
return gateway.getServerVersion();
} catch (Exception e) {
//ignore it.
}
return "";
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#getLoggingName()
*/
public String getLoggingName()
{
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
return uc.getUserName();
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#getQuota(SecurityContext, Class, long)
*/
public DiskQuota getQuota(SecurityContext ctx, Class type, long id)
throws DSOutOfServiceException, DSAccessException
{
long v = 1000;
long used = 0;//gateway.getUsedSpace(type, id);
long available = gateway.getFreeSpace(ctx, type, id);
int t = DiskQuota.USER;
if (GroupData.class.equals(type))
t = DiskQuota.GROUP;
return new DiskQuota(t, id, used*v, available*v);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#changePassword(SecurityContext, String, String)
*/
public Boolean changePassword(SecurityContext ctx, String oldPassword,
String newPassword)
throws DSOutOfServiceException, DSAccessException
{
if (CommonsLangUtils.isBlank(newPassword))
throw new IllegalArgumentException("Password not valid.");
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
if (!uc.getPassword().equals(oldPassword))
return Boolean.valueOf(false);
gateway.changePassword(ctx, newPassword, oldPassword);
uc.resetPassword(newPassword);
return Boolean.valueOf(true);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#changeExperimenterGroup(SecurityContext, ExperimenterData, long)
*/
public ExperimenterData changeExperimenterGroup(SecurityContext ctx,
ExperimenterData exp, long groupID)
throws DSOutOfServiceException, DSAccessException
{
if (!gateway.isServerRunning(ctx)) return null;
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
if (exp == null) {
exp = gateway.getUserDetails(ctx, uc.getUserName(), false);
}
if (groupID < 0)
throw new DSAccessException("No group specified.");
if (exp.getDefaultGroup().getId() != groupID) {
gateway.changeCurrentGroup(ctx, exp, groupID);
}
ExperimenterData data = gateway.getUserDetails(ctx, uc.getUserName(),
true);
context.bind(LookupNames.CURRENT_USER_DETAILS, data);
// Bind user details to all agents' registry.
List agents = (List) context.lookup(LookupNames.AGENTS);
Iterator i = agents.iterator();
AgentInfo agentInfo;
while (i.hasNext()) {
agentInfo = (AgentInfo) i.next();
if (agentInfo.isActive()) {
agentInfo.getRegistry().bind(
LookupNames.CURRENT_USER_DETAILS, data);
}
}
return data;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#updateExperimenter(SecurityContext, ExperimenterData, GroupData)
*/
public ExperimenterData updateExperimenter(SecurityContext ctx,
ExperimenterData exp, GroupData group)
throws DSOutOfServiceException, DSAccessException
{
return updateExperimenter(ctx, exp, group, false);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#createExperimenters(SecurityContext, AdminObject)
*/
public List<ExperimenterData> createExperimenters(SecurityContext ctx,
AdminObject object)
throws DSOutOfServiceException, DSAccessException
{
if (object == null)
throw new IllegalArgumentException("No object.");
Map<ExperimenterData, UserCredentials> m = object.getExperimenters();
if (m == null || m.size() == 0)
throw new IllegalArgumentException("No experimenters to create.");
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
return gateway.createExperimenters(ctx, object, roles);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#addExperimenters(SecurityContext, GroupData, List)
*/
public void addExperimenters(SecurityContext ctx, GroupData group,
List<ExperimenterData> experimenters)
throws DSOutOfServiceException, DSAccessException
{
if (group == null)
throw new IllegalArgumentException("No group to add " +
"the experimenters to.");
if (experimenters == null || experimenters.size() == 0)
throw new IllegalArgumentException("No experimenters to add.");
gateway.addExperimenters(ctx, group, experimenters);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#createGroup(SecurityContext, AdminObject)
*/
public GroupData createGroup(SecurityContext ctx, AdminObject object)
throws DSOutOfServiceException, DSAccessException
{
if (object == null)
throw new IllegalArgumentException("No object.");
if (object.getGroup() == null)
throw new IllegalArgumentException("No group.");
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
return gateway.createGroup(ctx, object, roles);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#loadExperimenters(SecurityContext, long)
*/
public List<ExperimenterData> loadExperimenters(SecurityContext ctx,
long groupID)
throws DSOutOfServiceException, DSAccessException
{
return gateway.loadExperimenters(ctx, groupID);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#loadGroups(SecurityContext, long)
*/
public List<GroupData> loadGroups(SecurityContext ctx, long id)
throws DSOutOfServiceException, DSAccessException
{
return gateway.loadGroups(ctx, id);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#loadGroupsForExperimenter(SecurityContext, long)
*/
public List<GroupData> loadGroupsForExperimenter(SecurityContext ctx,
long id)
throws DSOutOfServiceException, DSAccessException
{
return gateway.loadGroupsForExperimenter(ctx, id);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#deleteExperimenters(List)
*/
public List<ExperimenterData> deleteExperimenters(SecurityContext ctx,
List<ExperimenterData> experimenters)
throws DSOutOfServiceException, DSAccessException
{
if (CollectionUtils.isEmpty(experimenters))
throw new IllegalArgumentException("No experimenters to delete.");
return gateway.deleteExperimenters(ctx, experimenters);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#deleteGroups(SecurityContext, List)
*/
public List<GroupData> deleteGroups(SecurityContext ctx,
List<GroupData> groups)
throws DSOutOfServiceException, DSAccessException
{
if (CollectionUtils.isEmpty(groups))
throw new IllegalArgumentException("No groups to delete.");
return gateway.deleteGroups(ctx, groups);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#updateGroup(SecurityContext, GroupData, int)
*/
public GroupData updateGroup(SecurityContext ctx, GroupData group)
throws DSOutOfServiceException, DSAccessException
{
if (group == null)
throw new IllegalArgumentException("No group to update.");
gateway.updateGroup(ctx, group);
gateway.joinSession();
return reloadGroup(ctx, group);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#updateGroupPermissions(SecurityContext, GroupData, int, DSCallAdapter)
*/
public void updateGroupPermissions(SecurityContext ctx, GroupData group,
int permissions, DSCallAdapter adapter)
throws DSOutOfServiceException, DSAccessException
{
if (group == null)
throw new IllegalArgumentException("No group to update.");
RequestCallback cb = gateway.updateGroupPermissions(ctx, group, permissions);
cb.setAdapter(adapter);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#reloadGroup(SecurityContext, GroupData)
*/
public GroupData reloadGroup(SecurityContext ctx, GroupData group)
throws DSOutOfServiceException, DSAccessException {
group = gateway.loadGroups(ctx, group.getGroupId()).get(0);
// Review update
Collection groups = (Collection) context
.lookup(LookupNames.USER_GROUP_DETAILS);
Iterator j = groups.iterator();
GroupData g;
Set available = new HashSet<GroupData>();
while (j.hasNext()) {
g = (GroupData) j.next();
if (g.getId() == group.getId())
available.add(group);
else
available.add(g);
}
context.bind(LookupNames.USER_GROUP_DETAILS, available);
List agents = (List) context.lookup(LookupNames.AGENTS);
Iterator i = agents.iterator();
AgentInfo agentInfo;
while (i.hasNext()) {
agentInfo = (AgentInfo) i.next();
if (agentInfo.isActive()) {
agentInfo.getRegistry().bind(LookupNames.USER_GROUP_DETAILS,
available);
}
}
return group;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#copyExperimenters(SecurityContext, GroupData, Set)
*/
public List<ExperimenterData> copyExperimenters(SecurityContext ctx,
GroupData group, Collection experimenters)
throws DSOutOfServiceException, DSAccessException
{
if (group == null)
throw new IllegalArgumentException("No group specified.");
if (CollectionUtils.isEmpty(experimenters))
return new ArrayList<ExperimenterData>();
return gateway.copyExperimenters(ctx, group, experimenters);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#cutAndPasteExperimenters(SecurityContext, Map, Map)
*/
public List<ExperimenterData> cutAndPasteExperimenters(
SecurityContext ctx, Map toPaste, Map toCut)
throws DSOutOfServiceException, DSAccessException
{
if (toPaste == null) toPaste = new HashMap();
if (toCut == null) toCut = new HashMap();
Iterator i;
Object parent;
Entry entry;
List<ExperimenterData> r = new ArrayList<ExperimenterData>();
i = toCut.entrySet().iterator();
while (i.hasNext()) {
entry = (Entry) i.next();
parent = entry.getKey();
if (parent instanceof GroupData)
r.addAll(gateway.removeExperimenters(ctx, (GroupData) parent,
(Set) entry.getValue()));
}
i = toPaste.entrySet().iterator();
while (i.hasNext()) {
entry = (Entry) i.next();
parent = entry.getKey();
if (parent instanceof GroupData) //b/c of orphaned container
r.addAll(copyExperimenters(ctx, (GroupData) parent,
(Set) entry.getValue()));
}
return r;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#countExperimenters(SecurityContext, List)
*/
public Map<Long, Long> countExperimenters(SecurityContext ctx,
List<Long> ids)
throws DSOutOfServiceException, DSAccessException
{
if (CollectionUtils.isEmpty(ids))
return new HashMap<Long, Long>();
return gateway.countExperimenters(ctx, ids);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#updateExperimenters(SecurityContext, GroupData, Map)
*/
public Map<ExperimenterData, Exception> updateExperimenters(
SecurityContext ctx, GroupData group,
Map<ExperimenterData, UserCredentials> experimenters)
throws DSOutOfServiceException, DSAccessException
{
if (experimenters == null)
throw new IllegalArgumentException("No experimenters to update");
Entry entry;
Iterator i = experimenters.entrySet().iterator();
Map<ExperimenterData, Exception>
l = new HashMap<ExperimenterData, Exception>();
List<Experimenter> ownersToAdd = new ArrayList<Experimenter>();
List<Experimenter> ownersToRemove = new ArrayList<Experimenter>();
List<ExperimenterData> administratorsToAdd =
new ArrayList<ExperimenterData>();
List<ExperimenterData>
administratorsToRemove = new ArrayList<ExperimenterData>();
List<ExperimenterData> toActivate = new ArrayList<ExperimenterData>();
List<ExperimenterData> toDeactivate = new ArrayList<ExperimenterData>();
ExperimenterData exp;
UserCredentials uc;
Boolean b;
boolean reset = false;
while (i.hasNext()) {
entry = (Entry) i.next();
exp = (ExperimenterData) entry.getKey();
uc = (UserCredentials) entry.getValue();
try {
updateExperimenter(ctx, exp, group, true);
//b = uc.isOwner();
group = uc.getGroupToHandle();
b = uc.isGroupOwner(group);
if (b != null) {
if (b.booleanValue()) ownersToAdd.add(exp.asExperimenter());
else ownersToRemove.add(exp.asExperimenter());
}
b = uc.isAdministrator();
if (b != null) {
if (b.booleanValue())
administratorsToAdd.add(exp);
else administratorsToRemove.add(exp);
}
b = uc.isActive();
if (b != null) {
if (b.booleanValue())
toActivate.add(exp);
else toDeactivate.add(exp);
}
//Check owner
//reset login name
if (!exp.getUserName().equals(uc.getUserName())) {
reset = gateway.resetUserName(ctx, uc.getUserName(), exp);
if (!reset) {
l.put(exp, new Exception(
"The selected User Name is already taken."));
}
}
} catch (Exception e) {
l.put(exp, e);
}
}
if (group != null) {
if (ownersToAdd.size() > 0)
gateway.handleGroupOwners(ctx, true, group.asGroup(),
ownersToAdd);
if (ownersToRemove.size() > 0)
gateway.handleGroupOwners(ctx, false, group.asGroup(),
ownersToRemove);
}
if (toActivate.size() > 0)
gateway.modifyExperimentersRoles(ctx, true, toActivate,
GroupData.USER);
if (toDeactivate.size() > 0)
gateway.modifyExperimentersRoles(ctx, false, toDeactivate,
GroupData.USER);
if (administratorsToAdd.size() > 0)
gateway.modifyExperimentersRoles(ctx, true, administratorsToAdd,
GroupData.SYSTEM);
if (administratorsToRemove.size() > 0)
gateway.modifyExperimentersRoles(ctx, false, administratorsToRemove,
GroupData.SYSTEM);
return l;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#resetExperimentersPassword(SecurityContext, AdminObject)
*/
public List<ExperimenterData> resetExperimentersPassword(
SecurityContext ctx, AdminObject object)
throws DSOutOfServiceException, DSAccessException
{
if (object == null)
throw new IllegalArgumentException("No experimenters" +
" specified");
if (AdminObject.RESET_PASSWORD != object.getIndex())
throw new IllegalArgumentException("Index not valid");
Map<ExperimenterData, UserCredentials> map = object.getExperimenters();
if (map == null)
throw new IllegalArgumentException("No experimenters specified");
List<ExperimenterData> l = new ArrayList<ExperimenterData>();
UserCredentials uc;
Entry<ExperimenterData, UserCredentials> entry;
ExperimenterData exp;
Iterator<Entry<ExperimenterData, UserCredentials>> i = map.entrySet().iterator();
while (i.hasNext()) {
entry = i.next();
exp = entry.getKey();
uc = entry.getValue();
try {
//check that the user is not ldap
String ldap = gateway.lookupLdapAuthExperimenter(ctx,
exp.getId());
if (CommonsLangUtils.isNotBlank(ldap)) l.add(exp);
else
gateway.resetPassword(ctx, exp.getUserName(), exp.getId(),
uc.getPassword());
} catch (Exception e) {
l.add(exp);
}
}
return l;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#activateExperimenters(SecurityContext, AdminObject)
*/
public List<ExperimenterData> activateExperimenters(SecurityContext ctx,
AdminObject object)
throws DSOutOfServiceException, DSAccessException
{
if (object == null)
throw new IllegalArgumentException("No experimenters" +
" specified");
if (AdminObject.ACTIVATE_USER != object.getIndex())
throw new IllegalArgumentException("Index not valid.");
Map<ExperimenterData, UserCredentials> map = object.getExperimenters();
if (map == null)
throw new IllegalArgumentException("No experimenters specified");
List<ExperimenterData> l = new ArrayList<ExperimenterData>();
UserCredentials uc;
Entry entry;
ExperimenterData exp;
Iterator i = map.entrySet().iterator();
List<ExperimenterData> toActivate = new ArrayList<ExperimenterData>();
List<ExperimenterData> toDeactivate = new ArrayList<ExperimenterData>();
while (i.hasNext()) {
entry = (Entry) i.next();
exp = (ExperimenterData) entry.getKey();
uc = (UserCredentials) entry.getValue();
if (uc.isActive()) toActivate.add(exp);
else toDeactivate.add(exp);
}
if (toActivate.size() > 0)
gateway.modifyExperimentersRoles(ctx, true, toActivate,
GroupData.USER);
if (toDeactivate.size() > 0)
gateway.modifyExperimentersRoles(ctx, false, toDeactivate,
GroupData.USER);
return l;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#reloadPIGroups(SecurityContext, ExperimenterData)
*/
public List<GroupData> reloadPIGroups(SecurityContext ctx,
ExperimenterData exp)
throws DSOutOfServiceException, DSAccessException
{
Set<GroupData> groups;
Set<GroupData> available;
UserCredentials uc = (UserCredentials)
context.lookup(LookupNames.USER_CREDENTIALS);
List<ExperimenterData> exps = new ArrayList<ExperimenterData>();
groups = gateway.getAvailableGroups(ctx, exp);
//Check if the current experimenter is an administrator
Iterator<GroupData> i = groups.iterator();
GroupData g;
available = new HashSet<GroupData>();
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
while (i.hasNext()) {
g = i.next();
if (!isSecuritySystemGroup(g.getId())) {
available.add(g);
} else {
if (g.getId() == roles.systemGroupId)
uc.setAdministrator(true);
}
}
context.bind(LookupNames.USER_GROUP_DETAILS, available);
List<Long> ids = new ArrayList<Long>();
i = available.iterator();
Set set;
Iterator j;
ExperimenterData e;
while (i.hasNext()) {
g = (GroupData) i.next();
set = g.getExperimenters();
j = set.iterator();
while (j.hasNext()) {
e = (ExperimenterData) j.next();
if (!ids.contains(e.getId())) {
ids.add(e.getId());
exps.add(e);
}
}
}
context.bind(LookupNames.USERS_DETAILS, exps);
List<GroupData> result = new ArrayList<GroupData>();
Iterator<GroupData> k = available.iterator();
while (k.hasNext()) {
result.add(k.next());
}
//Bind user details to all agents' registry.
List agents = (List) context.lookup(LookupNames.AGENTS);
j = agents.iterator();
AgentInfo agentInfo;
Registry reg;
while (i.hasNext()) {
agentInfo = (AgentInfo) j.next();
if (agentInfo.isActive()) {
reg = agentInfo.getRegistry();
reg.bind(LookupNames.USER_GROUP_DETAILS, available);
reg.bind(LookupNames.USERS_DETAILS, exps);
}
}
return result;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isExistingExperimenter(SecurityContext, String)
*/
public ExperimenterData lookupExperimenter(SecurityContext ctx,
String name)
throws DSOutOfServiceException, DSAccessException
{
Experimenter value = gateway.lookupExperimenter(ctx, name);
if (value != null)
return (ExperimenterData) PojoMapper.asDataObject(value);
return null;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isExistingGroup(SecurityContext, String)
*/
public GroupData lookupGroup(SecurityContext ctx, String name)
throws DSOutOfServiceException, DSAccessException
{
ExperimenterGroup value = gateway.lookupGroup(ctx, name);
if (value != null)
return (GroupData) PojoMapper.asDataObject(value);
return null;
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#uploadUserPhoto(SecurityContext, File, String, experimenter)
*/
public BufferedImage uploadUserPhoto(SecurityContext ctx, File f,
String format, ExperimenterData experimenter)
throws DSOutOfServiceException, DSAccessException
{
if (experimenter == null)
throw new IllegalArgumentException("No experimenter specified.");
if (f == null)
throw new IllegalArgumentException("No photo specified.");
long id = gateway.uploadExperimenterPhoto(ctx, f, format,
experimenter.getId());
if (id < 0) return null;
List<DataObject> exp = new ArrayList<DataObject>();
exp.add(experimenter);
Map<DataObject, BufferedImage> map =
context.getImageService().getExperimenterThumbnailSet(ctx, exp, 0);
return map.get(experimenter);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isConnected()
*/
public boolean isConnected() { return gateway.isConnected(); }
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#getUserDetails()
*/
public ExperimenterData getUserDetails()
{
return (ExperimenterData) context.lookup(
LookupNames.CURRENT_USER_DETAILS);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#getAvailableUserGroups()
*/
public Collection<GroupData> getAvailableUserGroups()
{
return (Collection<GroupData>) context.lookup(
LookupNames.USER_GROUP_DETAILS);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isSecuritySystemGroup(long)
*/
public boolean isSecuritySystemGroup(long groupID)
{
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
if (roles == null) return false;
return (roles.guestGroupId == groupID ||
roles.systemGroupId == groupID ||
roles.userGroupId == groupID);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isSecuritySystemGroup(long, String)
*/
public boolean isSecuritySystemGroup(long groupID, String key)
{
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
if (roles == null) return false;
if (GroupData.USER.equals(key)) {
return roles.userGroupId == groupID;
} else if (GroupData.SYSTEM.equals(key)) {
return roles.systemGroupId == groupID;
} else if (GroupData.GUEST.equals(key)) {
return roles.guestGroupId == groupID;
}
throw new IllegalArgumentException("Key not valid.");
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isSystemUser(long)
*/
public boolean isSystemUser(long userID)
{
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
if (roles == null) return false;
return (roles.rootId == userID || roles.guestId == userID);
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#isSystemUser(long, String)
*/
public boolean isSystemUser(long userID, String key)
{
Roles roles = (Roles) context.lookup(LookupNames.SYSTEM_ROLES);
if (roles == null) return false;
if (GroupData.SYSTEM.equals(key)) {
return roles.rootId == userID;
} else if (GroupData.GUEST.equals(key)) {
return roles.guestId == userID;
}
throw new IllegalArgumentException("Key not valid.");
}
/**
* Implemented as specified by {@link AdminService}.
* @see AdminService#lookupLdapAuthExperimenter(SecurityContext, long)
*/
public String lookupLdapAuthExperimenter(SecurityContext ctx, long userID)
throws DSOutOfServiceException, DSAccessException
{
return gateway.lookupLdapAuthExperimenter(ctx, userID);
}
}