/* * 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 java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import edu.mayo.cts2.framework.model.command.Page; import edu.mayo.cts2.framework.model.conceptdomainbinding.ConceptDomainBinding; import edu.mayo.cts2.framework.model.conceptdomainbinding.ConceptDomainBindingDirectory; import edu.mayo.cts2.framework.model.conceptdomainbinding.ConceptDomainBindingList; import edu.mayo.cts2.framework.model.conceptdomainbinding.ConceptDomainBindingMsg; import edu.mayo.cts2.framework.model.core.Message; import edu.mayo.cts2.framework.model.extension.LocalIdConceptDomainBinding; import edu.mayo.cts2.framework.model.service.core.Query; import edu.mayo.cts2.framework.model.service.exception.UnknownConceptDomainBinding; import edu.mayo.cts2.framework.model.util.ModelUtils; import edu.mayo.cts2.framework.service.command.restriction.ConceptDomainBindingQueryServiceRestrictions; import edu.mayo.cts2.framework.service.profile.conceptdomainbinding.ConceptDomainBindingMaintenanceService; import edu.mayo.cts2.framework.service.profile.conceptdomainbinding.ConceptDomainBindingQuery; import edu.mayo.cts2.framework.service.profile.conceptdomainbinding.ConceptDomainBindingQueryService; import edu.mayo.cts2.framework.service.profile.conceptdomainbinding.ConceptDomainBindingReadService; import edu.mayo.cts2.framework.service.profile.conceptdomainbinding.name.ConceptDomainBindingReadId; 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.ConceptDomainBindingQueryBuilder; /** * The Class ConceptDomainBindingController. * * @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a> */ @Controller public class ConceptDomainBindingController extends AbstractMessageWrappingController { @Cts2Service private ConceptDomainBindingReadService conceptDomainBindingReadService; @Cts2Service private ConceptDomainBindingQueryService conceptDomainBindingQueryService; @Cts2Service private ConceptDomainBindingMaintenanceService conceptDomainBindingMaintenanceService; private final static UrlTemplateBinder<LocalIdConceptDomainBinding> URL_BINDER = new UrlTemplateBinder<LocalIdConceptDomainBinding>(){ @Override public Map<String,String> getPathValues(LocalIdConceptDomainBinding resource) { Map<String,String> returnMap = new HashMap<String,String>(); returnMap.put(VAR_CONCEPTDOMAINBINDINGID, resource.getLocalID()); returnMap.put(VAR_CONCEPTDOMAINID, resource.getResource().getBindingFor().getContent()); return returnMap; } }; private final static MessageFactory<LocalIdConceptDomainBinding> MESSAGE_FACTORY = new MessageFactory<LocalIdConceptDomainBinding>() { @Override public Message createMessage(LocalIdConceptDomainBinding resource) { ConceptDomainBindingMsg msg = new ConceptDomainBindingMsg(); msg.setConceptDomainBinding(resource.getResource()); return msg; } }; /** * Creates the concept domain binding. * * @param httpServletRequest the http servlet request * @param conceptDomainBinding the concept domain binding * @param changeseturi the changeseturi * @param codeSystemName the code system name * @param conceptDomainBindingName the concept domain binding name * @return */ @RequestMapping(value=PATH_CONCEPTDOMAINBINDING, method=RequestMethod.POST) public Object createConceptDomainBinding( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ConceptDomainBinding conceptDomainBinding, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi) { return this.doCreate( httpServletResponse, conceptDomainBinding, changeseturi, PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID, URL_BINDER, this.conceptDomainBindingMaintenanceService); } @RequestMapping(value=PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID, method=RequestMethod.PUT) public Object updateConceptDomainBinding( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ConceptDomainBinding conceptDomainBinding, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomainName, @PathVariable(VAR_CONCEPTDOMAINBINDINGID) String conceptDomainBindingLocalId, @RequestParam(value=PARAM_CHANGESETCONTEXT, required=false) String changeseturi) { return this.doUpdate( httpServletResponse, new LocalIdConceptDomainBinding(conceptDomainBindingLocalId, conceptDomainBinding), changeseturi, new ConceptDomainBindingReadId( conceptDomainBindingLocalId, ModelUtils.nameOrUriFromName(conceptDomainName)), this.conceptDomainBindingMaintenanceService); } @RequestMapping(value=PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID, method=RequestMethod.DELETE) public Object deleteConceptDomainBinding( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomainName, @PathVariable(VAR_CONCEPTDOMAINBINDINGID) String conceptDomainBindingLocalId, @RequestParam(PARAM_CHANGESETCONTEXT) String changeseturi) { ConceptDomainBindingReadId id = new ConceptDomainBindingReadId( conceptDomainBindingLocalId, ModelUtils.nameOrUriFromName(conceptDomainName)); return this.doDelete( httpServletResponse, id, changeseturi, this.conceptDomainBindingMaintenanceService); } /** * Gets the concept domain bindings of concept domain. * * @param httpServletRequest the http servlet request * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param conceptDomainName the concept domain name * @return the concept domain bindings of concept domain */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS_OF_CONCEPTDOMAIN}, method=RequestMethod.GET) public Object getConceptDomainBindingsOfConceptDomain( HttpServletRequest httpServletRequest, RestReadContext restReadContext, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomain) { return this.getConceptDomainBindingsOfConceptDomain( httpServletRequest, restReadContext, null, restrictions, restFilter, page, list, conceptDomain); } /** * Gets the concept domain bindings of concept domain. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @param conceptDomainName the concept domain name * @return the concept domain bindings of concept domain */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS_OF_CONCEPTDOMAIN}, method=RequestMethod.POST) public Object getConceptDomainBindingsOfConceptDomain( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @RequestBody Query query, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomain) { restrictions.setConceptDomain(ModelUtils.nameOrUriFromEither(conceptDomain)); return this.getConceptDomainBindings( httpServletRequest, restReadContext, query, restrictions, restFilter, page, list); } /** * Does concept domain binding exist. * * @param httpServletResponse the http servlet response * @param conceptDomainName the concept domain name * @param conceptDomainBindingName the concept domain binding name */ @RequestMapping(value=PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID, method=RequestMethod.HEAD) public void doesConceptDomainBindingExist( HttpServletResponse httpServletResponse, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomainName, @PathVariable(VAR_CONCEPTDOMAINBINDINGID) String conceptDomainBindingName) { //TODO: } /** * Gets the concept domain bindings of code system count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param conceptDomainName the concept domain name * @return the concept domain bindings of code system count */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS_OF_CONCEPTDOMAIN}, method=RequestMethod.HEAD) public void getConceptDomainBindingsOfConceptDomainCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomain) { restrictions.setConceptDomain(ModelUtils.nameOrUriFromEither(conceptDomain)); this.getConceptDomainBindingsCount( httpServletResponse, restReadContext, restrictions, restFilter); } /** * Gets the concept domain bindings. * * @param httpServletRequest the http servlet request * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @return the concept domain bindings */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS}, method=RequestMethod.GET) public Object getConceptDomainBindings( HttpServletRequest httpServletRequest, RestReadContext restReadContext, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { return this.getConceptDomainBindings( httpServletRequest, restReadContext, null, restrictions, restFilter, page, list); } /** * Gets the concept domain bindings. * * @param httpServletRequest the http servlet request * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @param page the page * @return the concept domain bindings */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS}, method=RequestMethod.POST) public Object getConceptDomainBindings( HttpServletRequest httpServletRequest, RestReadContext restReadContext, Query query, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter, Page page, boolean list) { ConceptDomainBindingQueryBuilder builder = this.getNewResourceQueryBuilder(); ConceptDomainBindingQuery resourceQuery = builder. addQuery(query). addRestFilter(restFilter). addRestReadContext(restReadContext). build(); return this.doQuery( httpServletRequest, list, this.conceptDomainBindingQueryService, resourceQuery, page, null,//TODO: Sort not yet supported ConceptDomainBindingDirectory.class, ConceptDomainBindingList.class); } /** * Gets the concept domain bindings count. * * @param httpServletResponse the http servlet response * @param query the query * @param restrictions the restrictions * @param resolvedFilter the filter * @return the concept domain bindings count */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDINGS}, method=RequestMethod.HEAD) public void getConceptDomainBindingsCount( HttpServletResponse httpServletResponse, RestReadContext restReadContext, ConceptDomainBindingQueryServiceRestrictions restrictions, RestFilter restFilter) { ConceptDomainBindingQueryBuilder builder = this.getNewResourceQueryBuilder(); ConceptDomainBindingQuery resourceQuery = builder. addRestFilter(restFilter). addRestReadContext(restReadContext). build(); int count = this.conceptDomainBindingQueryService.count(resourceQuery); this.setCount(count, httpServletResponse); } /** * Gets the concept domain binding by name. * * @param httpServletRequest the http servlet request * @param conceptDomainName the concept domain name * @param conceptDomainBindingName the concept domain binding name * @return * @return the concept domain binding by name */ @RequestMapping(value={ PATH_CONCEPTDOMAINBINDING_BYURI }, method=RequestMethod.GET) public ModelAndView getConceptDomainBindingByUri( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @RequestParam(PARAM_URI) String uri, @RequestParam(value="redirect", defaultValue=DEFAULT_REDIRECT) boolean redirect) { ConceptDomainBindingReadId id = new ConceptDomainBindingReadId(uri); return this.doReadByUri( httpServletRequest, MESSAGE_FACTORY, PATH_CONCEPTDOMAINBINDING_BYURI, PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID, URL_BINDER, this.conceptDomainBindingReadService, restReadContext, UnknownConceptDomainBinding.class, id, redirect); } @RequestMapping(value={ PATH_CONCEPTDOMAINBINDING_OF_CONCEPTDOMAIN_BYID }, method=RequestMethod.GET) public Object getConceptDomainBindingByLocalId( HttpServletRequest httpServletRequest, RestReadContext restReadContext, @PathVariable(VAR_CONCEPTDOMAINID) String conceptDomainName, @PathVariable(VAR_CONCEPTDOMAINBINDINGID) String bindingLocalId) { ConceptDomainBindingReadId id = new ConceptDomainBindingReadId( bindingLocalId, ModelUtils.nameOrUriFromName(conceptDomainName)); return this.doRead( httpServletRequest, MESSAGE_FACTORY, this.conceptDomainBindingReadService, restReadContext, UnknownConceptDomainBinding.class, id); } @InitBinder public void initConceptDomainBindingRestrictionBinder( WebDataBinder binder, @RequestParam(value=PARAM_CONCEPTDOMAIN, required=false) String conceptdomain) { if(binder.getTarget() instanceof ConceptDomainBindingQueryServiceRestrictions){ ConceptDomainBindingQueryServiceRestrictions restrictions = (ConceptDomainBindingQueryServiceRestrictions) binder.getTarget(); if(StringUtils.isNotBlank(conceptdomain)){ restrictions.setConceptDomain(ModelUtils.nameOrUriFromEither(conceptdomain)); } } } private ConceptDomainBindingQueryBuilder getNewResourceQueryBuilder(){ return new ConceptDomainBindingQueryBuilder( this.conceptDomainBindingQueryService, this.getFilterResolver(), this.getReadContextResolver()); } }