diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java index befeb9d113a5e258c6a2d135efd27dada61b77b1..1bf05c3c7569f4c72414834d0dfabd5919fd9016 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java @@ -23,7 +23,7 @@ import java.util.List; * * @author Christian Ribeaud */ -final class DefaultResultSet<K, T> implements IResultSet<K, T> +public final class DefaultResultSet<K, T> implements IResultSet<K, T> { private final K resultSetKey; @@ -31,7 +31,7 @@ final class DefaultResultSet<K, T> implements IResultSet<K, T> private final int totalLength; - DefaultResultSet(final K resultSetKey, final List<T> list, final int totalLength) + public DefaultResultSet(final K resultSetKey, final List<T> list, final int totalLength) { assert resultSetKey != null : "Unspecified result set key"; assert list != null : "Unspecified list."; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java index 815b32e4b6b7791e7f82b9742507e4c9f761ba74..95d655472de2cc3c6ab85d6df082785887c3bf8f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java @@ -22,6 +22,11 @@ import ch.systemsx.cisd.common.utilities.FieldComparator; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample; +/** + * A {@link IFieldComparator} suitable for {@link Sample}. + * + * @author Christian Ribeaud + */ final class SampleComparator implements IFieldComparator<Sample> { private FieldComparator<Sample> fieldComparator; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java index 84efa6bbeba4c8bd400a906ac5ad08a5c18e7857..b39590e34b278ed8d7cfdc3bf9d51d759d8f1417 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java @@ -21,6 +21,7 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; +import ch.rinn.restrictions.Private; import ch.systemsx.cisd.common.exceptions.InvalidSessionException; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; @@ -55,6 +56,12 @@ public abstract class AbstractClientService implements IClientService { } + @Private + protected AbstractClientService(final IRequestContextProvider requestContextProvider) + { + this.requestContextProvider = requestContextProvider; + } + private final SessionContext createSessionContext(final Session session) { final SessionContext sessionContext = new SessionContext(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java index bc181b56c13f1d5fee96cbe6b5c85ec206fafa09..266d221adc4f614b604bb5765829fac24ec618e1 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java @@ -25,7 +25,10 @@ import javax.annotation.Resource; import org.springframework.stereotype.Component; +import ch.rinn.restrictions.Friend; +import ch.rinn.restrictions.Private; import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.servlet.IRequestContextProvider; import ch.systemsx.cisd.common.utilities.BeanUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.IGenericClientService; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData; @@ -41,17 +44,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGeneration; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleToRegister; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SearchableEntity; +import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider; import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet; import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSetManager; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider; import ch.systemsx.cisd.openbis.generic.client.web.server.util.DtoConverters; import ch.systemsx.cisd.openbis.generic.client.web.server.util.GroupTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.ListSampleCriteriaTranslator; -import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleToRegisterTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.PersonTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.ResultSetTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.RoleAssignmentTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.RoleCodeTranslator; +import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleToRegisterTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleTypeTranslator; import ch.systemsx.cisd.openbis.generic.client.web.server.util.SearchableEntityTranslator; @@ -61,7 +64,6 @@ import ch.systemsx.cisd.openbis.generic.shared.IGenericServer; import ch.systemsx.cisd.openbis.generic.shared.IServer; import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ListSampleCriteriaDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.SampleGenerationDTO; @@ -80,6 +82,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames; * @author Franz-Josef Elmer */ @Component(value = ResourceNames.GENERIC_SERVICE) +@Friend(toClasses = AbstractClientService.class) public final class GenericClientService extends AbstractClientService implements IGenericClientService { @@ -87,6 +90,18 @@ public final class GenericClientService extends AbstractClientService implements @Resource(name = ResourceNames.GENERIC_SERVER) private IGenericServer genericServer; + public GenericClientService() + { + } + + @Private + GenericClientService(final IGenericServer genericServer, + final IRequestContextProvider requestContextProvider) + { + super(requestContextProvider); + this.genericServer = genericServer; + } + @SuppressWarnings("unchecked") private final <K> IResultSetManager<K> getResultSetManager() { @@ -277,8 +292,6 @@ public final class GenericClientService extends AbstractClientService implements { try { - final ListSampleCriteriaDTO criteria = - ListSampleCriteriaTranslator.translate(listCriteria); final IResultSetManager<String> resultSetManager = getResultSetManager(); final IResultSet<String, Sample> result = resultSetManager.getResultSet(listCriteria, new IOriginalDataProvider<Sample>() @@ -290,10 +303,12 @@ public final class GenericClientService extends AbstractClientService implements public final List<Sample> getOriginalData() { - final List<SamplePE> samplePEs = - genericServer.listSamples(getSessionToken(), criteria); - final List<Sample> list = new ArrayList<Sample>(samplePEs.size()); - for (final SamplePE sample : samplePEs) + final List<SamplePE> samples = + genericServer.listSamples(getSessionToken(), + ListSampleCriteriaTranslator + .translate(listCriteria)); + final List<Sample> list = new ArrayList<Sample>(samples.size()); + for (final SamplePE sample : samples) { list.add(SampleTranslator.translate(sample)); } @@ -409,7 +424,8 @@ public final class GenericClientService extends AbstractClientService implements try { final String sessionToken = getSessionToken(); - genericServer.registerSample(sessionToken, SampleToRegisterTranslator.translate(sample)); + genericServer + .registerSample(sessionToken, SampleToRegisterTranslator.translate(sample)); } catch (final UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java index e6e0957aebe33a38c6640e2cdd8d9f2462f6d906..649498b453d2a37823885ffabf072028f1fdbc3a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.resultset; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; @@ -47,7 +48,7 @@ public final class CachedResultSetManagerTest { private IResultSetConfig<String> resultSetConfig; - private IOriginalDataProvider<?> resultSetRetriever; + private IOriginalDataProvider<?> originalDataProvider; private IResultSetManager<String> resultSetManager; @@ -88,7 +89,7 @@ public final class CachedResultSetManagerTest { context = new Mockery(); resultSetConfig = context.mock(IResultSetConfig.class); - resultSetRetriever = context.mock(IOriginalDataProvider.class); + originalDataProvider = context.mock(IOriginalDataProvider.class); resultSetManager = createResultSetManager(); } @@ -157,14 +158,14 @@ public final class CachedResultSetManagerTest one(resultSetConfig).getResultSetKey(); will(returnValue(null)); - one(resultSetRetriever).getOriginalData(); + one(originalDataProvider).getOriginalData(); will(returnValue(Collections.emptyList())); allowResultSetCreation(this); } }); final IResultSet<String, ?> resultSet = - resultSetManager.getResultSet(resultSetConfig, resultSetRetriever); + resultSetManager.getResultSet(resultSetConfig, originalDataProvider); assertEquals(0, resultSet.getList().size()); assertEquals(0, resultSet.getTotalLength()); assertTrue(StringUtils.isNotEmpty(resultSet.getResultSetKey())); @@ -172,7 +173,7 @@ public final class CachedResultSetManagerTest } @Test - public final void testGetResult() + public final void testGetResultWithAlreadyCachedData() { context.checking(new Expectations() { @@ -184,13 +185,38 @@ public final class CachedResultSetManagerTest } }); final IResultSet<String, ?> resultSet = - resultSetManager.getResultSet(resultSetConfig, resultSetRetriever); + resultSetManager.getResultSet(resultSetConfig, originalDataProvider); assertEquals(2, resultSet.getList().size()); assertEquals(3, resultSet.getTotalLength()); assertEquals("1", resultSet.getResultSetKey()); context.assertIsSatisfied(); } + @Test + public final void testGetResultWithoutCachedData() + { + final String value = "value"; + context.checking(new Expectations() + { + { + one(resultSetConfig).getResultSetKey(); + will(returnValue(null)); + + one(originalDataProvider).getOriginalData(); + will(returnValue(Collections.singletonList(value))); + + allowResultSetCreation(this); + } + }); + final IResultSet<String, ?> resultSet = + resultSetManager.getResultSet(resultSetConfig, originalDataProvider); + assertEquals(1, resultSet.getList().size()); + assertEquals(1, resultSet.getTotalLength()); + assertNotNull(resultSet.getResultSetKey()); + assertEquals(value, resultSet.getList().get(0)); + context.assertIsSatisfied(); + } + @Test public final void testRemoveData() { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..708704251a55d2bf8a96b115fc15714f81aa43db --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java @@ -0,0 +1,158 @@ +/* + * Copyright 2008 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.plugin.generic.client.web.server; + +import static org.testng.AssertJUnit.assertEquals; + +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.rinn.restrictions.Friend; +import ch.systemsx.cisd.common.servlet.IRequestContextProvider; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DatabaseInstance; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleCriteria; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType; +import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DefaultResultSet; +import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider; +import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSetManager; +import ch.systemsx.cisd.openbis.generic.server.SessionConstants; +import ch.systemsx.cisd.openbis.generic.shared.IGenericServer; + +/** + * Test cases for corresponding {@link GenericClientService} class. + * + * @author Christian Ribeaud + */ +@Friend(toClasses = GenericClientService.class) +public final class GenericClientServiceTest +{ + private Mockery context; + + private IGenericServer genericServer; + + private IRequestContextProvider requestContextProvider; + + private GenericClientService genericClientService; + + private HttpServletRequest servletRequest; + + private HttpSession httpSession; + + private IResultSetManager<String> resultSetManager; + + private final static ListSampleCriteria createListCriteria() + { + final ListSampleCriteria criteria = new ListSampleCriteria(); + final SampleType sampleType = createSampleType(); + criteria.setSampleType(sampleType); + return criteria; + } + + private final static SampleType createSampleType() + { + final SampleType sampleType = new SampleType(); + sampleType.setCode("MASTER_PLATE"); + final DatabaseInstance databaseInstance = new DatabaseInstance(); + databaseInstance.setCode("DB1"); + sampleType.setDatabaseInstance(databaseInstance); + return sampleType; + } + + private final void prepareGetSession(final Expectations expectations) + { + expectations.one(requestContextProvider).getHttpServletRequest(); + expectations.will(Expectations.returnValue(servletRequest)); + + expectations.one(servletRequest).getSession(false); + expectations.will(Expectations.returnValue(httpSession)); + } + + private final void prepareGetResultSetManager(final Expectations expectations) + { + expectations.one(httpSession).getAttribute(SessionConstants.OPENBIS_RESULT_SET_MANAGER); + expectations.will(Expectations.returnValue(resultSetManager)); + } + + private final static List<Sample> createSampleList() + { + return Collections.emptyList(); + } + + @BeforeMethod + @SuppressWarnings("unchecked") + public final void setUp() + { + context = new Mockery(); + genericServer = context.mock(IGenericServer.class); + requestContextProvider = context.mock(IRequestContextProvider.class); + servletRequest = context.mock(HttpServletRequest.class); + httpSession = context.mock(HttpSession.class); + resultSetManager = context.mock(IResultSetManager.class); + genericClientService = new GenericClientService(genericServer, requestContextProvider); + } + + @AfterMethod + public final void tearDown() + { + // To following line of code should also be called at the end of each test method. + // Otherwise one do not known which test failed. + context.assertIsSatisfied(); + } + + @Test + public final void testListSamples() + { + final String resultSetKey = "1"; + final DefaultResultSet<String, Sample> defaultResultSet = + new DefaultResultSet<String, Sample>(resultSetKey, createSampleList(), 0); + final ListSampleCriteria listCriteria = createListCriteria(); + context.checking(new Expectations() + { + { + prepareGetSession(this); + prepareGetResultSetManager(this); + + one(resultSetManager).getResultSet(with(listCriteria), + getOriginalDataProvider()); + will(returnValue(defaultResultSet)); + } + + @SuppressWarnings("unchecked") + private final IOriginalDataProvider<Sample> getOriginalDataProvider() + { + return with(any(IOriginalDataProvider.class)); + } + + }); + final ResultSet<Sample> resultSet = genericClientService.listSamples(listCriteria); + assertEquals(0, resultSet.getList().size()); + assertEquals(resultSetKey, resultSet.getResultSetKey()); + assertEquals(0, resultSet.getTotalLength()); + context.assertIsSatisfied(); + } +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java index 7c69b33edef86ccdb8668ad477802e7df68f7638..59d19b610c4c90969f8f36beb0601ffdd0b7028e 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java @@ -36,10 +36,9 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.plugin.screening.server.ScreeningServer; /** - * Test cases for corresponding {@link ScreeningServer} class. + * Test cases for corresponding {@link GenericServer} class. * * @author Franz-Josef Elmer */