/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-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 integration.chgrp;
import static omero.rtypes.rdouble;
import static omero.rtypes.rint;
import integration.AbstractServerTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import omero.ServerError;
import omero.cmd.Chgrp2;
import omero.gateway.util.Requests;
import omero.model.ExperimenterGroup;
import omero.model.IObject;
import omero.model.Image;
import omero.model.Rectangle;
import omero.model.RectangleI;
import omero.model.Roi;
import omero.model.RoiI;
import omero.model.Shape;
import omero.sys.EventContext;
import omero.sys.ParametersI;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.*;
/**
* @author Scott Littlewood, <a
* href="mailto:sylittlewood@dundee.ac.uk">sylittlewood@dundee.ac.uk</a>
* @since Beta4.4
*/
public class HierarchyMoveImageWithRoiFromOtherUserTest extends
AbstractServerTest {
/**
* Performs the changing of group for an image with an ROI owned by the same
* user
*
* @param sourceGroupPermissions
* @param targetGroupPermissions
* @throws Exception
*/
private void moveImageBetweenPermissionGroups(
String sourceGroupPermissions, String targetGroupPermissions,
boolean roiOwnerInTargetGroup) throws Exception {
// image owner
EventContext imageOwnerContext = newUserAndGroup(
sourceGroupPermissions, false);
Image image = createSimpleImage();
long originalImageId = image.getId().getValue();
// change to another user in source group
EventContext roiUserContext = newUserInGroup(imageOwnerContext);
// get the image from the roi user's perspective
Image roiUserImage = getImageWithId(image.getId().getValue());
// create the roi as the roi user
Roi serverROI = createSimpleRoiFor(roiUserImage);
long originalRoiId = serverROI.getId().getValue();
List<Long> shapeIds = new ArrayList<Long>();
for (int i = 0; i < serverROI.sizeOfShapes(); i++) {
Shape shape = serverROI.getShape(i);
shapeIds.add(shape.getId().getValue());
}
// switch back to the original user
loginUser(imageOwnerContext);
// create the target group
ExperimenterGroup targetGroup = newGroupAddUser(targetGroupPermissions,
imageOwnerContext.userId);
iAdmin.getEventContext();
if (roiOwnerInTargetGroup) {
addUserToGroup(roiUserContext.userId, targetGroup);
}
iAdmin.getEventContext();
// Perform the move operation as original user
final Chgrp2 dc = Requests.chgrp("Image", originalImageId, targetGroup.getId().getValue());
callback(true, client, dc);
// check the roi has been moved to target group
Roi originalRoi = getRoiWithId(originalRoiId);
assertNull(originalRoi);
// check the shapes have moved to target group
List<IObject> orginalShapes = getShapesWithIds(shapeIds);
assertEquals(0, orginalShapes.size());
// Move the user into the target group!
loginUser(targetGroup);
EventContext targetGroupContext = iAdmin.getEventContext();
assertFalse(imageOwnerContext.groupId == targetGroupContext.groupId);
assertEquals(imageOwnerContext.userId, targetGroupContext.userId);
// check that the image has moved
Image movedImage = getImageWithId(originalImageId);
assertNotNull(movedImage);
// Check that the ROI has moved
Roi movedRoi = getRoiWithId(originalRoiId);
assertNotNull(movedRoi);
List<IObject> movedShapes = getShapesWithIds(shapeIds);
assertEquals(shapeIds.size(), movedShapes.size());
// check who the owner of roi is
long movedRoiOwnerId = movedRoi.getDetails().getOwner().getId()
.getValue();
assertEquals(roiUserContext.userId, movedRoiOwnerId);
}
/**
* Test moving data as the data owner from a read-write to a read-write
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWRW() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwrw--", true);
}
/**
* Test moving data as the data owner from a read-write to a read-write
* group where the Roi User is not in the target group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWRW_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwrw--", false);
}
/**
* Test moving data as the data owner from a read-annotate to a read-only
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWR() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwr---", true);
}
/**
* Test moving data as the data owner from a read-annotate to a read-only
* group where Roi user is not in the target group group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWR_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwr---", false);
}
/**
* Test moving data as the data owner from a read-annotate to a
* read-annotate group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWRA() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwra--", true);
}
/**
* Test moving data as the data owner from a read-annotate to a
* read-annotate group where Roi user is not in the target group group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWRA_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwra--", false);
}
/**
* Test moving data as the data owner from a read-annotate to a read-write
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWRW() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwrw--", true);
}
/**
* Test moving data as the data owner from a read-annotate to a read-write
* group where Roi user is not in the target group group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRWRW_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rwrw--", false);
}
/**
* Test moving data as the data owner from a read-write to a read-only group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWR() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwr---", true);
}
/**
* Test moving data as the data owner from a read-write to a read-only group
* where Roi user is not in the target group group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWR_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwr---", false);
}
/**
* Test moving data as the data owner from a read-write to a read-annotate
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWRA() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwra--", true);
}
/**
* Test moving data as the data owner from a read-write to a read-annotate
* group where Roi user is not in the target group group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRWRA_RoiUserNotInTargetGroup() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rwra--", false);
}
/**
* Adds the user to the group, no context switching
*
* @param userId
* @param targetGroup
* @throws Exception
*/
private void addUserToGroup(long userId, ExperimenterGroup targetGroup)
throws Exception {
addUsers(targetGroup, Arrays.asList(userId), true);
}
/**
* Queries the server for the Image with the id provided under the current
* user/group security context
*
* @param imageId
* @return
* @throws ServerError
*/
private Image getImageWithId(long imageId) throws ServerError {
ParametersI queryParameters = new ParametersI();
queryParameters.addId(imageId);
String queryForImage = "select d from Image as d where d.id = :id";
return (Image) iQuery.findByQuery(queryForImage, queryParameters);
}
/**
* Queries the server for the ROI with the id provided under the current
* user/group security context
*
* @param roiId
* @return
* @throws ServerError
*/
private Roi getRoiWithId(long roiId) throws ServerError {
ParametersI queryParameters = new ParametersI();
queryParameters.addId(roiId);
String queryForROI = "select d from Roi as d where d.id = :id";
return (Roi) iQuery.findByQuery(queryForROI, queryParameters);
}
/**
* Queries the server for all the shapes with matching ids under the current
* user/group security context
*
* @param shapeIds
* @return
* @throws ServerError
*/
private List<IObject> getShapesWithIds(List<Long> shapeIds)
throws ServerError {
ParametersI queryParameters = new ParametersI();
queryParameters.addIds(shapeIds);
String queryForShapes = "select d from Shape as d where d.id in (:ids)";
return iQuery.findAllByQuery(queryForShapes, queryParameters);
}
/**
* Creates and returns a server created ROI on an image under the current
* user/group security context
*
* @param image
* @return
* @throws ServerError
*/
private Roi createSimpleRoiFor(Image image) throws ServerError {
Roi roi = new RoiI();
roi.setImage(image);
for (int i = 0; i < 3; i++) {
Rectangle rect = new RectangleI();
rect.setX(rdouble(10));
rect.setY(rdouble(20));
rect.setWidth(rdouble(40));
rect.setHeight(rdouble(80));
rect.setTheZ(rint(i));
rect.setTheT(rint(0));
roi.addShape(rect);
}
return (RoiI) iUpdate.saveAndReturnObject(roi);
}
/**
* Creates and returns an image on the server under the current user/group
* security context
*
* @return
* @throws ServerError
*/
private Image createSimpleImage() throws ServerError {
Image simpleImage = mmFactory.simpleImage();
return (Image) iUpdate.saveAndReturnObject(simpleImage);
}
}