package com.feisystems.provider.web.controller; import static com.feisystems.provider.service.ProviderService.SEARCH_STRING; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import com.feisystems.provider.service.ProviderService; import com.feisystems.provider.service.dto.ProviderDto; import com.feisystems.provider.service.dto.ProvidersDto; import com.feisystems.provider.web.util.URLArgument; import com.feisystems.provider.web.util.URLArgument.URLHelper; /** * Spring wired Controller serving as the remote calling layer for the Provider * RESTful Service. * * URLs for this service are constructed generally as * /<i>context-root</i><b>/providers/</b><i>name1</i><b>/</b><i>value1</i> * <b>/</ * b><i>name2</i><b>/</b><i>value2</i>...<i>name6</i><b>/</b><i>value6</i>. The * <i>value{n}</i> search parameters match on upper and lower case and should * generally be given in lower case. The number of specified parameters is * optional and could be 0-6. In the case where the number of specified * parameters is 0, the following URLs are possible: * * <ul> * <li>/<i>context-root</i><b>/providers/</b><i>npi</i> - returns a single * provider with unique NPI. * </ul> * * @see com.feisystems.provider.domain.web.util.URLArgument * com.feisystems.provider.domain.web.util.URLArgument * @see <a href="http://www.springsource.org/">Spring Framework</a> * */ @Controller public class ProviderController { @Autowired private ProviderService providerService; /** The logger. */ final Logger logger = LoggerFactory.getLogger(this.getClass()); @RequestMapping(value = "/index}}", method = RequestMethod.GET) public String getProvider() { return "index"; } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{npi}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProviderDto findProviderByNPI( @PathVariable("pageNumber") String pageNumber, @PathVariable("npi") String npi) { // FIXME (AO) return providerService.getProvider(npi); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/city/{city}/usstate/{usstate}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto findbyCityAndState( @PathVariable("pageNumber") String pageNumber, @PathVariable("city") String city, @PathVariable("usstate") String usStateAbbreviation) { return new ProvidersDto( providerService .getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( SEARCH_STRING, usStateAbbreviation, city, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, pageNumber)); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/zipcode/{zipcode}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto findbyPostalCode( @PathVariable("pageNumber") String pageNumber, @PathVariable("zipcode") String postalCode) { return new ProvidersDto( providerService .getByGenderCodeAndPostalCodeAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( SEARCH_STRING, postalCode, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, pageNumber)); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/usstate/{usstate}/city/{city}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto findbyCityAndState2( @PathVariable("pageNumber") String pageNumber, @PathVariable("usstate") String usStateAbbreviation, @PathVariable("city") String city) { return new ProvidersDto( providerService .getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( SEARCH_STRING, usStateAbbreviation, city, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, SEARCH_STRING, pageNumber)); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithOneArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithTwoArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}/{name3}/{value3}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithThreeArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, @PathVariable("name3") String name3, @PathVariable("value3") String value3, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2, name3, value3); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}/{name3}/{value3}/{name4}/{value4}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithFourArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, @PathVariable("name3") String name3, @PathVariable("value3") String value3, @PathVariable("name4") String name4, @PathVariable("value4") String value4, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2, name3, value3, name4, value4); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}/{name3}/{value3}/{name4}/{value4}/{name5}/{value5}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithFiveArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, @PathVariable("name3") String name3, @PathVariable("value3") String value3, @PathVariable("name4") String name4, @PathVariable("value4") String value4, @PathVariable("name5") String name5, @PathVariable("value5") String value5, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2, name3, value3, name4, value4, name5, value5); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}/{name3}/{value3}/{name4}/{value4}/{name5}/{value5}/{name6}/{value6}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithSixArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, @PathVariable("name3") String name3, @PathVariable("value3") String value3, @PathVariable("name4") String name4, @PathVariable("value4") String value4, @PathVariable("name5") String name5, @PathVariable("value5") String value5, @PathVariable("name6") String name6, @PathVariable("value6") String value6, HttpServletRequest request) { String methodType = getMethodType(request); String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2, name3, value3, name4, value4, name5, value5, name6, value6); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } @RequestMapping(value = "/providers/pageNumber/{pageNumber}/{name1}/{value1}/{name2}/{value2}/{name3}/{value3}/{name4}/{value4}/{name5}/{value5}/{name6}/{value6}/{name7}/{value7}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ProvidersDto searchWithSevenArguments( @PathVariable("pageNumber") String pageNumber, @PathVariable("name1") String name1, @PathVariable("value1") String value1, @PathVariable("name2") String name2, @PathVariable("value2") String value2, @PathVariable("name3") String name3, @PathVariable("value3") String value3, @PathVariable("name4") String name4, @PathVariable("value4") String value4, @PathVariable("name5") String name5, @PathVariable("value5") String value5, @PathVariable("name6") String name6, @PathVariable("value6") String value6, @PathVariable("name7") String name7, @PathVariable("value7") String value7, HttpServletRequest request) { String methodType = URLArgument.URLHelper.CITY_STATE_METHOD_TYPE; String[] args = URLArgument.createArgumentArray(methodType); fillArray(args, methodType, "pageNumber", pageNumber, name1, value1, name2, value2, name3, value3, name4, value4, name5, value5, name6, value6, name7, value7); return new ProvidersDto(executeProvidersMethod(methodType, args, isLastNameAndFacilityNameTogether(request))); } private String getMethodType(HttpServletRequest request) { String uri = request.getRequestURI(); String methodType = URLArgument.getMethodType(uri); return methodType; } private void fillArray(String[] args, String methodType, String... argPair) { int numOfArgs = argPair.length / 2; for (int inx = 0; inx < numOfArgs; inx++) { String argName = argPair[inx * 2]; String argValue = argPair[(inx * 2) + 1]; URLArgument argEnum = URLArgument.getURLArgumentInstance(argName); argEnum.fillArgument(args, methodType, argValue); } } private Map<String, Object> executeProvidersMethod(String methodType, String[] args, boolean isLastNameAndFacilityNameTogether) { if (URLHelper.CITY_STATE_METHOD_TYPE.equals(methodType)) { if (isLastNameAndFacilityNameTogether) { return providerService .getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameOrProviderOrganizationNameAndFirstNameAndEntityType( args[0], args[1], args[2], args[3], args[4], args[10], args[6], args[7], args[9]); } else { return providerService .getByGenderCodeAndUSStateAbbreviationAndCityAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); } } if (isLastNameAndFacilityNameTogether) { return providerService .getByGenderCodeAndPostalCodeAndSpecialityAndTelephoneNumberAndLastNameOrProviderOrganizationNameAndFirstNameAndEntityType( args[0], args[1], args[2], args[3], args[9], args[5], args[6], args[8]); } return providerService .getByGenderCodeAndPostalCodeAndSpecialityAndTelephoneNumberAndLastNameAndFirstNameAndEntityTypeAndProviderOrganizationName( args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); } private boolean isLastNameAndFacilityNameTogether(HttpServletRequest request) { return URLArgument.isLastNameAndFacilityNameTogether(request .getRequestURI()); } }