/* * Copyright (C) 2012 Glencoe Software, Inc. 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 ome.services.blitz.test; import java.io.File; import java.util.HashMap; import loci.formats.FormatTools; import org.apache.commons.io.FileUtils; import org.jmock.Mock; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import Ice.Current; import ome.formats.importer.ImportConfig; import ome.formats.importer.ImportContainer; import ome.services.blitz.fire.Registry; import ome.services.blitz.repo.LegacyRepositoryI; import ome.services.blitz.repo.ManagedRepositoryI; import ome.services.blitz.repo.RepositoryDaoImpl; import ome.services.blitz.repo.path.ClientFilePathTransformer; import ome.services.blitz.repo.path.FilePathRestrictionInstance; import ome.services.blitz.repo.path.FilePathRestrictions; import ome.services.blitz.repo.path.MakePathComponentSafe; import ome.system.Principal; import omero.api.AMD_RawFileStore_write; import omero.api.AMD_StatefulServiceInterface_close; import omero.api.RawFileStorePrx; import omero.api.ServiceFactoryPrx; import omero.api._RawFileStoreTie; import omero.grid.ImportProcessPrx; import omero.grid.ImportSettings; import omero.model.Fileset; import omero.model.FilesetI; import omero.util.TempFileManager; @Test(groups = { "integration", "repo", "fs" }) public class ManagedRepositoryITest extends AbstractServantTest { private final FilePathRestrictions conservativeRules = FilePathRestrictionInstance.getFilePathRestrictions(FilePathRestrictionInstance.values()); FakeAdapter adapter; Mock adapterMock, regMock, sfMock; ManagedRepositoryI repo; LegacyRepositoryI internal; @Override @BeforeClass protected void setUp() throws Exception { super.setUp(); adapter = new FakeAdapter(); adapterMock = (Mock) user.ctx.getBean("adapterMock"); adapterMock.setDefaultStub(adapter); sfMock = mock(ServiceFactoryPrx.class); sfMock.setDefaultStub(new FakeProxy(null, user.sf)); regMock = mock(Registry.class); regMock.expects(atLeastOnce()).method("getInternalServiceFactory") .will(returnValue(sfMock.proxy())); Registry reg = (Registry) regMock.proxy(); final Principal rootPrincipal = root.getPrincipal(); final Principal userPrincipal = user.getPrincipal(); final File targetDir = new File(omeroDataDir, "ManagedRepo-"+userPrincipal.getName()); targetDir.mkdirs(); repo = new ManagedRepositoryI("template", new RepositoryDaoImpl(rootPrincipal, user.ex)); repo.setApplicationContext(user.ctx); internal = new LegacyRepositoryI(user.adapter, reg, user.ex, rootPrincipal, targetDir.getAbsolutePath(), repo); internal.takeover(); } @AfterClass protected void tearDown() throws Exception { if (internal != null) { internal.close(); } super.tearDown(); } protected Ice.Current curr() { Principal p = user.getPrincipal(); Ice.Current ic = new Ice.Current(); ic.ctx = new HashMap<String, String>(); ic.ctx.put(omero.constants.SESSIONUUID.value, p.getName()); ic.id = new Ice.Identity(); ic.id.category = "fake"; ic.id.name = p.getName(); return ic; } /** * Generate a multi-file fake data set by touching "test.fake" and then * converting that into a multi-file format (here, ics). Thanks, Melissa. * * @param dir Directory in which the fakes are created. * @return {@link File} object for one of the two files that can be imported. * @throws Exception */ protected ImportContainer makeFake(File dir) throws Exception { File fake = new File(dir, "test.fake"); File ids = new File(dir, "test.ids"); File ics = new File(dir, "test.ics"); FileUtils.touch(fake); FormatTools.convert(fake.getAbsolutePath(), ids.getAbsolutePath()); ImportContainer ic = new ImportContainer(ids, null /*target*/, null /*user pixels */, null /*reader*/, new String[]{ids.getAbsolutePath(), ics.getAbsolutePath()}, Boolean.FALSE /*spw*/); return ic; } public void testBasicImportExample() throws Exception { final ClientFilePathTransformer clientPaths = new ClientFilePathTransformer(new MakePathComponentSafe(this.conservativeRules)); File tmpDir = TempFileManager.create_path("mydata.", ".dir", true); ImportContainer ic = makeFake(tmpDir); ImportSettings settings = new ImportSettings(); Fileset fs = new FilesetI(); ic.fillData(new ImportConfig(), settings, fs, clientPaths); final Current curr = curr(); settings.checksumAlgorithm = repo.suggestChecksumAlgorithm(repo.listChecksumAlgorithms(curr), curr); ImportProcessPrx i = repo.importFileset(fs, settings, curr); assertNotNull(i); upload(i.getUploader(0)); upload(i.getUploader(1)); // FIXME: TBD } void upload(RawFileStorePrx prx) throws Exception { final Exception[] ex = new Exception[1]; final _RawFileStoreTie file = (_RawFileStoreTie) adapter.findByProxy(prx); try { file.write_async(new AMD_RawFileStore_write(){ public void ice_response() { // no-op } public void ice_exception(Exception ex2) { ex[0] = ex2; }}, new byte[]{0}, 0, 1, curr()); } finally { file.close_async(new AMD_StatefulServiceInterface_close(){ public void ice_response() { // no-op } public void ice_exception(Exception ex2) { if (ex[0] == null) { ex[0] = ex2; } else { ex2.printStackTrace(); } }}, curr()); } if (ex[0] != null) { throw ex[0]; } } }