/*
* Copyright 2010-2015 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package integration;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
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.UUID;
import ome.formats.OMEROMetadataStoreClient;
import ome.formats.importer.IObservable;
import ome.formats.importer.IObserver;
import ome.formats.importer.ImportCandidates;
import ome.formats.importer.ImportConfig;
import ome.formats.importer.ImportContainer;
import ome.formats.importer.ImportEvent;
import ome.formats.importer.ImportLibrary;
import ome.formats.importer.OMEROWrapper;
import ome.formats.importer.util.ErrorHandler;
import ome.io.nio.SimpleBackOff;
import ome.services.blitz.repo.path.FsFile;
import omero.ApiUsageException;
import omero.RLong;
import omero.RType;
import omero.ServerError;
import omero.rtypes;
import omero.api.IAdminPrx;
import omero.api.IQueryPrx;
import omero.api.IUpdatePrx;
import omero.api.ServiceFactoryPrx;
import omero.cmd.CmdCallbackI;
import omero.cmd.Delete2;
import omero.cmd.Delete2Response;
import omero.cmd.DoAll;
import omero.cmd.DoAllRsp;
import omero.cmd.ERR;
import omero.cmd.HandlePrx;
import omero.cmd.OK;
import omero.cmd.Request;
import omero.cmd.Response;
import omero.cmd.State;
import omero.cmd.Status;
import omero.grid.RepositoryMap;
import omero.grid.RepositoryPrx;
import omero.model.BooleanAnnotation;
import omero.model.BooleanAnnotationI;
import omero.model.ChannelBinding;
import omero.model.CommentAnnotation;
import omero.model.CommentAnnotationI;
import omero.model.Dataset;
import omero.model.DatasetAnnotationLink;
import omero.model.DatasetAnnotationLinkI;
import omero.model.Detector;
import omero.model.DetectorAnnotationLink;
import omero.model.DetectorAnnotationLinkI;
import omero.model.Experiment;
import omero.model.Experimenter;
import omero.model.ExperimenterGroup;
import omero.model.ExperimenterGroupI;
import omero.model.ExperimenterI;
import omero.model.FileAnnotation;
import omero.model.FileAnnotationI;
import omero.model.Fileset;
import omero.model.FilesetI;
import omero.model.IObject;
import omero.model.Image;
import omero.model.ImageAnnotationLink;
import omero.model.ImageAnnotationLinkI;
import omero.model.Instrument;
import omero.model.InstrumentAnnotationLink;
import omero.model.InstrumentAnnotationLinkI;
import omero.model.LightSource;
import omero.model.LightSourceAnnotationLink;
import omero.model.LightSourceAnnotationLinkI;
import omero.model.LongAnnotation;
import omero.model.LongAnnotationI;
import omero.model.MapAnnotation;
import omero.model.MapAnnotationI;
import omero.model.NamedValue;
import omero.model.OriginalFile;
import omero.model.OriginalFileAnnotationLink;
import omero.model.OriginalFileAnnotationLinkI;
import omero.model.Permissions;
import omero.model.PermissionsI;
import omero.model.Pixels;
import omero.model.Plate;
import omero.model.PlateAcquisition;
import omero.model.PlateAcquisitionAnnotationLink;
import omero.model.PlateAcquisitionAnnotationLinkI;
import omero.model.PlateAnnotationLink;
import omero.model.PlateAnnotationLinkI;
import omero.model.Project;
import omero.model.ProjectAnnotationLink;
import omero.model.ProjectAnnotationLinkI;
import omero.model.QuantumDef;
import omero.model.RenderingDef;
import omero.model.Screen;
import omero.model.ScreenAnnotationLink;
import omero.model.ScreenAnnotationLinkI;
import omero.model.TagAnnotation;
import omero.model.TagAnnotationI;
import omero.model.TermAnnotation;
import omero.model.TermAnnotationI;
import omero.model.Well;
import omero.model.WellAnnotationLink;
import omero.model.WellAnnotationLinkI;
import omero.model.WellSample;
import omero.sys.EventContext;
import omero.sys.ParametersI;
import org.apache.commons.lang.StringUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import com.google.common.collect.Lists;
/**
* Base test for integration tests.
*
* @since Beta4.2
*/
public class AbstractServerTest extends AbstractTest {
/** Performs the move as data owner. */
public static final int MEMBER = 100;
/** Performs the move as group owner. */
public static final int GROUP_OWNER = 101;
/** Performs the move as group owner. */
public static final int ADMIN = 102;
/** Identifies the <code>system</code> group. */
public String SYSTEM_GROUP = "system";
/** Identifies the <code>user</code> group. */
public String USER_GROUP = "user";
/** Identifies the <code>guest</code> group. */
public String GUEST_GROUP = "guest";
/** Scaling factor used for CmdCallbackI loop timings. */
protected long scalingFactor;
/** The client object, this is the entry point to the Server. */
protected omero.client client;
/** A root-client object. */
protected omero.client root;
/** Helper reference to the <code>Service factory</code>. */
protected ServiceFactoryPrx factory;
/** Helper reference to the <code>Service factory</code>. */
protected ServiceFactoryPrx factoryEncrypted;
/** Helper reference to the <code>IQuery</code> service. */
protected IQueryPrx iQuery;
/** Helper reference to the <code>IUpdate</code> service. */
protected IUpdatePrx iUpdate;
/** Helper reference to the <code>IAdmin</code> service. */
protected IAdminPrx iAdmin;
/** Reference to the importer store. */
protected OMEROMetadataStoreClient importer;
/** Helper class creating mock object. */
protected ModelMockFactory mmFactory;
/** the managed repository directory for the user from test class setup **/
private String userFsDir = null;
/**
* {@link omero.client} instances which are created via the newUser*
* methods. These will be forcefully closed at the end of the test.
* "new omero.client(...)" should be strictly avoided except for in the
* method {@link #newOmeroClient()}.
*
* @see #newUserAndGroup(Permissions)
* @see #newUserAndGroup(String)
* @see #newUserInGroup()
* @see #newUserInGroup(EventContext)
* @see #newUserInGroup(ExperimenterGroup)
*/
private final Set<omero.client> clients = new HashSet<omero.client>();
/**
* Sole location where {@link omero.client#client()} or any other
* {@link omero.client} constructor should be called.
*/
protected omero.client newOmeroClient() {
omero.client client = new omero.client(); // OK
clients.add(client);
return client;
}
/**
* Creates a client for the root user.
*
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected omero.client newRootOmeroClient() throws Exception {
omero.client client = newOmeroClient();
client.createSession("root", rootpass);
return client;
}
/**
* Initializes the various services.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Override
@BeforeClass(alwaysRun = true)
protected void setUp() throws Exception {
// administrator client
omero.client tmp = newOmeroClient();
rootpass = tmp.getProperty("omero.rootpass");
root = newRootOmeroClient();
tmp.__del__();
scalingFactor = 500;
final String timeoutString = System.getProperty("omero.test.timeout");
if (StringUtils.isNotBlank(timeoutString)) {
try {
scalingFactor = Long.valueOf(timeoutString);
} catch (NumberFormatException e) {
log.warn("Problem setting 'omero.test.timeout' to: {}. " +
"Defaulting to {}.", timeoutString, scalingFactor);
}
}
final EventContext ctx = newUserAndGroup("rw----");
this.userFsDir = ctx.userName + "_" + ctx.userId + FsFile.separatorChar;
SimpleBackOff backOff = new SimpleBackOff();
long newScalingFactor = (long) backOff.getScalingFactor()
* backOff.getCount();
if (newScalingFactor > scalingFactor) {
scalingFactor = newScalingFactor;
}
}
/**
* Closes the session.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Override
@AfterClass
public void tearDown() throws Exception {
for (omero.client c : clients) {
if (c != null) {
c.__del__();
}
}
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserAndGroup(String perms, boolean owner)
throws Exception {
return newUserAndGroup(new PermissionsI(perms), owner);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserAndGroup(String perms) throws Exception {
return newUserAndGroup(new PermissionsI(perms), false);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserAndGroup(Permissions perms, boolean owner)
throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
String uuid = UUID.randomUUID().toString();
ExperimenterGroup g = new ExperimenterGroupI();
g.setName(omero.rtypes.rstring(uuid));
g.setLdap(omero.rtypes.rbool(false));
g.getDetails().setPermissions(perms);
g = new ExperimenterGroupI(rootAdmin.createGroup(g), false);
return newUserInGroup(g, owner);
}
/**
* Changes the permissions of the group.
*
* @param perms
* The permissions level.
* @param groupId
* The identifier of the group to handle.
* @throws Exception
* Thrown if an error occurred.
*/
protected void resetGroupPerms(String perms, long groupId) throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
ExperimenterGroup g = rootAdmin.getGroup(groupId);
g.getDetails().setPermissions(new PermissionsI(perms));
rootAdmin.updateGroup(g);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenter. @ * @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(Permissions perms,
long experimenterId) throws Exception {
return newGroupAddUser(perms, Arrays.asList(experimenterId), false);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenter.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(Permissions perms,
long experimenterId, boolean owner) throws Exception {
return newGroupAddUser(perms, Arrays.asList(experimenterId), owner);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterIds
* The identifier of the experimenters.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(Permissions perms,
List<Long> experimenterIds, boolean owner) throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
String uuid = UUID.randomUUID().toString();
ExperimenterGroup g = new ExperimenterGroupI();
g.setName(omero.rtypes.rstring(uuid));
g.setLdap(omero.rtypes.rbool(false));
g.getDetails().setPermissions(perms);
g = new ExperimenterGroupI(rootAdmin.createGroup(g), false);
return addUsers(g, experimenterIds, owner);
}
protected ExperimenterGroup addUsers(ExperimenterGroup g,
List<Long> experimenterIds, boolean owner) throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
g = rootAdmin.getGroup(g.getId().getValue());
Iterator<Long> i = experimenterIds.iterator();
List<Experimenter> l = new ArrayList<Experimenter>();
while (i.hasNext()) {
Experimenter e = rootAdmin.getExperimenter(i.next());
rootAdmin.addGroups(e, Arrays.asList(g));
l.add(e);
}
if (owner && l.size() > 0) {
rootAdmin.addGroupOwners(g, l);
}
return g;
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenters.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(String perms,
List<Long> experimenterIds, boolean owner) throws Exception {
return newGroupAddUser(new PermissionsI(perms), experimenterIds, owner);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenters.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(String perms,
List<Long> experimenterIds) throws Exception {
return newGroupAddUser(new PermissionsI(perms), experimenterIds, false);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenter.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(String perms,
long experimenterId) throws Exception {
return newGroupAddUser(new PermissionsI(perms), experimenterId);
}
/**
* Creates a new group and experimenter and returns the event context.
*
* @param perms
* The permissions level.
* @param experimenterId
* The identifier of the experimenter.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected ExperimenterGroup newGroupAddUser(String perms,
long experimenterId, boolean owner) throws Exception {
return newGroupAddUser(new PermissionsI(perms), experimenterId, owner);
}
/**
* Creates a new user in the current group.
*
* @return
*/
protected EventContext newUserInGroup() throws Exception {
EventContext ec = client.getSession().getAdminService()
.getEventContext();
return newUserInGroup(ec);
}
/**
* Takes the {@link EventContext} from another user and creates a new user
* in the same group as that user is currently logged in to.
*
* @param previousUser
* The context of the previous user.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserInGroup(EventContext previousUser)
throws Exception {
return newUserInGroup(previousUser, false);
}
/**
* Takes the {@link EventContext} from another user and creates a new user
* in the same group as that user is currently logged in to.
*
* @param previousUser
* The context of the previous user.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserInGroup(EventContext previousUser,
boolean owner) throws Exception {
ExperimenterGroup eg = new ExperimenterGroupI(previousUser.groupId,
false);
return newUserInGroup(eg, owner);
}
/**
* Creates a new user in the specified group.
*
* @param group
* The group to add the user to.
* @param owner
* Pass <code>true</code> to indicate that the new user is an
* owner of the group, <code>false</code> otherwise.
* @return The context.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext newUserInGroup(ExperimenterGroup group, boolean owner)
throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
group = rootAdmin.getGroup(group.getId().getValue());
String uuid = UUID.randomUUID().toString();
Experimenter e = new ExperimenterI();
e.setOmeName(omero.rtypes.rstring(uuid));
e.setFirstName(omero.rtypes.rstring("integration"));
e.setLastName(omero.rtypes.rstring("tester"));
e.setLdap(omero.rtypes.rbool(false));
long id = newUserInGroupWithPassword(e, group, uuid);
e = rootAdmin.getExperimenter(id);
rootAdmin.addGroups(e, Arrays.asList(group));
if (owner) {
rootAdmin.addGroupOwners(group, Arrays.asList(e));
}
omero.client client = newOmeroClient();
client.createSession(uuid, uuid);
return init(client);
}
/**
* Creates the specified user in the specified groups. Also adds the user
* to the default user group. Requires a password.
*
* @param experimenter The pre-populated Experimenter object.
* @param groups The target groups.
* @param password The user password.
* @return long The created user ID.
*/
protected long newUserInGroupWithPassword(Experimenter experimenter,
List<ExperimenterGroup> groups, String password) throws Exception {
IAdminPrx rootAdmin = root.getSession().getAdminService();
ExperimenterGroup userGroup = rootAdmin.lookupGroup(USER_GROUP);
return rootAdmin.createExperimenterWithPassword(experimenter,
omero.rtypes.rstring(password), userGroup, groups);
}
/**
* Creates the specified user in the specified group. Also adds the user
* to the default user group. Requires a password.
*
* @param experimenter The pre-populated Experimenter object.
* @param group The target group.
* @param password The user password.
* @return long The created user ID.
*/
protected long newUserInGroupWithPassword(Experimenter experimenter,
ExperimenterGroup group, String password) throws Exception {
return newUserInGroupWithPassword(experimenter,
Lists.newArrayList(group), password);
}
/**
* Create a fileset with a template prefix appropriate for the user created
* by {@link #setUp()}. Does not access the OMERO API or persist the new
* fileset.
*
* @return a new fileset
*/
protected Fileset newFileset() {
final Fileset fileset = new FilesetI();
fileset.setTemplatePrefix(omero.rtypes.rstring(this.userFsDir
+ System.currentTimeMillis() + FsFile.separatorChar));
return fileset;
}
/**
* Logs in the user.
*
* @param g
* The group to log into.
* @throws Exception
* Thrown if an error occurred.
*/
protected EventContext loginUser(ExperimenterGroup g) throws Exception {
EventContext ec = iAdmin.getEventContext();
omero.client client = newOmeroClient();
client.createSession(ec.userName, ec.userName);
client.getSession().setSecurityContext(
new ExperimenterGroupI(g.getId(), false));
return init(client);
}
/**
* Logs in the user.
*
* @param ownerEc
* The context of the user.
* @throws Exception
* Thrown if an error occurred.
*/
protected void loginUser(EventContext ownerEc) throws Exception {
omero.client client = newOmeroClient();
client.createSession(ownerEc.userName, ownerEc.userName);
init(client);
}
/**
* Creates a new {@link omero.client} for root based on the current group.
*/
protected void logRootIntoGroup() throws Exception {
EventContext ec = iAdmin.getEventContext();
logRootIntoGroup(ec);
}
/**
* Creates a new {@link omero.client} for root based on the
* {@link EventContext}
*/
protected void logRootIntoGroup(EventContext ec) throws Exception {
logRootIntoGroup(ec.groupId);
}
/**
* Creates a new {@link omero.client} for root based on the group
* identifier.
*/
protected void logRootIntoGroup(long groupId) throws Exception {
omero.client rootClient = newRootOmeroClient();
rootClient.getSession().setSecurityContext(
new ExperimenterGroupI(groupId, false));
init(rootClient);
}
/**
* Makes the current user an owner of the current group.
*/
protected void makeGroupOwner() throws Exception {
EventContext ec = client.getSession().getAdminService()
.getEventContext();
IAdminPrx rootAdmin = root.getSession().getAdminService();
rootAdmin.setGroupOwner(new ExperimenterGroupI(ec.groupId, false),
new ExperimenterI(ec.userId, false));
disconnect();
init(ec); // Create new session with the added privileges
}
/**
* Saves the current client before calling {@link #clean()} and returns it
* to the user.
*/
protected omero.client disconnect() throws Exception {
omero.client oldClient = client;
clean();
client = null;
return oldClient;
}
/**
* If {@link #client} is non-null, destroys the client and nulls all fields
* which were set on creation.
*/
protected void clean() throws Exception {
if (importer != null) {
importer.closeServices();
importer = null;
}
if (client != null) {
client.__del__();
}
client = null;
}
/**
*/
protected EventContext init(EventContext ec) throws Exception {
omero.client c = newOmeroClient();
factoryEncrypted = c.createSession(ec.userName, ec.userName);
return init(c);
}
/**
* Resets the client and return the event context.
*
* @param client
* The client to handle.
* @return The event context to handle.
* @throws Exception
*/
protected EventContext init(omero.client client) throws Exception {
clean();
this.client = client;
factory = client.getSession();
iQuery = factory.getQueryService();
iUpdate = factory.getUpdateService();
iAdmin = factory.getAdminService();
mmFactory = new ModelMockFactory(factory.getPixelsService());
importer = new OMEROMetadataStoreClient();
importer.initialize(factory);
return iAdmin.getEventContext();
}
/**
* Compares the passed rendering definitions.
*
* @param def1
* The first rendering definition to handle.
* @param def2
* The second rendering definition to handle.
* @throws Exception
* Thrown if an error occurred.
*/
protected void compareRenderingDef(RenderingDef def1, RenderingDef def2)
throws Exception {
assertNotNull(def1);
assertNotNull(def2);
assertTrue(def1.getDefaultZ().getValue() == def2.getDefaultZ()
.getValue());
assertTrue(def1.getDefaultT().getValue() == def2.getDefaultT()
.getValue());
assertTrue(def1.getModel().getValue().getValue()
.equals(def2.getModel().getValue().getValue()));
QuantumDef q1 = def1.getQuantization();
QuantumDef q2 = def2.getQuantization();
assertNotNull(q1);
assertNotNull(q2);
assertTrue(q1.getBitResolution().getValue() == q2.getBitResolution()
.getValue());
assertTrue(q1.getCdStart().getValue() == q2.getCdStart().getValue());
assertTrue(q1.getCdEnd().getValue() == q2.getCdEnd().getValue());
List<ChannelBinding> channels1 = def1.copyWaveRendering();
List<ChannelBinding> channels2 = def2.copyWaveRendering();
assertNotNull(channels1);
assertNotNull(channels2);
assertTrue(channels1.size() == channels2.size());
Iterator<ChannelBinding> i = channels1.iterator();
ChannelBinding c1, c2;
int index = 0;
while (i.hasNext()) {
c1 = i.next();
c2 = channels2.get(index);
assertTrue(c1.getAlpha().getValue() == c2.getAlpha().getValue());
assertTrue(c1.getRed().getValue() == c2.getRed().getValue());
assertTrue(c1.getGreen().getValue() == c2.getGreen().getValue());
assertTrue(c1.getBlue().getValue() == c2.getBlue().getValue());
assertTrue(c1.getCoefficient().getValue() == c2.getCoefficient()
.getValue());
assertTrue(c1.getFamily().getValue().getValue()
.equals(c2.getFamily().getValue().getValue()));
assertTrue(c1.getInputStart().getValue() == c2.getInputStart()
.getValue());
assertTrue(c1.getInputEnd().getValue() == c2.getInputEnd()
.getValue());
Boolean b1 = Boolean.valueOf(c1.getActive().getValue());
Boolean b2 = Boolean.valueOf(c2.getActive().getValue());
assertTrue(b1.equals(b2));
b1 = Boolean.valueOf(c1.getNoiseReduction().getValue());
b2 = Boolean.valueOf(c2.getNoiseReduction().getValue());
assertTrue(b1.equals(b2));
}
}
/**
* Helper method to load the wells.
*
* @param plateID
* The identifier of the plate.
* @param pixels
* Pass <code>true</code> to load the pixels, <code>false</code>
* otherwise.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
@SuppressWarnings("unchecked")
protected List<Well> loadWells(long plateID, boolean pixels)
throws Exception {
StringBuilder sb = new StringBuilder();
ParametersI param = new ParametersI();
param.addLong("plateID", plateID);
sb.append("select well from Well as well ");
sb.append("left outer join fetch well.plate as pt ");
sb.append("left outer join fetch well.wellSamples as ws ");
sb.append("left outer join fetch ws.plateAcquisition as pa ");
sb.append("left outer join fetch ws.image as img ");
if (pixels) {
sb.append("left outer join fetch img.pixels as pix ");
sb.append("left outer join fetch pix.pixelsType as pixType ");
}
sb.append("where pt.id = :plateID");
return (List<Well>) (List<?>) iQuery.findAllByQuery(sb.toString(),
param);
}
/**
* Helper method to load a well sample with its well and plate intact (and
* possibly a screen if one exists) for the given pixels.
*
* @param p
* @return
* @throws ServerError
*/
protected WellSample getWellSample(Pixels p) throws ServerError {
long id = p.getImage().getId().getValue();
String sql = "select ws from WellSample as ws ";
sql += "join fetch ws.well as w ";
sql += "left outer join fetch ws.plateAcquisition as pa ";
sql += "join fetch w.plate as p ";
sql += "left outer join fetch p.screenLinks sl ";
sql += "left outer join fetch sl.parent s ";
sql += "where ws.image.id = :id";
ParametersI param = new ParametersI();
param.addId(id);
List<IObject> results = iQuery.findAllByQuery(sql, param);
assertTrue(results.size() == 1);
WellSample ws = (WellSample) results.get(0);
assertNotNull(ws);
return ws;
}
/**
* Helper method to load the Experiment which is is associated with the
* pixels argument via Image.
*
* @param p
* @return
* @throws ServerError
*/
protected Experiment getExperiment(Pixels p) throws ServerError {
long id = p.getImage().getId().getValue();
String sql = "select e from Image i ";
sql += "join i.experiment e ";
sql += "where i.id = :id";
ParametersI param = new ParametersI();
param.addId(id);
List<IObject> results = iQuery.findAllByQuery(sql, param);
assertTrue(results.size() == 1);
Experiment e = (Experiment) results.get(0);
assertNotNull(e);
return e;
}
/**
* @return a repository rooted at a directory named <q>ManagedRepository</q>
* @throws ServerError if the repository map could not be retrieved
*/
protected RepositoryPrx getManagedRepository() throws ServerError {
final RepositoryMap repos = factory.sharedResources().repositories();
int index = repos.descriptions.size();
while (--index >= 0) {
if ("ManagedRepository".equals(repos.descriptions.get(index).getName().getValue())) {
return repos.proxies.get(index);
}
}
throw new RuntimeException("no managed repository");
}
/**
* Makes sure that the passed object exists.
*
* @param obj
* The object to handle.
* @throws Exception
* Thrown if an error occurred.
*/
protected void assertExists(IObject obj) throws Exception {
IObject copy = iQuery.find(obj.getClass().getSimpleName(), obj.getId()
.getValue());
assertNotNull(
String.format("%s:%s", obj.getClass().getName(), obj.getId()
.getValue())
+ " is missing!", copy);
}
protected void assertAllExist(IObject... obj) throws Exception {
for (IObject iObject : obj) {
assertExists(iObject);
}
}
protected void assertAllExist(Iterable<? extends IObject> obj) throws Exception {
for (IObject iObject : obj) {
assertExists(iObject);
}
}
protected void assertExists(String className, Long id) throws ServerError {
assertAllExist(className, Collections.singletonList(id));
}
protected void assertAllExist(String className, Collection<Long> ids) throws ServerError {
final String hql = "SELECT COUNT(*) FROM " + className + " WHERE id IN (:ids)";
final List<List<RType>> results = iQuery.projection(hql, new ParametersI().addIds(ids));
final long count = ((RLong) results.get(0).get(0)).getValue();
Assert.assertEquals(count, ids.size());
}
/**
* Makes sure that the passed object does not exist.
*
* @param obj
* The object to handle.
* @throws Exception
* Thrown if an error occurred.
*/
protected void assertDoesNotExist(IObject obj) throws Exception {
IObject copy = iQuery.find(obj.getClass().getSimpleName(), obj.getId()
.getValue());
assertNull(
String.format("%s:%s", obj.getClass().getName(), obj.getId()
.getValue())
+ " still exists!", copy);
}
protected void assertNoneExist(IObject... obj) throws Exception {
for (IObject iObject : obj) {
assertDoesNotExist(iObject);
}
}
protected void assertNoneExist(Iterable<? extends IObject> obj) throws Exception {
for (IObject iObject : obj) {
assertDoesNotExist(iObject);
}
}
protected void assertDoesNotExist(String className, Long id) throws ServerError {
assertNoneExist(className, Collections.singletonList(id));
}
protected void assertNoneExist(String className, Collection<Long> ids) throws ServerError {
final String hql = "SELECT COUNT(*) FROM " + className + " WHERE id IN (:ids)";
final List<List<RType>> results = iQuery.projection(hql, new ParametersI().addIds(ids));
final long count = ((RLong) results.get(0).get(0)).getValue();
Assert.assertEquals(count, 0);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param file
* The file to import.
* @param format
* The format of the file to import.
* @return The collection of imported pixels set.
* @throws Exception
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(File file, String format)
throws Throwable {
return importFile(importer, file, format, false, null);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param file
* The file to import.
* @param format
* The format of the file to import.
* @return The collection of imported pixels set.
* @throws Throwable
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(File file, String format, boolean metadata)
throws Throwable {
return importFile(importer, file, format, metadata, null);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param importer
* The metadataStore to use.
* @param file
* The file to import.
* @param format
* The format of the file to import.
* @return The collection of imported pixels set.
* @throws Throwable
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(OMEROMetadataStoreClient importer,
File file, String format) throws Throwable {
return importFile(importer, file, format, false, null);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param importer
* The metadataStore to use.
* @param file
* The file to import.
* @param target
* The container where to import the image.
* @return The collection of imported pixels set.
* @throws Throwable
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(File file, String format, IObject target)
throws Throwable {
return importFile(importer, file, format, false, target);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param importer
* The metadataStore to use.
* @param file
* The file to import.
* @param format
* The format of the file to import.
* @param metadata
* Pass <code>true</code> to only import the metadata,
* <code>false</code> otherwise.
* @return The collection of imported pixels set.
* @throws Throwable
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(OMEROMetadataStoreClient importer,
File file, String format, boolean metadata) throws Throwable {
return importFile(importer, file, format, metadata, null);
}
/**
* Imports the specified OME-XML file and returns the pixels set if
* successfully imported.
*
* @param importer
* The metadataStore to use.
* @param file
* The file to import.
* @param format
* The format of the file to import.
* @param metadata
* Pass <code>true</code> to only import the metadata,
* <code>false</code> otherwise.
* @return The collection of imported pixels set.
* @throws Throwable
* Thrown if an error occurred while encoding the image.
*/
protected List<Pixels> importFile(OMEROMetadataStoreClient importer,
File file, String format, boolean metadata, IObject target)
throws Throwable {
String[] paths = new String[1];
paths[0] = file.getAbsolutePath();
ImportConfig config = new ImportConfig();
OMEROWrapper reader = new OMEROWrapper(config);
IObserver o = new IObserver() {
public void update(IObservable importLibrary, ImportEvent event) {
if (event instanceof ErrorHandler.EXCEPTION_EVENT) {
Exception ex = ((ErrorHandler.EXCEPTION_EVENT) event).exception;
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
} else {
throw new RuntimeException(ex);
}
}
}
};
ImportCandidates candidates = new ImportCandidates(reader, paths, o);
ImportLibrary library = new ImportLibrary(importer, reader);
library.addObserver(o);
ImportContainer ic = candidates.getContainers().get(0);
// new ImportContainer(
// file, null, target, false, null, null, null, null);
ic.setUserSpecifiedName(format);
ic.setTarget(target);
// ic = library.uploadFilesToRepository(ic);
List<Pixels> pixels = library.importImage(ic, 0, 0, 1);
assertNotNull(pixels);
assertTrue(pixels.size() > 0);
return pixels;
}
/**
* Basic asynchronous delete command. Used in order to reduce the number of
* places that we do the same thing in case the API changes.
*
* @param dc
* The command to handle.
* @throws ApiUsageException
* @throws ServerError
* @throws InterruptedException
*/
protected String delete(omero.client c, Delete2... dc)
throws ApiUsageException, ServerError, InterruptedException {
return delete(true, c, dc);
}
/**
* Basic asynchronous delete command. Used in order to reduce the number of
* places that we do the same thing in case the API changes.
*
* @param passes
* Pass <code>true</code> to indicate that no error found in
* report, <code>false</code> otherwise.
* @param dc
* The command to handle.
* @param strict
* whether or not the method should succeed.
* @throws ApiUsageException
* @throws ServerError
* @throws InterruptedException
*/
protected String delete(boolean passes, omero.client c, Delete2... dc)
throws ApiUsageException, ServerError, InterruptedException {
callback(passes, c, dc);
return "ok";
}
/**
* Asynchronous command for a single delete, this means a single report is
* returned for testing.
*
* @param dc
* The SINGLE command to handle.
* @throws ApiUsageException
* @throws ServerError
* @throws InterruptedException
*/
protected Delete2Response singleDeleteWithReport(omero.client c, Delete2 dc)
throws ApiUsageException, ServerError, InterruptedException {
return deleteWithReports(c, dc)[0];
}
/**
* Asynchronous command for delete, report array is returned.
*
* @param dc
* The command to handle.
* @throws ApiUsageException
* @throws ServerError
* @throws InterruptedException
*/
private Delete2Response[] deleteWithReports(omero.client c, Delete2... dc)
throws ApiUsageException, ServerError, InterruptedException {
CmdCallbackI cb = callback(true, c, dc);
// If the above passes, then we know it's not an ERR
DoAllRsp all = (DoAllRsp) cb.getResponse();
Delete2Response[] reports = new Delete2Response[all.responses.size()];
for (int i = 0; i < reports.length; i++) {
reports[i] = (Delete2Response) all.responses.get(i);
}
return reports;
}
/**
* Create a single image with binary.
*
* After recent changes on the server to check for existing binary data for
* pixels, many resetDefaults methods tested below began returning null
* since {@link omero.LockTimeout} exceptions were being thrown server-side.
* By using omero.client.forEachTile, we can set the necessary data easily.
*
* @see ticket:5755
*/
protected Image createBinaryImage() throws Exception {
Image image = mmFactory.createImage();
image = (Image) iUpdate.saveAndReturnObject(image);
return createBinaryImage(image);
}
/**
* Create the binary data for the given image.
*/
protected Image createBinaryImage(Image image) throws Exception {
Pixels pixels = image.getPrimaryPixels();
// Image
List<Long> ids = new ArrayList<Long>();
ids.add(image.getId().getValue());
// method already tested
// first write to the image
omero.util.RPSTileLoop loop = new omero.util.RPSTileLoop(
client.getSession(), pixels);
loop.forEachTile(256, 256, new omero.util.TileLoopIteration() {
public void run(omero.util.TileData data, int z, int c, int t,
int x, int y, int tileWidth, int tileHeight, int tileCount) {
data.setTile(new byte[tileWidth * tileHeight * 8], z, c, t, x,
y, tileWidth, tileHeight);
}
});
// This block will change the updateEvent on the pixels
// therefore we're going to reload the pixels.
image.setPixels(0, loop.getPixels());
return image;
}
/**
* Creates various sharable annotations i.e. TagAnnotation, TermAnnotation,
* FileAnnotation
*
* @param parent1
* The object to link the annotation to.
* @param parent2
* The object to link the annotation to if not null.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected List<Long> createSharableAnnotation(IObject parent1,
IObject parent2) throws Exception {
// Copying to a proxy to prevent issues with parent.annotationLinks
// becoming stale on multiple copies.
parent1 = parent1.proxy();
if (parent2 != null) {
parent2 = parent2.proxy();
}
// creation already tested in UpdateServiceTest
List<Long> ids = new ArrayList<Long>();
TagAnnotation c = new TagAnnotationI();
c.setTextValue(omero.rtypes.rstring("tag"));
c = (TagAnnotation) iUpdate.saveAndReturnObject(c);
ids.add(c.getId().getValue());
TermAnnotation t = new TermAnnotationI();
t.setTermValue(omero.rtypes.rstring("term"));
t = (TermAnnotation) iUpdate.saveAndReturnObject(t);
ids.add(t.getId().getValue());
OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory
.createOriginalFile());
assertNotNull(of);
FileAnnotation f = new FileAnnotationI();
f.setFile(of);
f = (FileAnnotation) iUpdate.saveAndReturnObject(f);
ids.add(f.getId().getValue());
MapAnnotation ma = new MapAnnotationI();
List<NamedValue> values = new ArrayList<NamedValue>();
for (int i = 0; i < 3; i++)
values.add(new NamedValue("name " + i, "value " + i));
ma.setMapValue(values);
ma = (MapAnnotation) iUpdate.saveAndReturnObject(ma);
ids.add(ma.getId().getValue());
List<IObject> links = new ArrayList<IObject>();
if (parent1 instanceof Image) {
ImageAnnotationLink link = new ImageAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Image) parent1);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Image) parent1);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Image) parent1);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Image) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Image) parent2);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Image) parent2);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Image) parent2);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Image) parent2);
links.add(link);
}
} else if (parent1 instanceof Project) {
ProjectAnnotationLink link = new ProjectAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Project) parent1);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Project) parent1);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Project) parent1);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Project) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Project) parent2);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Project) parent2);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Project) parent2);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Project) parent2);
links.add(link);
}
} else if (parent1 instanceof Dataset) {
DatasetAnnotationLink link = new DatasetAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Dataset) parent1);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Dataset) parent1);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Dataset) parent1);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Dataset) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Dataset) parent2);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Dataset) parent2);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Dataset) parent2);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Dataset) parent2);
links.add(link);
}
} else if (parent1 instanceof Plate) {
PlateAnnotationLink link = new PlateAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Plate) parent1);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Plate) parent1);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Plate) parent1);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Plate) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Plate) parent2);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Plate) parent2);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Plate) parent2);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Plate) parent2);
links.add(link);
}
} else if (parent1 instanceof Screen) {
ScreenAnnotationLink link = new ScreenAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Screen) parent1);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Screen) parent1);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Screen) parent1);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Screen) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Screen) parent2);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Screen) parent2);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Screen) parent2);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Screen) parent2);
links.add(link);
}
} else if (parent1 instanceof Well) {
WellAnnotationLink link = new WellAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Well) parent1);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Well) parent1);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Well) parent1);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Well) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Well) parent2);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Well) parent2);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Well) parent2);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Well) parent2);
links.add(link);
}
} else if (parent1 instanceof PlateAcquisition) {
PlateAcquisitionAnnotationLink link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((PlateAcquisition) parent1);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((PlateAcquisition) parent1);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((PlateAcquisition) parent1);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((PlateAcquisition) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((PlateAcquisition) parent2);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((PlateAcquisition) parent2);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((PlateAcquisition) parent2);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((PlateAcquisition) parent2);
links.add(link);
}
} else if (parent1 instanceof Detector) {
DetectorAnnotationLink link = new DetectorAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
}
} else if (parent1 instanceof Detector) {
DetectorAnnotationLink link = new DetectorAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Detector) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Detector) parent2);
links.add(link);
}
} else if (parent1 instanceof LightSource) {
LightSourceAnnotationLink link = new LightSourceAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((LightSource) parent1);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((LightSource) parent1);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((LightSource) parent1);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((LightSource) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((LightSource) parent2);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((LightSource) parent2);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((LightSource) parent2);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((LightSource) parent2);
links.add(link);
}
} else if (parent1 instanceof Instrument) {
InstrumentAnnotationLink link = new InstrumentAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Instrument) parent1);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Instrument) parent1);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Instrument) parent1);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Instrument) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((Instrument) parent2);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((Instrument) parent2);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((Instrument) parent2);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((Instrument) parent2);
links.add(link);
}
} else if (parent1 instanceof OriginalFile) {
OriginalFileAnnotationLink link = new OriginalFileAnnotationLinkI();
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((OriginalFile) parent1);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((OriginalFile) parent1);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((OriginalFile) parent1);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((OriginalFile) parent1);
links.add(link);
if (parent2 != null) {
link.setChild(new TagAnnotationI(c.getId().getValue(), false));
link.setParent((OriginalFile) parent2);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new TermAnnotationI(t.getId().getValue(), false));
link.setParent((OriginalFile) parent2);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new FileAnnotationI(f.getId().getValue(), false));
link.setParent((OriginalFile) parent2);
links.add(link);
link = new OriginalFileAnnotationLinkI();
link.setChild(new MapAnnotationI(ma.getId().getValue(), false));
link.setParent((OriginalFile) parent2);
links.add(link);
}
} else {
throw new UnsupportedOperationException("Unknown parent type: " + parent1);
}
if (links.size() > 0)
iUpdate.saveAndReturnArray(links);
return ids;
}
/**
* Creates various non sharable annotations.
*
* @param parent
* The object to link the annotation to.
* @param ns
* The name space or <code>null</code>.
* @return See above.
* @throws Exception
* Thrown if an error occurred.
*/
protected List<Long> createNonSharableAnnotation(IObject parent, String ns)
throws Exception {
// Copying to a proxy to prevent issues with parent.annotationLinks
// becoming stale on multiple copies.
parent = parent.proxy();
// creation already tested in UpdateServiceTest
List<Long> ids = new ArrayList<Long>();
CommentAnnotation c = new CommentAnnotationI();
c.setTextValue(omero.rtypes.rstring("comment"));
if (ns != null)
c.setNs(omero.rtypes.rstring(ns));
c = (CommentAnnotation) iUpdate.saveAndReturnObject(c);
LongAnnotation l = new LongAnnotationI();
l.setLongValue(omero.rtypes.rlong(1L));
if (ns != null)
l.setNs(omero.rtypes.rstring(ns));
l = (LongAnnotation) iUpdate.saveAndReturnObject(l);
BooleanAnnotation b = new BooleanAnnotationI();
b.setBoolValue(omero.rtypes.rbool(true));
if (ns != null)
b.setNs(omero.rtypes.rstring(ns));
b = (BooleanAnnotation) iUpdate.saveAndReturnObject(b);
ids.add(c.getId().getValue());
ids.add(l.getId().getValue());
ids.add(b.getId().getValue());
List<IObject> links = new ArrayList<IObject>();
if (parent instanceof Image) {
ImageAnnotationLink link = new ImageAnnotationLinkI();
link.setChild(c);
link.setParent((Image) parent);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(l);
link.setParent((Image) parent);
links.add(link);
link = new ImageAnnotationLinkI();
link.setChild(b);
link.setParent((Image) parent);
links.add(link);
} else if (parent instanceof Project) {
ProjectAnnotationLink link = new ProjectAnnotationLinkI();
link.setChild(c);
link.setParent((Project) parent);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(l);
link.setParent((Project) parent);
links.add(link);
link = new ProjectAnnotationLinkI();
link.setChild(b);
link.setParent((Project) parent);
links.add(link);
} else if (parent instanceof Dataset) {
DatasetAnnotationLink link = new DatasetAnnotationLinkI();
link.setChild(c);
link.setParent((Dataset) parent);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(l);
link.setParent((Dataset) parent);
links.add(link);
link = new DatasetAnnotationLinkI();
link.setChild(b);
link.setParent((Dataset) parent);
links.add(link);
} else if (parent instanceof Plate) {
PlateAnnotationLink link = new PlateAnnotationLinkI();
link.setChild(c);
link.setParent((Plate) parent);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(l);
link.setParent((Plate) parent);
links.add(link);
link = new PlateAnnotationLinkI();
link.setChild(b);
link.setParent((Plate) parent);
links.add(link);
} else if (parent instanceof Screen) {
ScreenAnnotationLink link = new ScreenAnnotationLinkI();
link.setChild(c);
link.setParent((Screen) parent);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(l);
link.setParent((Screen) parent);
links.add(link);
link = new ScreenAnnotationLinkI();
link.setChild(b);
link.setParent((Screen) parent);
links.add(link);
} else if (parent instanceof Well) {
WellAnnotationLink link = new WellAnnotationLinkI();
link.setChild(c);
link.setParent((Well) parent);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(l);
link.setParent((Well) parent);
links.add(link);
link = new WellAnnotationLinkI();
link.setChild(b);
link.setParent((Well) parent);
links.add(link);
} else if (parent instanceof PlateAcquisition) {
PlateAcquisitionAnnotationLink link = new PlateAcquisitionAnnotationLinkI();
link.setChild(c);
link.setParent((PlateAcquisition) parent);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(l);
link.setParent((PlateAcquisition) parent);
links.add(link);
link = new PlateAcquisitionAnnotationLinkI();
link.setChild(b);
link.setParent((PlateAcquisition) parent);
links.add(link);
} else if (parent instanceof Detector) {
DetectorAnnotationLink link = new DetectorAnnotationLinkI();
link.setChild(c);
link.setParent((Detector) parent);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(l);
link.setParent((Detector) parent);
links.add(link);
link = new DetectorAnnotationLinkI();
link.setChild(b);
link.setParent((Detector) parent);
links.add(link);
} else if (parent instanceof Instrument) {
InstrumentAnnotationLink link = new InstrumentAnnotationLinkI();
link.setChild(c);
link.setParent((Instrument) parent);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(l);
link.setParent((Instrument) parent);
links.add(link);
link = new InstrumentAnnotationLinkI();
link.setChild(b);
link.setParent((Instrument) parent);
links.add(link);
} else if (parent instanceof LightSource) {
LightSourceAnnotationLink link = new LightSourceAnnotationLinkI();
link.setChild(c);
link.setParent((LightSource) parent);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(l);
link.setParent((LightSource) parent);
links.add(link);
link = new LightSourceAnnotationLinkI();
link.setChild(b);
link.setParent((LightSource) parent);
links.add(link);
} else {
throw new UnsupportedOperationException("Unknown parent type: " + parent);
}
if (links.size() > 0)
iUpdate.saveAndReturnArray(links);
return ids;
}
/**
* Create a new unpersisted experimenter with the given field values.
* @param omeName an OME name
* @param firstName a first name
* @param lastName a last time
* @return the new experimenter
*/
protected Experimenter createExperimenterI(String omeName, String firstName, String lastName) {
final Experimenter experimenter = new ExperimenterI();
experimenter.setOmeName(rtypes.rstring(omeName));
experimenter.setFirstName(rtypes.rstring(firstName));
experimenter.setLastName(rtypes.rstring(lastName));
experimenter.setLdap(rtypes.rbool(false));
return experimenter;
}
/**
* Modifies the graph.
*
* @param change
* The object hosting information about data to modify.
* @return See above.
* @throws Exception
*/
protected Response doChange(Request change) throws Exception {
return doChange(client, factory, change, true, null);
}
/**
* Modifies the graph.
*
* @param change
* The object hosting information about data to modify.
* @return See above.
* @throws Exception
*/
protected Response doChange(Request change, long groupID) throws Exception {
return doChange(client, factory, change, true, groupID);
}
protected Response doChange(omero.client c, ServiceFactoryPrx f,
Request change, boolean pass) throws Exception {
return doChange(c, f, change, pass, null);
}
protected Response doAllChanges(omero.client c, ServiceFactoryPrx f,
boolean pass, Request... changes) throws Exception {
DoAll all = new DoAll();
all.requests = new ArrayList<Request>();
all.requests.addAll(Arrays.asList(changes));
return doChange(c, f, all, pass);
}
/**
*
* @param c
* @param f
* @param change
* @param pass
* @return
* @throws Exception
*/
protected Response doChange(omero.client c, ServiceFactoryPrx f,
Request change, boolean pass, Long groupID) throws Exception {
final Map<String, String> callContext = new HashMap<String, String>();
if (groupID != null) {
callContext.put("omero.group", "" + groupID);
}
final HandlePrx prx = f.submit(change, callContext);
// assertFalse(prx.getStatus().flags.contains(State.FAILURE));
CmdCallbackI cb = new CmdCallbackI(c, prx);
cb.loop(20, scalingFactor);
return assertCmd(cb, pass);
}
protected CmdCallbackI callback(boolean passes, omero.client c,
omero.cmd.Request... reqs) throws ApiUsageException, ServerError,
InterruptedException {
DoAll all = new DoAll();
all.requests = new ArrayList<omero.cmd.Request>();
for (omero.cmd.Request req : reqs) {
all.requests.add(req);
}
HandlePrx handle = c.getSession().submit(all);
CmdCallbackI cb = new CmdCallbackI(c, handle);
cb.loop(10 * reqs.length, scalingFactor); // throws on timeout
assertCmd(cb, passes);
return cb;
}
protected Response assertCmd(CmdCallbackI cb, boolean pass) {
Status status = cb.getStatus();
Response rsp = cb.getResponse();
assertNotNull(rsp);
if (pass) {
if (rsp instanceof ERR) {
ERR err = (ERR) rsp;
String name = err.getClass().getSimpleName();
fail(String.format(
"Found %s when pass==true: %s (%s) params=%s", name,
err.category, err.name, err.parameters));
}
assertFalse(status.flags.contains(State.FAILURE));
} else {
if (rsp instanceof OK) {
OK ok = (OK) rsp;
fail(String.format("Found OK when pass==false: %s", ok));
}
assertTrue(status.flags.contains(State.FAILURE));
}
return rsp;
}
/**
* Creates a new group with the specified permissions and sets the role of
* the user.
*
* @param permissions
* The permissions of the group.
* @param userRole
* The role of the user e.g. group owner.
* @throws Exception
* Thrown if an error occurred.
*/
protected void login(String permissions, int userRole) throws Exception {
newUserAndGroup(permissions);
switch (userRole) {
case GROUP_OWNER:
makeGroupOwner();
break;
case ADMIN:
logRootIntoGroup();
}
}
}