/* * 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.model.command.Page; import edu.mayo.cts2.framework.model.core.Message; import edu.mayo.cts2.framework.model.core.VersionTagReference; import edu.mayo.cts2.framework.model.extension.LocalIdValueSetDefinition; import edu.mayo.cts2.framework.model.service.core.Query; import edu.mayo.cts2.framework.model.service.exception.UnknownValueSetDefinition; import edu.mayo.cts2.framework.model.util.ModelUtils; import edu.mayo.cts2.framework.model.valuesetdefinition.ValueSetDefinition; import edu.mayo.cts2.framework.model.valuesetdefinition.ValueSetDefinitionDirectory; import edu.mayo.cts2.framework.model.valuesetdefinition.ValueSetDefinitionList; import edu.mayo.cts2.framework.model.valuesetdefinition.ValueSetDefinitionMsg; import edu.mayo.cts2.framework.service.command.restriction.ValueSetDefinitionQueryServiceRestrictions; import edu.mayo.cts2.framework.service.profile.valuesetdefinition.ValueSetDefinitionMaintenanceService; import edu.mayo.cts2.framework.service.profile.valuesetdefinition.ValueSetDefinitionQuery; import edu.mayo.cts2.framework.service.profile.valuesetdefinition.ValueSetDefinitionQueryService; import edu.mayo.cts2.framework.service.profile.valuesetdefinition.ValueSetDefinitionReadService; import edu.mayo.cts2.framework.service.profile.valuesetdefinition.name.ValueSetDefinitionReadId; import edu.mayo.cts2.framework.webapp.naming.TagResolver; 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.ValueSetDefinitionQueryBuilder; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.util.UrlPathHelper; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; /** * The Class ValueSetDefinitionController. * * @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a> */ @Controller public class ValueSetDefinitionController extends AbstractMessageWrappingController { @Cts2Service private ValueSetDefinitionQueryService valueSetDefinitionQueryService; @Cts2Service private ValueSetDefinitionReadService valueSetDefinitionReadService; @Cts2Service private ValueSetDefinitionMaintenanceService valueSetDefinitionMaintenanceService; @Resource private TagResolver tagResolver; private final static UrlTemplateBinder<LocalIdValueSetDefinition> URL_BINDER = new UrlTemplateBinder<LocalIdValueSetDefinition>(){ @Override public Map<String,String> getPathValues(LocalIdValueSetDefinition resource) { Map<String,String> returnMap = new HashMap<String,String>(); returnMap.put(VAR_VALUESETID, resource.getResource().getDefinedValueSet().getContent()); returnMap.put(VAR_VALUESETDEFINITIONID, resource.getLocalID()); return returnMap; } }; final static MessageFactory<LocalIdValueSetDefinition> MESSAGE_FACTORY = new MessageFactory<LocalIdValueSetDefinition>() { @Override public Message createMessage(LocalIdValueSetDefinition resource) { ValueSetDefinitionMsg msg = new ValueSetDefinitionMsg(); msg.setValueSetDefinition(resource.getResource()); return msg; } }; /** * Gets the value set definitions of value set. * * @param httpServletRequest the http servlet request * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param valueSetName the value set name * @return the value set definitions of value set */ @RequestMapping(value={ PATH_VALUESETDEFINITIONS_OF_VALUESET}, method=RequestMethod.GET) public Object getValueSetDefinitionsOfValueSet( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_VALUESETID) String valueSet) { return this.getValueSetDefinitionsOfValueSet( httpServletRequest, restReadContext, queryControl, null, restrictions, restFilter, page, list, valueSet); } /** * Gets the value set definitions of value set. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param valueSetName the value set name * @return the value set definitions of value set */ @RequestMapping(value={ PATH_VALUESETDEFINITIONS_OF_VALUESET}, method=RequestMethod.POST) public Object getValueSetDefinitionsOfValueSet( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @RequestBody Query query, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_VALUESETID) String valueSet) { restrictions.setValueSet(ModelUtils.nameOrUriFromEither(valueSet)); return this.getValueSetDefinitions( httpServletRequest, restReadContext, queryControl, query, restrictions, restFilter, page, list); } /** * Does value set definition exist. * * @param httpServletResponse the http servlet response * @param valueSetName the value set name * @param valueSetDefinitionDocumentUri the value set definition document uri */ @RequestMapping(value=PATH_VALUESETDEFINITION_OF_VALUESET_BYID, method=RequestMethod.HEAD) @ResponseBody public void doesValueSetDefinitionExist( HttpServletResponse httpServletResponse, @PathVariable(VAR_VALUESETID) String valueSetName, @PathVariable(VAR_VALUESETDEFINITIONID) String valueSetDefinitionDocumentUri) { // } /** * Gets the value set definitions of value set count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param valueSetName the value set name * @return the value set definitions of value set count */ @RequestMapping(value={ PATH_VALUESETDEFINITIONS_OF_VALUESET}, method=RequestMethod.HEAD) @ResponseBody public void getValueSetDefinitionsOfValueSetCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter, @PathVariable(VAR_VALUESETID) String valueSet) { restrictions.setValueSet(ModelUtils.nameOrUriFromEither(valueSet)); this.getValueSetDefinitionsCount( httpServletResponse, restReadContext, restrictions, restFilter); } @RequestMapping(value={ PATH_VALUESETDEFINITIONS}, method=RequestMethod.GET) public Object getValueSetDefinitions( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { return this.getValueSetDefinitions( httpServletRequest, restReadContext, queryControl, null, restrictions, restFilter, page, list); } /** * Gets the value set definitions. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @return the value set definitions */ @RequestMapping(value={ PATH_VALUESETDEFINITIONS}, method=RequestMethod.POST) public Object getValueSetDefinitions( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @RequestBody Query query, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { ValueSetDefinitionQueryBuilder builder = this.getNewResourceQueryBuilder(); ValueSetDefinitionQuery resourceQuery = builder. addQuery(query). addRestFilter(restFilter). addRestrictions(restrictions). addRestReadContext(restReadContext). build(); return this.doQuery( httpServletRequest, list, this.valueSetDefinitionQueryService, resourceQuery, page, queryControl, ValueSetDefinitionDirectory.class, ValueSetDefinitionList.class); } /** * Gets the value set definitions count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @return the value set definitions count */ @RequestMapping(value={ PATH_VALUESETDEFINITIONS}, method=RequestMethod.HEAD) @ResponseBody public void getValueSetDefinitionsCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, ValueSetDefinitionQueryServiceRestrictions restrictions, RestFilter restFilter) { ValueSetDefinitionQueryBuilder builder = this.getNewResourceQueryBuilder(); ValueSetDefinitionQuery resourceQuery = builder. addRestFilter(restFilter). addRestrictions(restrictions). addRestReadContext(restReadContext). build(); int count = this.valueSetDefinitionQueryService.count(resourceQuery); this.setCount(count, httpServletResponse); } /** * Gets the value set definition by name. * * @param httpServletRequest the http servlet request * @param valueSetName the value set name * @param valueSetDefinitionDocumentUri the value set definition document uri * @return the value set definition by name */ @RequestMapping(value={ PATH_VALUESETDEFINITION_BYURI }, method=RequestMethod.GET) public ModelAndView getValueSetDefinitionByUri( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @RequestParam(PARAM_URI) String uri, @RequestParam(value="redirect", defaultValue=DEFAULT_REDIRECT) boolean redirect) { ValueSetDefinitionReadId id = new ValueSetDefinitionReadId(uri); return this.doReadByUri( httpServletRequest, MESSAGE_FACTORY, PATH_VALUESETDEFINITION_BYURI, PATH_VALUESETDEFINITION_OF_VALUESET_BYID, URL_BINDER, this.valueSetDefinitionReadService, restReadContext, UnknownValueSetDefinition.class, id, redirect); } @RequestMapping(value={ PATH_VALUESETDEFINITION_OF_VALUESET_BYID }, method=RequestMethod.GET) public Object getValueSetDefinitionByLocalId( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @PathVariable(VAR_VALUESETID) String valueSetName, @PathVariable(VAR_VALUESETDEFINITIONID) String definitionLocalId) { ValueSetDefinitionReadId id = new ValueSetDefinitionReadId( definitionLocalId, ModelUtils.nameOrUriFromName(valueSetName)); return this.doRead( httpServletRequest, MESSAGE_FACTORY, this.valueSetDefinitionReadService, restReadContext, UnknownValueSetDefinition.class, id); } @RequestMapping(value={ PATH_VALUESETBYID + "/" + VALUE_SET_RESOLUTION_SHORT + "/" + ALL_WILDCARD, PATH_VALUESETBYID + "/" + VALUE_SET_RESOLUTION_SHORT }, method=RequestMethod.GET) public ModelAndView getValueSetDefinitionOfValueSetByTagRedirect( HttpServletRequest httpServletRequest, RestReadContext restReadContext, QueryControl queryControl, @PathVariable(VAR_VALUESETID) String valueSetName, @RequestParam(value=PARAM_TAG, defaultValue=DEFAULT_TAG) String tag, @RequestParam(value="redirect", defaultValue=DEFAULT_REDIRECT) boolean redirect) { //TODO: Accept tag URIs here VersionTagReference tagReference = new VersionTagReference(tag); String valueSetDefinitionLocalId = this.tagResolver. getVersionNameFromTag( this.valueSetDefinitionReadService, ModelUtils.nameOrUriFromName(valueSetName), tagReference, this.resolveRestReadContext(restReadContext)); String contextPath = this.getUrlPathHelper().getContextPath(httpServletRequest); String requestUri = StringUtils.removeStart(this.getUrlPathHelper().getRequestUri(httpServletRequest),contextPath); requestUri = StringUtils.removeStart(requestUri, "/"); requestUri = StringUtils.replaceOnce( requestUri, VALUESET + "/" + valueSetName + "/", VALUESET + "/" + valueSetName + "/" + VALUESETDEFINITION_SHORT + "/" + valueSetDefinitionLocalId + "/"); if(redirect){ @SuppressWarnings("unchecked") Map<String,Object> parameters = new HashMap<String,Object>(httpServletRequest.getParameterMap()); parameters.remove(PARAM_REDIRECT); return new ModelAndView( "redirect:"+ "/" + requestUri + this.mapToQueryString(parameters)); } else { return new ModelAndView( "forward:"+ "/" + requestUri); } } /** * Creates the value set definition. * * @param httpServletRequest the http servlet request * @param valueSetDefinition the value set definition * @param changeseturi the changeseturi * @param valueSetName the value set name * @param valueSetDefinitionDocumentUri the value set definition document uri */ @RequestMapping(value=PATH_VALUESETDEFINITION_OF_VALUESET_BYID, method=RequestMethod.PUT) public Object updateValueSetDefinition( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ValueSetDefinition valueSetDefinition, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi, @PathVariable(VAR_VALUESETID) String valueSetName, @PathVariable(VAR_VALUESETDEFINITIONID) String valueSetDefinitionLocalId) { return this.doUpdate( httpServletResponse, new LocalIdValueSetDefinition(valueSetDefinitionLocalId, valueSetDefinition), changeseturi, new ValueSetDefinitionReadId( valueSetDefinitionLocalId, ModelUtils.nameOrUriFromName(valueSetName)), this.valueSetDefinitionMaintenanceService); } @RequestMapping(value=PATH_VALUESETDEFINITION, method=RequestMethod.POST) public Object createValueSetDefinition( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ValueSetDefinition valueSetDefinition, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi) { return this.doCreate( httpServletResponse, valueSetDefinition, changeseturi, PATH_VALUESETDEFINITION_OF_VALUESET_BYID, URL_BINDER, this.valueSetDefinitionMaintenanceService); } @RequestMapping(value=PATH_VALUESETDEFINITION_OF_VALUESET_BYID, method=RequestMethod.DELETE) public Object deleteValueSetDefinition( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, RestReadContext restReadContext, @PathVariable(VAR_VALUESETID) String valueSetName, @PathVariable(VAR_VALUESETDEFINITIONID) String valueSetDefinitionLocalId, @RequestParam(PARAM_CHANGESETCONTEXT) String changeseturi) { ValueSetDefinitionReadId id = new ValueSetDefinitionReadId( valueSetDefinitionLocalId, ModelUtils.nameOrUriFromName(valueSetName)); return this.doDelete( httpServletResponse, id, changeseturi, this.valueSetDefinitionMaintenanceService); } private ValueSetDefinitionQueryBuilder getNewResourceQueryBuilder(){ return new ValueSetDefinitionQueryBuilder( this.valueSetDefinitionQueryService, this.getFilterResolver(), this.getReadContextResolver()); } public ValueSetDefinitionQueryService getValueSetDefinitionQueryService() { return valueSetDefinitionQueryService; } public void setValueSetDefinitionQueryService( ValueSetDefinitionQueryService valueSetDefinitionQueryService) { this.valueSetDefinitionQueryService = valueSetDefinitionQueryService; } public ValueSetDefinitionReadService getValueSetDefinitionReadService() { return valueSetDefinitionReadService; } public void setValueSetDefinitionReadService( ValueSetDefinitionReadService valueSetDefinitionReadService) { this.valueSetDefinitionReadService = valueSetDefinitionReadService; } public ValueSetDefinitionMaintenanceService getValueSetDefinitionMaintenanceService() { return valueSetDefinitionMaintenanceService; } public void setValueSetDefinitionMaintenanceService( ValueSetDefinitionMaintenanceService valueSetDefinitionMaintenanceService) { this.valueSetDefinitionMaintenanceService = valueSetDefinitionMaintenanceService; } }