package edu.mayo.cts2.framework.webapp.soap.endpoint.entitydescription;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
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.FormatReference;
import edu.mayo.cts2.framework.model.core.VersionTagReference;
import edu.mayo.cts2.framework.model.entity.EntityDescription;
import edu.mayo.cts2.framework.model.service.core.FunctionalProfileEntry;
import edu.mayo.cts2.framework.model.service.core.ProfileElement;
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.naming.CodeSystemVersionNameResolver;
import edu.mayo.cts2.framework.webapp.soap.endpoint.AbstractReadServiceEndpoint;
@Endpoint("EntityDescriptionReadServicesEndpoint")
public class EntityDescriptionReadServicesEndpoint extends AbstractReadServiceEndpoint {
@Cts2Service
private EntityDescriptionReadService entityDescriptionReadService;
@Cts2Service
private CodeSystemVersionReadService codeSystemVersionReadService;
@Resource
private CodeSystemVersionNameResolver codeSystemVersionNameResolver;
@PayloadRoot(localPart = "read", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public ReadResponse read(@RequestPayload Read request) {
EntityDescription base = this.doRead(
this.entityDescriptionReadService,
new EntityDescriptionReadId(
request.getEntityId(),
request.getCodeSystemVersion()),
request.getQueryControl(),
request.getContext());
ReadResponse response = new ReadResponse();
response.setReturn(base);
return response;
}
@PayloadRoot(localPart = "exists", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public ExistsResponse exists(@RequestPayload Exists request) {
ResolvedReadContext resolvedReadContext = this.resolveReadContext(request.getContext());
boolean exists = this.entityDescriptionReadService.exists(
new EntityDescriptionReadId(
request.getEntityId(),
request.getCodeSystemVersion()),
resolvedReadContext);
ExistsResponse response = new ExistsResponse();
response.setReturn(exists);
return response;
}
@PayloadRoot(localPart = "existsInCodeSystem", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public ExistsInCodeSystemResponse existsInCodeSystem(@RequestPayload ExistsInCodeSystem request) {
ResolvedReadContext resolvedReadContext = this.resolveReadContext(request.getContext());
String codeSystemVersionName = codeSystemVersionNameResolver.getVersionNameFromTag(
codeSystemVersionReadService,
request.getCodeSystem(),
this.resolveTag(request.getTag(), codeSystemVersionReadService),
this.resolveReadContext(request.getContext()));
EntityDescriptionReadId id = new EntityDescriptionReadId(
request.getEntityId(),
ModelUtils.nameOrUriFromName(codeSystemVersionName));
boolean exists = this.entityDescriptionReadService.exists(
id,
resolvedReadContext);
ExistsInCodeSystemResponse response = new ExistsInCodeSystemResponse();
response.setReturn(exists);
return response;
}
@PayloadRoot(localPart = "readByCodeSystem", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public ReadByCodeSystemResponse readByCodeSystem(@RequestPayload ReadByCodeSystem request) {
String codeSystemVersionName = codeSystemVersionNameResolver.getVersionNameFromTag(
codeSystemVersionReadService,
request.getCodeSystem(),
this.resolveTag(request.getTag(), codeSystemVersionReadService),
this.resolveReadContext(request.getContext()));
EntityDescription base = this.doRead(
this.entityDescriptionReadService,
new EntityDescriptionReadId(
request.getEntityId(),
ModelUtils.nameOrUriFromName(codeSystemVersionName)),
request.getQueryControl(),
request.getContext());
ReadByCodeSystemResponse response = new ReadByCodeSystemResponse();
response.setReturn(base);
return response;
}
@PayloadRoot(localPart = "readEntityDescriptions", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public ReadEntityDescriptionsResponse readEntityDescriptions(@RequestPayload ReadEntityDescriptions request) {
throw new UnsupportedOperationException();
}
@PayloadRoot(localPart = "availableDescriptions", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public AvailableDescriptionsResponse availableDescriptions(@RequestPayload AvailableDescriptions request) {
ResolvedReadContext resolvedReadContext = this.resolveReadContext(request.getContext());
EntityReference entityReference = this.entityDescriptionReadService.availableDescriptions(request.getEntityId(), resolvedReadContext);
AvailableDescriptionsResponse response = new AvailableDescriptionsResponse();
response.setReturn(entityReference);
return response;
}
@PayloadRoot(localPart = "getKnownCodeSystem", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public GetKnownCodeSystemResponse getKnownCodeSystem(@RequestPayload GetKnownCodeSystem request) {
List<CodeSystemReference> ref = this.entityDescriptionReadService.getKnownCodeSystems();
GetKnownCodeSystemResponse response = new GetKnownCodeSystemResponse();
response.setReturn(ref);
return response;
}
@PayloadRoot(localPart = "getKnownCodeSystemVersion", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public GetKnownCodeSystemVersionResponse getKnownCodeSystemVersion(@RequestPayload GetKnownCodeSystemVersion request) {
List<CodeSystemVersionReference> refs = this.entityDescriptionReadService.getKnownCodeSystemVersions();
GetKnownCodeSystemVersionResponse response = new GetKnownCodeSystemVersionResponse();
response.setReturn(refs);
return response;
}
@PayloadRoot(localPart = "getSupportedVersionTag", namespace = CTS2_NAMESPACE_ROOT + "EntityDescriptionReadServices")
@ResponsePayload
public GetSupportedVersionTagResponse getSupportedVersionTag(@RequestPayload GetSupportedVersionTag request) {
List<VersionTagReference> refs = this.entityDescriptionReadService.getSupportedVersionTags();
GetSupportedVersionTagResponse response = new GetSupportedVersionTagResponse();
response.setReturn(refs);
return response;
}
/*******************************************************/
/* BaseServices */
/*******************************************************/
@PayloadRoot(localPart = "getDefaultFormat", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetDefaultFormatResponse getDefaultFormat(@RequestPayload GetDefaultFormat request) {
FormatReference format = new FormatReference("SOAP");
GetDefaultFormatResponse response = new GetDefaultFormatResponse();
response.setReturn(format);
return response;
}
@PayloadRoot(localPart = "getImplementationType", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetImplementationTypeResponse getImplementationType(@RequestPayload GetImplementationType request) {
ImplementationProfile implementations[] = new ImplementationProfile[1];
implementations[0] = ImplementationProfile.IP_SOAP;
GetImplementationTypeResponse response = new GetImplementationTypeResponse();
response.setReturn(implementations);
return response;
}
@PayloadRoot(localPart = "getKnownNamespace", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetKnownNamespaceResponse getKnownNamespace(@RequestPayload GetKnownNamespace request) {
GetKnownNamespaceResponse response = new GetKnownNamespaceResponse();
response.setReturn(this.entityDescriptionReadService.getKnownNamespaceList());
return response;
}
@PayloadRoot(localPart = "getServiceDescription", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetServiceDescriptionResponse getServiceDescription(@RequestPayload GetServiceDescription request) {
GetServiceDescriptionResponse response = new GetServiceDescriptionResponse();
response.setReturn(this.entityDescriptionReadService.getServiceDescription());
return response;
}
@PayloadRoot(localPart = "getServiceName", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetServiceNameResponse getServiceName(@RequestPayload GetServiceName request) {
GetServiceNameResponse response = new GetServiceNameResponse();
response.setReturn(this.entityDescriptionReadService.getServiceName());
return response;
}
@PayloadRoot(localPart = "getServiceProvider", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetServiceProviderResponse getServiceProvider(@RequestPayload GetServiceProvider request) {
GetServiceProviderResponse response = new GetServiceProviderResponse();
response.setReturn(this.entityDescriptionReadService.getServiceProvider());
return response;
}
@PayloadRoot(localPart = "getServiceVersion", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetServiceVersionResponse getServiceVersion(@RequestPayload GetServiceVersion request) {
GetServiceVersionResponse response = new GetServiceVersionResponse();
response.setReturn(this.entityDescriptionReadService.getServiceVersion());
return response;
}
@PayloadRoot(localPart = "getSupportedFormat", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetSupportedFormatResponse getSupportedFormat(@RequestPayload GetSupportedFormat request) {
FormatReference format[] = new FormatReference[1];
format[0] = new FormatReference("SOAP");
GetSupportedFormatResponse response = new GetSupportedFormatResponse();
response.setReturn(format);
return response;
}
@PayloadRoot(localPart = "getSupportedProfile", namespace = CTS2_NAMESPACE_ROOT + "BaseServiceTypes")
@ResponsePayload
public GetSupportedProfileResponse getSupportedProfile(@RequestPayload GetSupportedProfile request) {
ProfileElement profile = new ProfileElement();
profile.setStructuralProfile(StructuralProfile.SP_ENTITY_DESCRIPTION);
FunctionalProfileEntry entry = new FunctionalProfileEntry();
entry.setContent(FunctionalProfile.FP_READ.name());
profile.addFunctionalProfile(entry);
ProfileElement profiles[] = new ProfileElement[1];
profiles[0] = profile;
GetSupportedProfileResponse response = new GetSupportedProfileResponse();
response.setReturn(profiles);
return response;
}
public CodeSystemVersionNameResolver getCodeSystemVersionNameResolver() {
return codeSystemVersionNameResolver;
}
public void setCodeSystemVersionNameResolver(
CodeSystemVersionNameResolver codeSystemVersionNameResolver) {
this.codeSystemVersionNameResolver = codeSystemVersionNameResolver;
}
public CodeSystemVersionReadService getCodeSystemVersionReadService() {
return codeSystemVersionReadService;
}
public void setCodeSystemVersionReadService(
CodeSystemVersionReadService codeSystemVersionReadService) {
this.codeSystemVersionReadService = codeSystemVersionReadService;
}
}