/*
* Copyright (C) 2013 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 omero.cmd.fs;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import ome.io.nio.PixelsService;
import ome.services.blitz.test.AbstractServantTest;
import ome.services.util.Executor;
import ome.system.ServiceFactory;
import omero.RString;
import omero.RType;
import omero.cmd.ERR;
import omero.cmd.HandleI.Cancel;
import omero.cmd.Helper;
import omero.cmd.OriginalMetadataResponse;
import omero.cmd.Request;
import omero.cmd.Response;
import omero.cmd.Status;
import org.apache.commons.collections.CollectionUtils;
import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ResourceUtils;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
@Test(groups = "integration")
public class OriginalMetadataRequestTest extends AbstractServantTest {
private static final ImmutableMap<String, String> expectedGlobalMetadata;
private static final ImmutableMap<String, String> expectedSeriesMetadata;
static {
Builder<String, String> builder;
builder = ImmutableMap.builder();
builder.put("a=b", "c");
builder.put("(a=b)", "c");
builder.put("a", "(b=c)");
builder.put("{a=b", "c}");
builder.put("{(a=b)", "c}");
builder.put("{a", "(b=c)}");
builder.put("(p=q", "r");
builder.put("p=q", "r)");
builder.put("((p=q)", "r");
builder.put("p", "(q=r))");
builder.put("p q", "r s");
expectedGlobalMetadata = builder.build();
builder = ImmutableMap.builder();
builder.put("ein må lære seg å krype før ein lærer å gå", "learn to walk before you can run");
builder.put("money doesn't grow on trees", "pengar växer inte på träd");
builder.put("аб", "вг");
expectedSeriesMetadata = builder.build();
}
@Override
@BeforeClass
protected void setUp() throws Exception {
super.setUp();
}
protected OriginalMetadataResponse assertRequest(
final OriginalMetadataRequestI req, Map<String, String> ctx) {
final Status status = new Status();
@SuppressWarnings("unchecked")
List<Object> rv = (List<Object>) user.ex.execute(ctx, user
.getPrincipal(), new Executor.SimpleWork(this, "testRequest") {
@Transactional(readOnly = false)
public List<Object> doWork(Session session, ServiceFactory sf) {
// from HandleI.steps()
List<Object> rv = new ArrayList<Object>();
Helper helper = new Helper((Request) req, status,
getSqlAction(), session, sf);
req.init(helper);
int j = 0;
while (j < status.steps) {
try {
status.currentStep = j;
rv.add(req.step(j));
} catch (Cancel c) {
throw c;
} catch (Throwable t) {
throw helper.cancel(new ERR(), t, "bad-step", "step",
"" + j);
}
j++;
}
return rv;
}
});
// Post-process
for (int step = 0; step < status.steps; step++) {
Object obj = rv.get(step);
req.buildResponse(step, obj);
}
Response rsp = req.getResponse();
if (rsp instanceof ERR) {
fail(rsp.toString());
}
return (OriginalMetadataResponse) rsp;
}
@Test
public void testFileset() throws Exception {
OriginalMetadataRequestI req = new OriginalMetadataRequestI(
(PixelsService) user.ctx.getBean("/OMERO/Pixels"));
req.imageId = makeImage(); // FAILING
OriginalMetadataResponse rsp = assertRequest(req, null);
}
/**
* Test that pre-FS original_metadata.txt files are parsed as expected,
* including selection of which "=" to split at, and non-ASCII characters.
* @throws FileNotFoundException if the test INI-style file is not accessible
*/
@Test
public void testMetadataParsing() throws FileNotFoundException {
final OriginalMetadataRequestI request = new OriginalMetadataRequestI(null);
request.init(new Helper(request, new Status(), null, null, null));
request.parseOriginalMetadataTxt(ResourceUtils.getFile("classpath:original_metadata.txt"));
request.buildResponse(0, null);
final OriginalMetadataResponse response = (OriginalMetadataResponse) request.getResponse();
final Map<String, String> actualGlobalMetadata = new HashMap<String, String>();
for (final Entry<String, RType> keyValue : response.globalMetadata.entrySet()) {
actualGlobalMetadata.put(keyValue.getKey(), ((RString) keyValue.getValue()).getValue());
}
Assert.assertTrue(CollectionUtils.isEqualCollection(expectedGlobalMetadata.entrySet(), actualGlobalMetadata.entrySet()));
final Map<String, String> actualSeriesMetadata = new HashMap<String, String>();
for (final Entry<String, RType> keyValue : response.seriesMetadata.entrySet()) {
actualSeriesMetadata.put(keyValue.getKey(), ((RString) keyValue.getValue()).getValue());
}
Assert.assertTrue(CollectionUtils.isEqualCollection(expectedSeriesMetadata.entrySet(), actualSeriesMetadata.entrySet()));
}
}