/* * Copyright: (c) 2004-2011 Mayo Foundation for Medical Education and * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the * triple-shield Mayo logo are trademarks and service marks of MFMER. * * Except as contained in the copyright notice above, or as used to identify * MFMER as the author of this software, the trade names, trademarks, service * marks, or product names of the copyright holder shall not be used in * advertising, promotion or otherwise in connection with this software without * prior written authorization of the copyright holder. * * 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 edu.mayo.cts2.framework.webapp.rest.controller; import edu.mayo.cts2.framework.core.util.EncodingUtils; import edu.mayo.cts2.framework.model.command.Page; import edu.mayo.cts2.framework.model.command.ResolvedReadContext; import edu.mayo.cts2.framework.model.core.*; import edu.mayo.cts2.framework.model.directory.DirectoryResult; import edu.mayo.cts2.framework.model.entity.*; import edu.mayo.cts2.framework.model.exception.ExceptionFactory; import edu.mayo.cts2.framework.model.service.core.EntityNameOrURI; import edu.mayo.cts2.framework.model.service.core.Query; import edu.mayo.cts2.framework.model.service.exception.UnknownEntity; import edu.mayo.cts2.framework.model.util.ModelUtils; import edu.mayo.cts2.framework.service.command.restriction.EntityDescriptionQueryServiceRestrictions; import edu.mayo.cts2.framework.service.command.restriction.TaggedCodeSystemRestriction; import edu.mayo.cts2.framework.service.profile.codesystemversion.CodeSystemVersionReadService; import edu.mayo.cts2.framework.service.profile.entitydescription.EntityDescriptionMaintenanceService; import edu.mayo.cts2.framework.service.profile.entitydescription.EntityDescriptionQuery; import edu.mayo.cts2.framework.service.profile.entitydescription.EntityDescriptionQueryService; 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.rest.command.QueryControl; import edu.mayo.cts2.framework.webapp.rest.command.RestFilter; import edu.mayo.cts2.framework.webapp.rest.command.RestReadContext; import edu.mayo.cts2.framework.webapp.rest.query.EntityQueryBuilder; import edu.mayo.cts2.framework.webapp.rest.util.ControllerUtils; import edu.mayo.cts2.framework.webapp.rest.validator.EntityDescriptionValidator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; /** * The Class EntityDescriptionController. * * @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a> */ @Controller public class EntityDescriptionController extends AbstractMessageWrappingController { @Cts2Service private EntityDescriptionQueryService entityDescriptionQueryService; @Cts2Service private EntityDescriptionReadService entityDescriptionReadService; @Cts2Service private EntityDescriptionMaintenanceService entityDescriptionMaintenanceService; @Cts2Service private CodeSystemVersionReadService codeSystemVersionReadService; @Resource private CodeSystemVersionNameResolver codeSystemVersionNameResolver; @Resource private EntityDescriptionValidator entityDescriptionValidator; private final UrlTemplateBinder<EntityDescription> URL_BINDER = new UrlTemplateBinder<EntityDescription>(){ @Override public Map<String,String> getPathValues(EntityDescription resource) { Map<String,String> returnMap = new HashMap<String,String>(); EntityDescriptionBase base = ModelUtils.getEntity(resource); String codeSystemName = base.getDescribingCodeSystemVersion().getCodeSystem().getContent(); returnMap.put(VAR_CODESYSTEMID, codeSystemName); ResolvedReadContext readContext = null; ChangeableElementGroup group = resource.getChangeableElementGroup(); if(group != null && group.getChangeDescription() != null){ String changeSetUri = group.getChangeDescription().getContainingChangeSet(); readContext = new ResolvedReadContext(); readContext.setChangeSetContextUri(changeSetUri); } returnMap.put(VAR_CODESYSTEMVERSIONID, codeSystemVersionNameResolver.getVersionIdFromCodeSystemVersionName( codeSystemVersionReadService, base.getDescribingCodeSystemVersion().getVersion().getContent(), readContext)); ScopedEntityName id = base.getEntityID(); returnMap.put(VAR_ENTITYID, EncodingUtils.encodeScopedEntityName(id)); return returnMap; } }; private final static MessageFactory<EntityDescription> MESSAGE_FACTORY = new MessageFactory<EntityDescription>() { @Override public Message createMessage(EntityDescription resource) { EntityDescriptionMsg msg = new EntityDescriptionMsg(); msg.setEntityDescription(resource); return msg; } }; private final static MessageFactory<EntityList> ENTITY_LIST_MESSAGE_FACTORY = new MessageFactory<EntityList>(){ @Override public Message createMessage(EntityList resource) { return resource; } }; private final static MessageFactory<EntityReference> ENTITYREFERENCE_MESSAGE_FACTORY = new MessageFactory<EntityReference>(){ @Override public Message createMessage(EntityReference resource) { EntityReferenceMsg msg = new EntityReferenceMsg(); msg.setEntityReference(resource); return msg; } }; /** * Creates the entity description. * * @param changeseturi the changeseturi * @param entity the entity * @param codeSystemName the code system name * @param codeSystemVersionName the code system version name * @param entityName the entity name */ @RequestMapping(value=PATH_ENTITY_OF_CODESYSTEM_VERSION_BYID, method=RequestMethod.PUT) public Object updateEntityDescription( HttpServletResponse httpServletResponse, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi, @RequestBody EntityDescription entity, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSytemVersionName, @PathVariable(VAR_ENTITYID) String entityName) { this.entityDescriptionValidator.validateUpdateEntityDescription( this.codeSystemVersionReadService, codeSystemName, codeSytemVersionName, entity); ScopedEntityName name = getScopedEntityName(entityName, codeSystemName); return this.doUpdate( httpServletResponse, entity, changeseturi, new EntityDescriptionReadId(name, ModelUtils.nameOrUriFromName(codeSytemVersionName)), this.entityDescriptionMaintenanceService); } @RequestMapping(value=PATH_ENTITY, method=RequestMethod.POST) public Object createEntityDescription( HttpServletResponse httpServletResponse, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi, @RequestBody EntityDescription entity) { return this.doCreate( httpServletResponse, entity, changeseturi, PATH_ENTITY_OF_CODESYSTEM_VERSION_BYID, URL_BINDER, this.entityDescriptionMaintenanceService); } @RequestMapping(value=PATH_ENTITY_OF_CODESYSTEM_VERSION_BYID, method=RequestMethod.DELETE) public Object deleteCodeSystemVersion( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId, @PathVariable(VAR_ENTITYID) String entityName, @RequestParam(PARAM_CHANGESETCONTEXT) String changeseturi) { ResolvedReadContext readContext = new ResolvedReadContext(); readContext.setChangeSetContextUri(changeseturi); String codeSystemVersionName = this.codeSystemVersionNameResolver.getCodeSystemVersionNameFromVersionId( codeSystemVersionReadService, codeSystemName, codeSystemVersionId, readContext); EntityDescriptionReadId id = new EntityDescriptionReadId( getScopedEntityName(entityName, codeSystemName), ModelUtils.nameOrUriFromName(codeSystemVersionName)); return this.doDelete( httpServletResponse, id, changeseturi, this.entityDescriptionMaintenanceService); } /** * Gets the entity descriptions of code system version. * * @param httpServletRequest the http servlet request * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param codeSystemName the code system name * @param codeSystemVersionName the code system version name * @return the entity descriptions of code system version */ @RequestMapping(value=PATH_ENTITIES_OF_CODESYSTEM_VERSION, method=RequestMethod.GET) public Object getEntityDescriptionsOfCodeSystemVersion( HttpServletRequest httpServletRequest, QueryControl queryControl, RestReadContext restReadContext, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId) { return this.getEntityDescriptionsOfCodeSystemVersion( httpServletRequest, restReadContext, queryControl, null, restrictions, restFilter, page, list, codeSystemName, codeSystemVersionId); } /** * Gets the entity descriptions of code system version. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param codeSystemName the code system name * @param codeSystemVersionName the code system version name * @return the entity descriptions of code system version */ @RequestMapping(value=PATH_ENTITIES_OF_CODESYSTEM_VERSION, method=RequestMethod.POST) public Object getEntityDescriptionsOfCodeSystemVersion( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @RequestBody Query query, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); String codeSystemVersionName = this.getCodeSystemVersionNameResolver(). getCodeSystemVersionNameFromVersionId( codeSystemVersionReadService, codeSystemName, codeSystemVersionId, readContext); restrictions.getCodeSystemVersions().add(ModelUtils.nameOrUriFromName(codeSystemVersionName)); return this.getEntityDescriptions( httpServletRequest, restReadContext, queryControl, query, restrictions, restFilter, page, list); } /** * Gets the entity descriptions of code system version count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param codeSystemName the code system name * @param codeSystemVersionName the code system version name * @return the entity descriptions of code system version count */ @RequestMapping(value=PATH_ENTITIES_OF_CODESYSTEM_VERSION, method=RequestMethod.HEAD) @ResponseBody public void getEntityDescriptionsOfCodeSystemVersionCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, Query query, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); String codeSystemVersionName = this.codeSystemVersionNameResolver.getCodeSystemVersionNameFromVersionId( codeSystemVersionReadService, codeSystemName, codeSystemVersionId, readContext); restrictions.getCodeSystemVersions().add(ModelUtils.nameOrUriFromName(codeSystemVersionName)); this.getEntityDescriptionsCount( httpServletResponse, restReadContext, query, restrictions, restFilter); } /** * Gets the entity descriptions. * * @param httpServletRequest the http servlet request * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @return the entity descriptions */ @RequestMapping(value=PATH_ENTITIES, method=RequestMethod.GET) public Object getEntityDescriptions( HttpServletRequest httpServletRequest, QueryControl queryControl, RestReadContext restReadContext, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { return this.getEntityDescriptions( httpServletRequest, restReadContext, queryControl, null, restrictions, restFilter, page, list); } /** * Gets the entity descriptions. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @return the entity descriptions */ @RequestMapping(value=PATH_ENTITIES, method=RequestMethod.POST) public Object getEntityDescriptions( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @RequestBody Query query, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { EntityQueryBuilder builder = this.getNewResourceQueryBuilder(); EntityDescriptionQuery resourceQuery = builder. addQuery(query). addRestrictions(restrictions). addRestFilter(restFilter). addRestReadContext(restReadContext). build(); return this.doQuery( httpServletRequest, list, this.entityDescriptionQueryService, resourceQuery, page, queryControl, EntityDirectory.class, EntityList.class); } /** * Gets the entity descriptions count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param filterComponent the filter component * @return the entity descriptions count */ @RequestMapping(value=PATH_ENTITIES, method=RequestMethod.HEAD) @ResponseBody public void getEntityDescriptionsCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, Query query, EntityDescriptionQueryServiceRestrictions restrictions, RestFilter restFilter) { EntityQueryBuilder builder = this.getNewResourceQueryBuilder(); EntityDescriptionQuery resourceQuery = builder. addQuery(query). addRestrictions(restrictions). addRestFilter(restFilter). addRestReadContext(restReadContext). build(); int count = this.entityDescriptionQueryService.count(resourceQuery); this.setCount(count, httpServletResponse); } @RequestMapping(value=PATH_ENTITY_OF_CODESYSTEM_VERSION_BYURI, method=RequestMethod.GET) public ModelAndView getEntityDescriptionOfCodeSystemVersionByUri( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId, @RequestParam(PARAM_URI) String uri, @RequestParam(value="redirect", defaultValue=DEFAULT_REDIRECT) boolean redirect) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); String codeSystemVersionName = this.codeSystemVersionNameResolver.getCodeSystemVersionNameFromVersionId( codeSystemVersionReadService, codeSystemName, codeSystemVersionId, readContext); EntityDescriptionReadId id = new EntityDescriptionReadId( uri, ModelUtils.nameOrUriFromName(codeSystemVersionName)); EntityDescription resource = this.entityDescriptionReadService.read( id, readContext); return this.doForward( resource, id.toString(), httpServletRequest, MESSAGE_FACTORY, PATH_ENTITY_OF_CODESYSTEM_VERSION_BYURI, PATH_ENTITY_OF_CODESYSTEM_VERSION_BYID, URL_BINDER, restReadContext, UnknownEntity.class, redirect); } /** * Gets the entity description by name. * * @param httpServletRequest the http servlet request * @param codeSystemName the code system name * @param codeSystemVersionName the code system version name * @param entityName the entity name * @return the entity description by name */ @RequestMapping(value=PATH_ENTITY_OF_CODESYSTEM_VERSION_BYID, method=RequestMethod.GET) public Object getEntityDescriptionOfCodeSystemVersionByName( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @PathVariable(VAR_CODESYSTEMID) String codeSystemName, @PathVariable(VAR_CODESYSTEMVERSIONID) String codeSystemVersionId, @PathVariable(VAR_ENTITYID) String entityName) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); String codeSystemVersionName = this.codeSystemVersionNameResolver.getCodeSystemVersionNameFromVersionId( codeSystemVersionReadService, codeSystemName, codeSystemVersionId, readContext); EntityDescriptionReadId id = new EntityDescriptionReadId( getScopedEntityName(entityName, codeSystemName), ModelUtils.nameOrUriFromName(codeSystemVersionName)); return this.doRead( httpServletRequest, MESSAGE_FACTORY, this.entityDescriptionReadService, restReadContext, UnknownEntity.class, id); } @RequestMapping(value=PATH_ALL_DESCRIPTIONS_OF_ENTITYBYID, method=RequestMethod.GET) public Object getAllEntityDescriptionsByName( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @PathVariable(VAR_ENTITYID) String entityName, Page page, boolean list) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); EntityNameOrURI entityId = ModelUtils.entityNameOrUriFromName(this.getScopedEntityName(entityName)); Object response = null; if(list){ DirectoryResult<EntityListEntry> entityList = this.entityDescriptionReadService.readEntityDescriptions( entityId, this.resolveSort(queryControl, this.entityDescriptionQueryService), readContext, page); if(entityList != null && entityList.getEntries() != null && entityList.getEntries().size() == 1 && StringUtils.isNotBlank(entityList.getEntries().get(0).getHref())){ Map<String,Object> parameters = new HashMap<String,Object>(httpServletRequest.getParameterMap()); parameters.remove(PARAM_LIST); String queryString = this.mapToQueryString(parameters); return new ModelAndView( "redirect:" + entityList.getEntries().get(0).getHref() + queryString); } else { response = this.populateDirectory(entityList, page, httpServletRequest, EntityList.class); } } else { EntityReference entityReference = this.entityDescriptionReadService.availableDescriptions(entityId, readContext); if(entityReference != null){ if(entityReference.getKnownEntityDescription() != null && entityReference.getKnownEntityDescriptionCount() == 1 && StringUtils.isNotBlank(entityReference.getKnownEntityDescription(0).getHref())){ Map<String,Object> parameters = new HashMap<String,Object>(httpServletRequest.getParameterMap()); String queryString = this.mapToQueryString(parameters); return new ModelAndView( "redirect:" + entityReference.getKnownEntityDescription(0).getHref() + queryString); } else { response = this.wrapMessage( ENTITYREFERENCE_MESSAGE_FACTORY.createMessage(entityReference), httpServletRequest); } } } if(response == null) { throw ExceptionFactory.createUnknownResourceException(entityId.toString(), UnknownEntity.class); } else { return this.buildResponse(httpServletRequest, response); } } /** * Gets the entity description by uri. * * @param httpServletRequest the http servlet request * @param uri the uri * @return the entity description by uri */ @RequestMapping(value=PATH_ENTITYBYURI, method=RequestMethod.GET) public Object getAllEntityDescriptionsByUri( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @RequestParam(PARAM_URI) String uri, Page page, boolean list, @RequestParam(value="redirect", defaultValue=DEFAULT_REDIRECT) boolean redirect) { ResolvedReadContext readContext = this.resolveRestReadContext(restReadContext); EntityNameOrURI entityId = ModelUtils.entityNameOrUriFromUri(uri); if(list){ DirectoryResult<EntityListEntry> entityList = this.entityDescriptionReadService.readEntityDescriptions( entityId, this.resolveSort(queryControl, this.entityDescriptionQueryService), readContext, page); if(entityList == null || CollectionUtils.isEmpty(entityList.getEntries())){ throw ExceptionFactory.createUnknownResourceException(entityId.toString(), UnknownEntity.class); } ScopedEntityName name = ModelUtils.getEntity(entityList.getEntries().get(0).getEntry()).getEntityID(); EntityList descriptions = this.populateDirectory(entityList, page, httpServletRequest, EntityList.class); final String id = EncodingUtils.encodeScopedEntityName(name); return this.doForward( descriptions, id, httpServletRequest, ENTITY_LIST_MESSAGE_FACTORY, PATH_ENTITYBYURI, PATH_ALL_DESCRIPTIONS_OF_ENTITYBYID, new UrlTemplateBinder<EntityList>(){ @Override public Map<String, String> getPathValues( EntityList resource) { Map<String, String> map = new HashMap<String,String>(); map.put(VAR_ENTITYID, id); return map; } }, restReadContext, UnknownEntity.class, redirect); } else { EntityReference descriptions = this.entityDescriptionReadService.availableDescriptions(entityId, readContext); if(descriptions == null){ throw ExceptionFactory.createUnknownResourceException(entityId.toString(), UnknownEntity.class); } final String id = EncodingUtils.encodeScopedEntityName(descriptions.getName()); return this.doForward( descriptions, id, httpServletRequest, ENTITYREFERENCE_MESSAGE_FACTORY, PATH_ENTITYBYURI, PATH_ALL_DESCRIPTIONS_OF_ENTITYBYID, new UrlTemplateBinder<EntityReference>(){ @Override public Map<String, String> getPathValues( EntityReference resource) { Map<String, String> map = new HashMap<String,String>(); map.put(VAR_ENTITYID, id); return map; } }, restReadContext, UnknownEntity.class, redirect); } } @InitBinder public void initEntityDescriptionRestrictionBinder( WebDataBinder binder, @RequestParam(value=PARAM_CODESYSTEM, required=false) List<String> codesystem, @RequestParam(value=PARAM_CODESYSTEMVERSION, required=false) List<String> codesystemversion, @RequestParam(value=PARAM_ENTITY, required=false) List<String> entity) { if(binder.getTarget() instanceof EntityDescriptionQueryServiceRestrictions){ EntityDescriptionQueryServiceRestrictions restrictions = (EntityDescriptionQueryServiceRestrictions) binder.getTarget(); if(CollectionUtils.isNotEmpty(codesystemversion)){ for(String csv : codesystemversion){ restrictions.getCodeSystemVersions().add( ModelUtils.nameOrUriFromEither(csv)); } } if(CollectionUtils.isNotEmpty(entity)){ restrictions.setEntities( ControllerUtils.idsToEntityNameOrUriSet(entity)); } if(CollectionUtils.isNotEmpty(codesystem)){ for(String cs : codesystem){ String[] parts = StringUtils.split(cs, PARAM_SEPARATOR); TaggedCodeSystemRestriction restriction = new TaggedCodeSystemRestriction(); restriction.setCodeSystem(ModelUtils.nameOrUriFromEither(parts[0])); String tagName; if(parts.length == 2){ tagName = ControllerUtils.getReference( parts[1], this.entityDescriptionQueryService.getSupportedTags()).getContent(); } else { tagName = DEFAULT_TAG; } restriction.setTag(tagName); restrictions.getTaggedCodeSystems().add(restriction); } } } } private EntityQueryBuilder getNewResourceQueryBuilder(){ return new EntityQueryBuilder( this.entityDescriptionQueryService, this.getFilterResolver(), this.getReadContextResolver()); } public EntityDescriptionQueryService getEntityDescriptionQueryService() { return entityDescriptionQueryService; } public void setEntityDescriptionQueryService( EntityDescriptionQueryService entityDescriptionQueryService) { this.entityDescriptionQueryService = entityDescriptionQueryService; } public EntityDescriptionReadService getEntityDescriptionReadService() { return entityDescriptionReadService; } public void setEntityDescriptionReadService( EntityDescriptionReadService entityDescriptionReadService) { this.entityDescriptionReadService = entityDescriptionReadService; } public EntityDescriptionMaintenanceService getEntityDescriptionMaintenanceService() { return entityDescriptionMaintenanceService; } public void setEntityDescriptionMaintenanceService( EntityDescriptionMaintenanceService entityDescriptionMaintenanceService) { this.entityDescriptionMaintenanceService = entityDescriptionMaintenanceService; } public CodeSystemVersionReadService getCodeSystemVersionReadService() { return codeSystemVersionReadService; } public void setCodeSystemVersionReadService( CodeSystemVersionReadService codeSystemVersionReadService) { this.codeSystemVersionReadService = codeSystemVersionReadService; } public CodeSystemVersionNameResolver getCodeSystemVersionNameResolver() { return codeSystemVersionNameResolver; } public void setCodeSystemVersionNameResolver( CodeSystemVersionNameResolver codeSystemVersionNameResolver) { this.codeSystemVersionNameResolver = codeSystemVersionNameResolver; } public EntityDescriptionValidator getEntityDescriptionValidator() { return entityDescriptionValidator; } public void setEntityDescriptionValidator( EntityDescriptionValidator entityDescriptionValidator) { this.entityDescriptionValidator = entityDescriptionValidator; } }