Java tutorial
/* * 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; } }