package edu.mayo.cts2.framework.webapp.soap.endpoint.entitydescription;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import edu.mayo.cts2.framework.model.codesystemversion.CodeSystemVersionCatalogEntry;
import edu.mayo.cts2.framework.model.command.Page;
import edu.mayo.cts2.framework.model.command.ResolvedReadContext;
import edu.mayo.cts2.framework.model.core.CodeSystemReference;
import edu.mayo.cts2.framework.model.core.CodeSystemVersionReference;
import edu.mayo.cts2.framework.model.core.EntityReference;
import edu.mayo.cts2.framework.model.core.NameAndMeaningReference;
import edu.mayo.cts2.framework.model.core.NamespaceReference;
import edu.mayo.cts2.framework.model.core.OpaqueData;
import edu.mayo.cts2.framework.model.core.ScopedEntityName;
import edu.mayo.cts2.framework.model.core.SortCriteria;
import edu.mayo.cts2.framework.model.core.SourceReference;
import edu.mayo.cts2.framework.model.core.URIAndEntityName;
import edu.mayo.cts2.framework.model.core.VersionTagReference;
import edu.mayo.cts2.framework.model.directory.DirectoryResult;
import edu.mayo.cts2.framework.model.entity.EntityDescription;
import edu.mayo.cts2.framework.model.entity.EntityDescriptionBase;
import edu.mayo.cts2.framework.model.entity.EntityListEntry;
import edu.mayo.cts2.framework.model.entity.NamedEntityDescription;
import edu.mayo.cts2.framework.model.service.core.DocumentedNamespaceReference;
import edu.mayo.cts2.framework.model.service.core.EntityNameOrURI;
import edu.mayo.cts2.framework.model.service.core.NameOrURI;
import edu.mayo.cts2.framework.model.service.core.ProfileElement;
import edu.mayo.cts2.framework.model.service.core.QueryControl;
import edu.mayo.cts2.framework.model.service.core.ReadContext;
import edu.mayo.cts2.framework.model.service.core.types.FunctionalProfile;
import edu.mayo.cts2.framework.model.service.core.types.ImplementationProfile;
import edu.mayo.cts2.framework.model.service.core.types.StructuralProfile;
import edu.mayo.cts2.framework.model.util.ModelUtils;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetDefaultFormat;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetDefaultFormatResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetImplementationType;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetImplementationTypeResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetKnownNamespace;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetKnownNamespaceResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceDescription;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceDescriptionResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceName;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceNameResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceProvider;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceProviderResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceVersion;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetServiceVersionResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetSupportedFormat;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetSupportedFormatResponse;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetSupportedProfile;
import edu.mayo.cts2.framework.model.wsdl.baseservice.GetSupportedProfileResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.AvailableDescriptions;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.AvailableDescriptionsResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.Exists;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ExistsInCodeSystem;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ExistsInCodeSystemResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ExistsResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetKnownCodeSystem;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetKnownCodeSystemResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetKnownCodeSystemVersion;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetKnownCodeSystemVersionResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetSupportedVersionTag;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.GetSupportedVersionTagResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.Read;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ReadByCodeSystem;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ReadByCodeSystemResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ReadEntityDescriptions;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ReadEntityDescriptionsResponse;
import edu.mayo.cts2.framework.model.wsdl.entitydescriptionread.ReadResponse;
import edu.mayo.cts2.framework.service.profile.codesystemversion.CodeSystemVersionReadService;
import edu.mayo.cts2.framework.service.profile.entitydescription.EntityDescriptionReadService;
import edu.mayo.cts2.framework.service.profile.entitydescription.name.EntityDescriptionReadId;
import edu.mayo.cts2.framework.webapp.service.MockServiceProvider;
import edu.mayo.cts2.framework.webapp.soap.endpoint.MockBaseService;
import edu.mayo.cts2.framework.webapp.soap.endpoint.SoapEndpointTestBase;
public class EntityDescriptionReadServicesEndpointTestIT extends SoapEndpointTestBase {
String uri = "http://localhost:8081/webapp-rest/soap/service/EntityDescriptionReadService";
@Before
public void setup(){
MockServiceProvider.cts2Services.add(new MockCsvReadService());
}
private static class MockCsvReadService implements CodeSystemVersionReadService {
@Override
public CodeSystemVersionCatalogEntry readByTag(
NameOrURI parentIdentifier,
VersionTagReference tag,
ResolvedReadContext readContext) {
CodeSystemVersionCatalogEntry entry = new CodeSystemVersionCatalogEntry();
entry.setCodeSystemVersionName("test.version");
return entry;
}
@Override
public boolean existsByTag(NameOrURI parentIdentifier,
VersionTagReference tag, ResolvedReadContext readContext) {
// TODO Auto-generated method stub
return false;
}
@Override
public List<VersionTagReference> getSupportedTags() {
VersionTagReference ref = new VersionTagReference("success");
VersionTagReference refs[] = new VersionTagReference[1];
refs[0] = ref;
return Arrays.asList(refs);
}
@Override
public CodeSystemVersionCatalogEntry read(NameOrURI identifier,
ResolvedReadContext readContext) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean exists(NameOrURI identifier,
ResolvedReadContext readContext) {
// TODO Auto-generated method stub
return false;
}
@Override
public String getServiceName() {
// TODO Auto-generated method stub
return null;
}
@Override
public OpaqueData getServiceDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServiceVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public SourceReference getServiceProvider() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<DocumentedNamespaceReference> getKnownNamespaceList() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean existsVersionId(NameOrURI codeSystem,
String officialResourceVersionId) {
// TODO Auto-generated method stub
return false;
}
@Override
public CodeSystemVersionCatalogEntry getCodeSystemByVersionId(
NameOrURI codeSystem, String officialResourceVersionId,
ResolvedReadContext readContext) {
// TODO Auto-generated method stub
return null;
}
}
@Test
public void TestRead() throws Exception {
MockServiceProvider.cts2Service = new MockService();
Read request = new Read();
ScopedEntityName name = new ScopedEntityName();
name.setName("test");
name.setNamespace("test");
request.setEntityId(ModelUtils.entityNameOrUriFromName(name));
request.setCodeSystemVersion(ModelUtils.nameOrUriFromName("test.version"));
request.setContext(new ReadContext());
QueryControl queryControl = new QueryControl();
queryControl.setTimeLimit(10000L);
request.setQueryControl(queryControl);
ReadResponse response = (ReadResponse) this.doSoapCall(uri, request);
assertEquals("success", ModelUtils.getEntity(response.getReturn()).getEntityID().getName());
}
@Test
public void TestExists() throws Exception {
MockServiceProvider.cts2Service = new MockService();
Exists request = new Exists();
ScopedEntityName name = new ScopedEntityName();
name.setName("test");
name.setNamespace("test");
request.setEntityId(ModelUtils.entityNameOrUriFromName(name));
request.setCodeSystemVersion(ModelUtils.nameOrUriFromName("test.version"));
request.setContext(new ReadContext());
ExistsResponse response = (ExistsResponse) this.doSoapCall(uri, request);
assertTrue(response.getReturn());
}
@Test
public void TestExistsInCodeSystem() throws Exception {
MockServiceProvider.cts2Service = new MockService();
ExistsInCodeSystem request = new ExistsInCodeSystem();
request.setCodeSystem(ModelUtils.nameOrUriFromName("test"));
request.setContext(new ReadContext());
request.setEntityId(ModelUtils.entityNameOrUriFromUri("test.uri"));
request.setTag(ModelUtils.nameOrUriFromName("test.tag"));
ExistsInCodeSystemResponse response = (ExistsInCodeSystemResponse) this.doSoapCall(uri, request);
assertTrue(response.getReturn());
}
@Test
public void TestReadByCodeSystem() throws Exception {
MockServiceProvider.cts2Service = new MockService();
ReadByCodeSystem request = new ReadByCodeSystem();
request.setCodeSystem(ModelUtils.nameOrUriFromName("test"));
ScopedEntityName name = new ScopedEntityName();
name.setName("test");
name.setNamespace("test");
request.setEntityId(ModelUtils.entityNameOrUriFromName(name));
request.setContext(new ReadContext());
QueryControl queryControl = new QueryControl();
queryControl.setTimeLimit(1000000L);
request.setQueryControl(queryControl);
request.setTag(ModelUtils.nameOrUriFromName("test.tag"));
ReadByCodeSystemResponse response = (ReadByCodeSystemResponse) this.doSoapCall(uri, request);
assertEquals("success", ModelUtils.getEntity(response.getReturn()).getEntityID().getName());
}
@Test
@Ignore
public void TestReadEntityDescriptions() throws Exception {
MockServiceProvider.cts2Service = new MockService();
ReadEntityDescriptions request = new ReadEntityDescriptions();
ScopedEntityName name = new ScopedEntityName();
name.setName("test.name");
name.setNamespace("test");
request.setEntityId(ModelUtils.entityNameOrUriFromName(name));
request.setContext(new ReadContext());
QueryControl queryControl = new QueryControl();
queryControl.setTimeLimit(10000L);
request.setQueryControl(queryControl);
ReadEntityDescriptionsResponse response = (ReadEntityDescriptionsResponse) this.doSoapCall(uri, request);
assertEquals("success", response.getEntityList().getEntry(0).getResourceName());
}
@Test
public void TestAvailableDescriptions() throws Exception {
MockServiceProvider.cts2Service = new MockService();
AvailableDescriptions request = new AvailableDescriptions();
request.setEntityId(ModelUtils.entityNameOrUriFromUri("test.uri"));
request.setContext(new ReadContext());
AvailableDescriptionsResponse response = (AvailableDescriptionsResponse) this.doSoapCall(uri, request);
assertEquals("success", response.getReturn().getName().getName());
}
@Test
public void TestGetKnownCodeSystem() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetKnownCodeSystem request = new GetKnownCodeSystem();
GetKnownCodeSystemResponse response = (GetKnownCodeSystemResponse) this.doSoapCall(uri, request);
assertEquals("success", response.getReturn()[0].getContent());
}
@Test
public void TestGetKnownCodeSystemVersion() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetKnownCodeSystemVersion request = new GetKnownCodeSystemVersion();
GetKnownCodeSystemVersionResponse response = (GetKnownCodeSystemVersionResponse) this.doSoapCall(uri, request);
assertEquals("success", response.getReturn()[0].getCodeSystem().getContent());
}
@Test
public void TestGetSupportedVersionTag() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetSupportedVersionTag request = new GetSupportedVersionTag();
GetSupportedVersionTagResponse response = (GetSupportedVersionTagResponse) this.doSoapCall(uri, request);
assertEquals("success", response.getReturn(0).getContent());
}
/*******************************************************/
/* Base Services */
/*******************************************************/
@Test
public void TestGetServiceName() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetServiceName request = new GetServiceName();
GetServiceNameResponse response = (GetServiceNameResponse) this.doSoapCall(uri, request);
assertEquals(MockBaseService.class.getName(), response.getReturn());
}
@Test
public void TestGetServiceDescription() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetServiceDescription request = new GetServiceDescription();
GetServiceDescriptionResponse response = (GetServiceDescriptionResponse) this.doSoapCall(uri, request);
OpaqueData expected = new OpaqueData();
expected.setValue(ModelUtils.toTsAnyType("test desc"));
assertEquals(expected, response.getReturn());
}
@Test
public void TestGetServiceProvider() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetServiceProvider request = new GetServiceProvider();
GetServiceProviderResponse response = (GetServiceProviderResponse) this.doSoapCall(uri, request);
assertEquals(new SourceReference("test ref"), response.getReturn());
}
@Test
public void TestGetServiceVersion() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetServiceVersion request = new GetServiceVersion();
GetServiceVersionResponse response = (GetServiceVersionResponse) this.doSoapCall(uri, request);
assertEquals("1.23.4", response.getReturn());
}
@Test
public void TestGetSupportedFormat() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetSupportedFormat request = new GetSupportedFormat();
GetSupportedFormatResponse response = (GetSupportedFormatResponse) this.doSoapCall(uri, request);
assertEquals("SOAP", response.getReturn(0).getContent());
}
@Test
public void TestGetDefaultFormat() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetDefaultFormat request = new GetDefaultFormat();
GetDefaultFormatResponse response = (GetDefaultFormatResponse) this.doSoapCall(uri, request);
assertEquals("SOAP", response.getReturn().getContent());
}
@Test
public void TestGetSupportedProfile() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetSupportedProfile request = new GetSupportedProfile();
GetSupportedProfileResponse response = (GetSupportedProfileResponse) this.doSoapCall(uri, request);
ProfileElement profile = response.getReturn()[0];
assertEquals(StructuralProfile.SP_ENTITY_DESCRIPTION, profile.getStructuralProfile());
assertEquals(FunctionalProfile.FP_READ.name(), profile.getFunctionalProfile()[0].getContent());
}
@Test
public void TestGetImplementationType() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetImplementationType request = new GetImplementationType();
GetImplementationTypeResponse response = (GetImplementationTypeResponse) this.doSoapCall(uri, request);
assertEquals(ImplementationProfile.IP_SOAP, response.getReturn(0));
}
@Test
public void TestGetKnownNamespace() throws Exception {
MockServiceProvider.cts2Service = new MockService();
GetKnownNamespace request = new GetKnownNamespace();
GetKnownNamespaceResponse response = (GetKnownNamespaceResponse) this.doSoapCall(uri, request);
NamespaceReference[] namespaceReferences = response.getReturn();
assertEquals(3, namespaceReferences.length);
assertTrue(ArrayUtils.contains(namespaceReferences, new DocumentedNamespaceReference("ns1")));
assertTrue(ArrayUtils.contains(namespaceReferences, new DocumentedNamespaceReference("ns2")));
assertTrue(ArrayUtils.contains(namespaceReferences, new DocumentedNamespaceReference("ns3")));
}
/********************************************************************************************************************/
/* */
/* Mock Code System Catalog Read Service Class */
/* */
/********************************************************************************************************************/
private class MockService extends MockBaseService implements EntityDescriptionReadService {
@Override
public EntityDescription read(EntityDescriptionReadId identifier, ResolvedReadContext resolvedReadContext) {
ScopedEntityName name = new ScopedEntityName();
name.setNamespace("test");
EntityDescriptionBase entityDescription = createEntityDescription();
if (identifier.getEntityName().getName().equals("test")
&& identifier.getCodeSystemVersion().getName().equals("test.version")
&& resolvedReadContext != null) {
name.setName("success");
}
else {
name.setName("fail");
}
entityDescription.setEntityID(name);
return ModelUtils.toEntityDescription(entityDescription);
}
@Override
public boolean exists(EntityDescriptionReadId identifier, ResolvedReadContext resolvedReadContext) {
ScopedEntityName entityId = identifier.getEntityName();
NameOrURI codeSystemVersion = identifier.getCodeSystemVersion();
return ( ( entityId != null && StringUtils.equals(entityId.getName(), "test") ) || StringUtils.equals(identifier.getUri(), "test.uri"))
&& codeSystemVersion.getName().equals("test.version")
&& resolvedReadContext != null;
}
@Override
public DirectoryResult<EntityListEntry> readEntityDescriptions(EntityNameOrURI entityId, SortCriteria sortCriteria, ResolvedReadContext readContext, Page page) {
throw new UnsupportedOperationException("Unimplemented Method");
}
@Override
public EntityReference availableDescriptions(EntityNameOrURI entityId, ResolvedReadContext readContext) {
EntityReference ref = new EntityReference();
ref.setAbout("test.about");
ScopedEntityName name = new ScopedEntityName();
name.setNamespace("test");
if (entityId.getUri().equals("test.uri") && readContext != null) {
name.setName("success");
}
else {
name.setName("fail");
}
ref.setName(name);
return ref;
}
@Override
public List<EntityListEntry> readEntityDescriptions(EntityNameOrURI entityId, ResolvedReadContext readContext) {
List<EntityListEntry> entities = new ArrayList<EntityListEntry>();
EntityListEntry entry = createEntityListEntry();
if (entityId.getEntityName().getName().equals("test.name") && readContext != null) {
entry.setResourceName("success");
}
else {
entry.setResourceName("fail");
}
entities.add(entry);
return entities;
}
@Override
public List<CodeSystemReference> getKnownCodeSystems() {
CodeSystemReference ref = new CodeSystemReference("success");
CodeSystemReference refs[] = new CodeSystemReference[1];
refs[0] = ref;
return Arrays.asList(refs);
}
@Override
public List<CodeSystemVersionReference> getKnownCodeSystemVersions() {
CodeSystemVersionReference ref = new CodeSystemVersionReference();
ref.setCodeSystem(new CodeSystemReference("success"));
ref.setVersion(new NameAndMeaningReference("test.version"));
CodeSystemVersionReference refs[] = new CodeSystemVersionReference[1];
refs[0] = ref;
return Arrays.asList(refs);
}
@Override
public List<VersionTagReference> getSupportedVersionTags() {
VersionTagReference ref = new VersionTagReference("success");
VersionTagReference refs[] = new VersionTagReference[1];
refs[0] = ref;
return Arrays.asList(refs);
}
private EntityDescriptionBase createEntityDescription() {
EntityDescriptionBase entityDescription = new NamedEntityDescription();
entityDescription.setAbout("test.about");
CodeSystemVersionReference versionRef = new CodeSystemVersionReference();
versionRef.setCodeSystem(new CodeSystemReference("test.codesystem"));
NameAndMeaningReference nameRef = new NameAndMeaningReference("test.nameref");
versionRef.setVersion(nameRef);
entityDescription.setDescribingCodeSystemVersion(versionRef);
URIAndEntityName uriAndEntityName = new URIAndEntityName();
uriAndEntityName.setName("test.urientityname");
uriAndEntityName.setNamespace("test");
uriAndEntityName.setUri("http://my/uri");
URIAndEntityName uriAndEntityNames[] = new URIAndEntityName[1];
uriAndEntityNames[0] = uriAndEntityName;
entityDescription.setEntityType(uriAndEntityNames);
return entityDescription;
}
private EntityListEntry createEntityListEntry() {
/* EntityDescription */
EntityDescription entityDescription = new EntityDescription();
NamedEntityDescription namedEntityDescription = new NamedEntityDescription();
ScopedEntityName name = new ScopedEntityName();
name.setName("test");
name.setNamespace("test");
CodeSystemVersionReference ref = new CodeSystemVersionReference();
ref.setCodeSystem(new CodeSystemReference("test.ref"));
ref.setVersion(new NameAndMeaningReference("test.ref.version"));
namedEntityDescription.setEntityID(name);
namedEntityDescription.setDescribingCodeSystemVersion(ref);
namedEntityDescription.setAbout("test.about");
URIAndEntityName uriAndEntityName = new URIAndEntityName();
uriAndEntityName.setName("test.entityType");
uriAndEntityName.setNamespace("test.namespace");
uriAndEntityName.setUri("http://my/uri");
List<URIAndEntityName> uriAndEntityNameList = new ArrayList<URIAndEntityName>(1);
uriAndEntityNameList.add(uriAndEntityName);
namedEntityDescription.setEntityType(uriAndEntityNameList);
entityDescription.setNamedEntity(namedEntityDescription);
/* EntityListEntry */
EntityListEntry entry = new EntityListEntry();
entry.setEntry(entityDescription);
return entry;
}
}
}