/*
*------------------------------------------------------------------------------
* 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.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.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 HierarchyMoveImageWithRoiTest 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)
throws Exception {
long userId = iAdmin.getEventContext().userId;
ExperimenterGroup sourceGroup = newGroupAddUser(sourceGroupPermissions,
userId);
ExperimenterGroup targetGroup = newGroupAddUser(targetGroupPermissions,
userId);
long rwGroupId = targetGroup.getId().getValue();
// force a refresh of the user's group membership
iAdmin.getEventContext();
Image image = createSimpleImage();
long originalImageId = image.getId().getValue();
Roi serverROI = createSimpleRoiFor(image);
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());
}
// make sure we are in the source group
loginUser(sourceGroup);
// Perform the move operation.
final Chgrp2 dc = Requests.chgrp("Image", originalImageId, rwGroupId);
callback(true, client, dc);
// check if the objects have been moved.
Roi originalRoi = getRoiWithId(originalRoiId);
assertNull(originalRoi);
// check the shapes have been moved
List<IObject> orginalShapes = getShapesWithIds(shapeIds);
assertEquals(0, orginalShapes.size());
// Move the user into the RW group!
loginUser(targetGroup);
// Check that the ROI has moved
Roi movedRoi = getRoiWithId(originalRoiId);
assertNotNull(movedRoi);
List<IObject> movedShapes = getShapesWithIds(shapeIds);
assertEquals(shapeIds.size(), movedShapes.size());
}
/**
* Test moving data as the data owner from a private to a private group
*
* @throws Exception
*/
@Test
public void moveImageRWtoRW() throws Exception {
moveImageBetweenPermissionGroups("rw----", "rw----");
}
/**
* Test moving data as the data owner from a private to a read-only group
*
* @throws Exception
*/
@Test
public void moveImageRWtoRWR() throws Exception {
moveImageBetweenPermissionGroups("rw----", "rwr---");
}
/**
* Test moving data as the data owner from a private to a read-annotate
* group
*
* @throws Exception
*/
@Test
public void moveImageRWtoRWRA() throws Exception {
moveImageBetweenPermissionGroups("rw----", "rwra--");
}
/**
* Test moving data as the data owner from a private to a read-write group
*
* @throws Exception
*/
@Test
public void moveImageRWtoRWRW() throws Exception {
moveImageBetweenPermissionGroups("rw----", "rwrw--");
}
/**
* Test moving data as the data owner from a read-only to a private group
*
* @throws Exception
*/
@Test
public void moveImageRWRtoRW() throws Exception {
moveImageBetweenPermissionGroups("rwr---", "rw----");
}
/**
* Test moving data as the data owner from a read-only to a read-only group
*
* @throws Exception
*/
@Test
public void moveImageRWRtoRWR() throws Exception {
moveImageBetweenPermissionGroups("rwr---", "rwr---");
}
/**
* Test moving data as the data owner from a read-only to a read-annotate
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRtoRWRA() throws Exception {
moveImageBetweenPermissionGroups("rwr---", "rwra--");
}
/**
* Test moving data as the data owner from a read-only to a read-write group
*
* @throws Exception
*/
@Test
public void moveImageRWRtoRWRW() throws Exception {
moveImageBetweenPermissionGroups("rwr---", "rwrw--");
}
/**
* Test moving data as the data owner from a read-annotate to a private
* group
*
* @throws Exception
*/
@Test
public void moveImageRWRAtoRW() throws Exception {
moveImageBetweenPermissionGroups("rwra--", "rw----");
}
/**
* 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---");
}
/**
* 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--");
}
/**
* 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--");
}
/**
* Test moving data as the data owner from a read-write to a private group
*
* @throws Exception
*/
@Test
public void moveImageRWRWtoRW() throws Exception {
moveImageBetweenPermissionGroups("rwrw--", "rw----");
}
/**
* 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---");
}
/**
* 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--");
}
/**
* 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--");
}
/**
* 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);
}
}