/* *------------------------------------------------------------------------------ * 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 integration.AbstractServerTest; import java.io.File; import java.util.ArrayList; import java.util.List; import ome.specification.XMLMockObjects; import ome.specification.XMLWriter; import ome.xml.model.OME; import omero.ServerError; import omero.cmd.Chgrp2; import omero.gateway.util.Requests; import omero.model.ExperimenterGroup; import omero.model.Image; import omero.model.Instrument; import omero.model.Laser; import omero.model.LightSource; import omero.model.Pixels; import omero.sys.ParametersI; import org.apache.commons.lang.RandomStringUtils; import org.testng.annotations.AfterClass; 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 HierarchyMoveImageWithAcquisitionDataTest extends AbstractServerTest { /** * Overridden to delete the files. * * @see AbstractServerTest#tearDown() */ @Override @AfterClass public void tearDown() throws Exception { } private Pixels createImageWithAcquisitionData() throws Exception { File f = File.createTempFile(RandomStringUtils.random(100, false, true), ".ome.xml"); f.deleteOnExit(); XMLMockObjects xml = new XMLMockObjects(); XMLWriter writer = new XMLWriter(); OME ome = xml.createImageWithAcquisitionData(); writer.writeFile(f, ome, true); try { List<Pixels> pixels = importFile(f, "ome.xml"); return pixels.get(0); } catch (Throwable e) { throw new Exception("cannot import image", e); } } /** * Helper method to load the Image. * * @param p * @return * @throws ServerError */ protected Image getImageWithId(long imageId) throws ServerError { ParametersI queryParameters = new ParametersI(); queryParameters.addId(imageId); String queryForImage = "select img from Image as img where img.id = :id"; return (Image) iQuery.findByQuery(queryForImage, queryParameters); } /** * Test moving data as the data owner from a private to a private group * * @throws Exception */ @Test(groups = "broken") public void moveImageRWtoRW() throws Exception { moveImageBetweenPermissionGroups("rw----", "rw----"); } /** * 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 { XMLMockObjects mockObjects = new XMLMockObjects(); long userId = iAdmin.getEventContext().userId; ExperimenterGroup sourceGroup = createGroupWithMember(userId, sourceGroupPermissions); ExperimenterGroup targetGroup = createGroupWithMember(userId, targetGroupPermissions); long targetGroupId = targetGroup.getId().getValue(); // force a refresh of the user's group membership iAdmin.getEventContext(); Pixels pixels = createImageWithAcquisitionData(); Image sourceImage = pixels.getImage(); Image savedImage = (Image) iUpdate.saveAndReturnObject(sourceImage); long originalImageId = savedImage.getId().getValue(); List<Long> imageIds = new ArrayList<Long>(1); imageIds.add(originalImageId); // make sure we are in the source group loginUser(sourceGroup); // Perform the move operation. final Chgrp2 dc = Requests.chgrp("Image", originalImageId, targetGroupId); callback(true, client, dc); // check if the image have been moved. Image returnedSourceImage = getImageWithId(originalImageId); assertNull(returnedSourceImage); // Move the user into the target group! loginUser(targetGroup); // get the acquisition data // check it's correct ome.xml.model.Laser xmlLaser = (ome.xml.model.Laser) mockObjects .createLightSource(ome.xml.model.Laser.class.getName(), 0); Image returnedTargetImage = getImageWithId(originalImageId); assertNotNull(returnedTargetImage); long instrumentId = returnedTargetImage.getInstrument().getId() .getValue(); Instrument instrument = factory.getMetadataService().loadInstrument( instrumentId); List<LightSource> lights = instrument.copyLightSource(); for (LightSource lightSource : lights) { if (lightSource instanceof Laser) validateLaser((Laser) lightSource, xmlLaser); } } /** * Creates a new group for the user with the permissions detailed * * @param userId * @param permissions * @return * @throws Exception */ private ExperimenterGroup createGroupWithMember(long userId, String permissions) throws Exception { return newGroupAddUser(permissions, userId); } /** * Validates if the inserted object corresponds to the XML object. * * @param laser * The laser to check. * @param xml * The XML version. */ private void validateLaser(Laser laser, ome.xml.model.Laser xml) { assertEquals(laser.getManufacturer().getValue(), xml.getManufacturer()); assertEquals(laser.getModel().getValue(), xml.getModel()); assertEquals(laser.getSerialNumber().getValue(), xml.getSerialNumber()); assertEquals(laser.getLotNumber().getValue(), xml.getLotNumber()); assertEquals(laser.getPower().getValue(), xml.getPower()); assertEquals(laser.getType().getValue().getValue(), XMLMockObjects.LASER_TYPE.getValue()); } }