edu.mayo.cts2.framework.webapp.rest.controller.MapVersionController.java Source code

Java tutorial

Introduction

Here is the source code for edu.mayo.cts2.framework.webapp.rest.controller.MapVersionController.java

Source

/*
 * 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.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.CollectionUtils;
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.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import edu.mayo.cts2.framework.model.command.Page;
import edu.mayo.cts2.framework.model.core.Message;
import edu.mayo.cts2.framework.model.directory.DirectoryResult;
import edu.mayo.cts2.framework.model.mapversion.MapVersion;
import edu.mayo.cts2.framework.model.mapversion.MapVersionDirectory;
import edu.mayo.cts2.framework.model.mapversion.MapVersionList;
import edu.mayo.cts2.framework.model.mapversion.MapVersionMsg;
import edu.mayo.cts2.framework.model.service.core.Query;
import edu.mayo.cts2.framework.model.service.core.types.RestrictionType;
import edu.mayo.cts2.framework.model.service.exception.UnknownMapVersion;
import edu.mayo.cts2.framework.model.service.mapversion.types.MapRole;
import edu.mayo.cts2.framework.model.service.mapversion.types.MapStatus;
import edu.mayo.cts2.framework.model.util.ModelUtils;
import edu.mayo.cts2.framework.service.command.restriction.MapQueryServiceRestrictions.CodeSystemRestriction;
import edu.mayo.cts2.framework.service.command.restriction.MapQueryServiceRestrictions.ValueSetRestriction;
import edu.mayo.cts2.framework.service.command.restriction.MapVersionQueryServiceRestrictions;
import edu.mayo.cts2.framework.service.command.restriction.MapVersionQueryServiceRestrictions.EntitiesRestriction;
import edu.mayo.cts2.framework.service.profile.mapversion.MapVersionHistoryService;
import edu.mayo.cts2.framework.service.profile.mapversion.MapVersionMaintenanceService;
import edu.mayo.cts2.framework.service.profile.mapversion.MapVersionQuery;
import edu.mayo.cts2.framework.service.profile.mapversion.MapVersionQueryService;
import edu.mayo.cts2.framework.service.profile.mapversion.MapVersionReadService;
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.MapVersionQueryBuilder;
import edu.mayo.cts2.framework.webapp.rest.util.ControllerUtils;

/**
 * The Class MapVersionController.
 *
 * @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a>
 */
@Controller
public class MapVersionController extends AbstractMessageWrappingController {

    @Cts2Service
    private MapVersionReadService mapVersionReadService;

    @Cts2Service
    private MapVersionQueryService mapVersionQueryService;

    @Cts2Service
    private MapVersionMaintenanceService mapVersionMaintenanceService;

    @Cts2Service
    private MapVersionHistoryService mapVersionHistoryService;

    private static UrlTemplateBinder<MapVersion> URL_BINDER = new UrlTemplateBinder<MapVersion>() {

        @Override
        public Map<String, String> getPathValues(MapVersion resource) {
            Map<String, String> returnMap = new HashMap<String, String>();
            returnMap.put(VAR_MAPVERSIONID, resource.getMapVersionName());
            returnMap.put(VAR_MAPID, resource.getVersionOf().getContent());

            return returnMap;
        }

    };

    private final static MessageFactory<MapVersion> MESSAGE_FACTORY = new MessageFactory<MapVersion>() {

        @Override
        public Message createMessage(MapVersion resource) {
            MapVersionMsg msg = new MapVersionMsg();
            msg.setMapVersion(resource);

            return msg;
        }
    };

    @RequestMapping(value = PATH_MAPVERSION_CHANGEHISTORY, method = RequestMethod.GET)
    @ResponseBody
    public MapVersionList getChangeHistory(HttpServletRequest httpServletRequest,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName,
            @RequestParam(required = false) Date PARAM_FROMDATE, @RequestParam(required = false) Date PARAM_TODATE,
            Page page) {

        DirectoryResult<MapVersion> result = this.mapVersionHistoryService
                .getChangeHistory(ModelUtils.nameOrUriFromName(mapVersionName), PARAM_FROMDATE, PARAM_TODATE);

        return this.populateDirectory(result, page, httpServletRequest, MapVersionList.class);
    }

    @RequestMapping(value = PATH_MAPVERSION_EARLIESTCHANGE, method = RequestMethod.GET)
    @ResponseBody
    public MapVersionMsg getEarliesChange(HttpServletRequest httpServletRequest,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName) {

        MapVersion result = this.mapVersionHistoryService
                .getEarliestChangeFor(ModelUtils.nameOrUriFromName(mapVersionName));

        MapVersionMsg msg = new MapVersionMsg();
        msg.setMapVersion(result);

        return this.wrapMessage(msg, httpServletRequest);
    }

    @RequestMapping(value = PATH_MAPVERSION_LATESTCHANGE, method = RequestMethod.GET)
    @ResponseBody
    public MapVersionMsg getLastChange(HttpServletRequest httpServletRequest,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName) {

        MapVersion result = this.mapVersionHistoryService
                .getLastChangeFor(ModelUtils.nameOrUriFromName(mapVersionName));

        MapVersionMsg msg = new MapVersionMsg();
        msg.setMapVersion(result);

        return this.wrapMessage(msg, httpServletRequest);
    }

    /**
     * Creates the map version.
     *
     * @param httpServletRequest the http servlet request
     * @param changeseturi the changeseturi
     * @param mapVersion the map version
     * @param mapName the map name
     * @param mapVersionName the map version name
     */
    @RequestMapping(value = PATH_MAPVERSION_OF_MAP_BYID, method = RequestMethod.PUT)
    public Object updateMapVersion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            @RequestParam(value = PARAM_CHANGESETCONTEXT, required = false) String changeseturi,
            @RequestBody MapVersion mapVersion, @PathVariable(VAR_MAPID) String mapName,
            @PathVariable(VAR_MAPVERSIONID) String mapVersionName) {

        return this.doUpdate(httpServletResponse, mapVersion, changeseturi,
                ModelUtils.nameOrUriFromName(mapVersionName), this.mapVersionMaintenanceService);
    }

    @RequestMapping(value = PATH_MAPVERSION, method = RequestMethod.POST)
    public Object createMapVersion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            @RequestParam(value = PARAM_CHANGESETCONTEXT, required = false) String changeseturi,
            @RequestBody MapVersion mapVersion) {

        return this.doCreate(httpServletResponse, mapVersion, changeseturi, PATH_MAPVERSION_OF_MAP_BYID, URL_BINDER,
                this.mapVersionMaintenanceService);
    }

    @RequestMapping(value = PATH_MAPVERSION_OF_MAP_BYID, method = RequestMethod.DELETE)
    public Object deleteMapVersion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName,
            @RequestParam(PARAM_CHANGESETCONTEXT) String changeseturi) {

        return this.doDelete(httpServletResponse, ModelUtils.nameOrUriFromName(mapVersionName), changeseturi,
                this.mapVersionMaintenanceService);
    }

    /**
     * Gets the map versions of map.
     *
     * @param httpServletRequest the http servlet request
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param page the page
     * @param mapName the map name
     * @return the map versions of map
     */
    @RequestMapping(value = { PATH_MAPVERSIONS_OF_MAP }, method = RequestMethod.GET)
    public Object getMapVersionsOfMap(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            QueryControl queryControl, MapVersionQueryServiceRestrictions restrictions, RestFilter restFilter,
            Page page, boolean list, @PathVariable(VAR_MAPID) String mapName) {

        return this.getMapVersionsOfMap(httpServletRequest, restReadContext, queryControl, null, restrictions,
                restFilter, page, list, mapName);
    }

    /**
     * Gets the map versions of map.
     *
     * @param httpServletRequest the http servlet request
     * @param query the query
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param page the page
     * @param mapName the map name
     * @return the map versions of map
     */
    @RequestMapping(value = { PATH_MAPVERSIONS_OF_MAP }, method = RequestMethod.POST)
    public Object getMapVersionsOfMap(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            QueryControl queryControl, @RequestBody Query query, MapVersionQueryServiceRestrictions restrictions,
            RestFilter restFilter, Page page, boolean list, @PathVariable(VAR_MAPID) String mapName) {

        restrictions.setMap(ModelUtils.nameOrUriFromEither(mapName));

        return this.getMapVersions(httpServletRequest, restReadContext, queryControl, query, restrictions,
                restFilter, page, list);
    }

    /**
     * Gets the map versions.
     *
     * @param httpServletRequest the http servlet request
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param page the page
     * @return the map versions
     */
    @RequestMapping(value = { PATH_MAPVERSIONS }, method = RequestMethod.GET)
    public Object getMapVersions(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            QueryControl queryControl, MapVersionQueryServiceRestrictions restrictions, RestFilter restFilter,
            Page page, boolean list) {

        return this.getMapVersions(httpServletRequest, restReadContext, queryControl, null, restrictions,
                restFilter, page, list);
    }

    /**
     * Gets the map versions.
     *
     * @param httpServletRequest the http servlet request
     * @param query the query
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param page the page
     * @return the map versions
     */
    @RequestMapping(value = { PATH_MAPVERSIONS }, method = RequestMethod.POST)
    public Object getMapVersions(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            QueryControl queryControl, @RequestBody Query query, MapVersionQueryServiceRestrictions restrictions,
            RestFilter restFilter, Page page, boolean list) {

        MapVersionQueryBuilder builder = this.getNewResourceQueryBuilder();

        MapVersionQuery resourceQuery = builder.addQuery(query).addRestFilter(restFilter)
                .addRestrictions(restrictions).addRestReadContext(restReadContext).build();

        return this.doQuery(httpServletRequest, list, this.mapVersionQueryService, resourceQuery, page,
                queryControl, MapVersionDirectory.class, MapVersionList.class);
    }

    /**
     * Does map version exist.
     *
     * @param httpServletResponse the http servlet response
     * @param mapName the map name
     * @param mapVersionName the map version name
     */
    @RequestMapping(value = PATH_MAPVERSION_OF_MAP_BYID, method = RequestMethod.HEAD)
    @ResponseBody
    public void doesMapVersionExist(HttpServletResponse httpServletResponse,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName) {

        this.doExists(httpServletResponse, this.mapVersionReadService, UnknownMapVersion.class,
                ModelUtils.nameOrUriFromName(mapVersionName));
    }

    /**
     * Gets the map versions of map count.
     *
     * @param httpServletResponse the http servlet response
     * @param query the query
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param mapId the map id
     * @return the map versions of map count
     */
    @RequestMapping(value = { PATH_MAPVERSIONS_OF_MAP }, method = RequestMethod.HEAD)
    @ResponseBody
    public void getMapVersionsOfMapCount(HttpServletResponse httpServletResponse, RestReadContext restReadContext,
            MapVersionQueryServiceRestrictions restrictions, RestFilter restFilter,
            @PathVariable(VAR_MAPID) String mapId) {

        restrictions.setMap(ModelUtils.nameOrUriFromEither(mapId));

        this.getMapVersionsCount(httpServletResponse, restReadContext, restrictions, restFilter);
    }

    /**
     * Gets the map versions count.
     *
     * @param httpServletResponse the http servlet response
     * @param query the query
     * @param restrictions the restrictions
     * @param resolvedFilter the filter
     * @param page the page
     * @return the map versions count
     */
    @RequestMapping(value = { PATH_MAPVERSIONS }, method = RequestMethod.HEAD)
    @ResponseBody
    public void getMapVersionsCount(HttpServletResponse httpServletResponse, RestReadContext restReadContext,
            MapVersionQueryServiceRestrictions restrictions, RestFilter restFilter) {

        MapVersionQueryBuilder builder = this.getNewResourceQueryBuilder();

        MapVersionQuery resourceQuery = builder.addRestFilter(restFilter).addRestrictions(restrictions)
                .addRestReadContext(restReadContext).build();

        int count = this.mapVersionQueryService.count(resourceQuery);

        this.setCount(count, httpServletResponse);
    }

    /**
     * Gets the map version by name.
     *
     * @param httpServletRequest the http servlet request
     * @param mapName the map name
     * @param mapVersionName the map version name
     * @return the map version by name
     */
    @RequestMapping(value = { PATH_MAPVERSION_OF_MAP_BYID }, method = RequestMethod.GET)
    public Object getMapVersionByName(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            @PathVariable(VAR_MAPID) String mapName, @PathVariable(VAR_MAPVERSIONID) String mapVersionName) {

        return this.doRead(httpServletRequest, MESSAGE_FACTORY, this.mapVersionReadService, restReadContext,
                UnknownMapVersion.class, ModelUtils.nameOrUriFromName(mapVersionName));
    }

    @RequestMapping(value = PATH_MAPVERSION_BYURI, method = RequestMethod.GET)
    public ModelAndView getMapVersionByUri(HttpServletRequest httpServletRequest, RestReadContext restReadContext,
            QueryControl queryControl, @RequestParam(PARAM_URI) String uri,
            @RequestParam(value = "redirect", defaultValue = DEFAULT_REDIRECT) boolean redirect) {

        return this.doReadByUri(httpServletRequest, MESSAGE_FACTORY, PATH_MAPVERSION_BYURI,
                PATH_MAPVERSION_OF_MAP_BYID, URL_BINDER, this.mapVersionReadService, restReadContext,
                UnknownMapVersion.class, ModelUtils.nameOrUriFromUri(uri), redirect);
    }

    @InitBinder
    public void initMapVersionRestrictionBinder(WebDataBinder binder,
            @RequestParam(value = PARAM_ENTITY, required = false) List<String> entity,
            @RequestParam(value = PARAM_VALUESET, required = false) List<String> valueset,
            @RequestParam(value = PARAM_CODESYSTEM, required = false) List<String> codesystem,
            @RequestParam(value = PARAM_ENTITIES_MAPROLE, required = false) MapRole entitiesmaprole,
            @RequestParam(value = PARAM_ENTITIES_MAPSTATUS, required = false) MapStatus mapstatus,
            @RequestParam(value = PARAM_ALL_OR_SOME, required = false) RestrictionType allorsome,
            @RequestParam(value = PARAM_CODESYSTEMS_MAPROLE, required = false) MapRole codesystemsmaprole,
            @RequestParam(value = PARAM_VALUESETS_MAPROLE, required = false) MapRole valuesetsmaprole) {

        if (binder.getTarget() instanceof MapVersionQueryServiceRestrictions) {
            MapVersionQueryServiceRestrictions restrictions = (MapVersionQueryServiceRestrictions) binder
                    .getTarget();

            if (CollectionUtils.isNotEmpty(entity)) {
                restrictions.setEntitiesRestriction(new EntitiesRestriction());
                restrictions.getEntitiesRestriction().setEntities(ControllerUtils.idsToEntityNameOrUriSet(entity));

                restrictions.getEntitiesRestriction().setAllOrSome(allorsome);
                restrictions.getEntitiesRestriction().setMapRole(entitiesmaprole);
                restrictions.getEntitiesRestriction().setMapStatus(mapstatus);
            }

            if (CollectionUtils.isNotEmpty(valueset)) {
                restrictions.setValueSetRestriction(new ValueSetRestriction());
                restrictions.getValueSetRestriction().setMapRole(valuesetsmaprole);
                restrictions.getValueSetRestriction().setValueSets(ControllerUtils.idsToNameOrUriSet(valueset));
            }

            if (CollectionUtils.isNotEmpty(codesystem)) {
                restrictions.setCodeSystemRestriction(new CodeSystemRestriction());
                restrictions.getCodeSystemRestriction().setMapRole(codesystemsmaprole);
                restrictions.getCodeSystemRestriction()
                        .setCodeSystems(ControllerUtils.idsToNameOrUriSet(codesystem));
            }
        }
    }

    private MapVersionQueryBuilder getNewResourceQueryBuilder() {
        return new MapVersionQueryBuilder(this.mapVersionQueryService, this.getFilterResolver(),
                this.getReadContextResolver());
    }

    public MapVersionReadService getMapVersionReadService() {
        return mapVersionReadService;
    }

    public void setMapVersionReadService(MapVersionReadService mapVersionReadService) {
        this.mapVersionReadService = mapVersionReadService;
    }

    public MapVersionQueryService getMapVersionQueryService() {
        return mapVersionQueryService;
    }

    public void setMapVersionQueryService(MapVersionQueryService mapVersionQueryService) {
        this.mapVersionQueryService = mapVersionQueryService;
    }

    public MapVersionMaintenanceService getMapVersionMaintenanceService() {
        return mapVersionMaintenanceService;
    }

    public void setMapVersionMaintenanceService(MapVersionMaintenanceService mapVersionMaintenanceService) {
        this.mapVersionMaintenanceService = mapVersionMaintenanceService;
    }

    public MapVersionHistoryService getMapVersionHistoryService() {
        return mapVersionHistoryService;
    }

    public void setMapVersionHistoryService(MapVersionHistoryService mapVersionHistoryService) {
        this.mapVersionHistoryService = mapVersionHistoryService;
    }

}