/******************************************************************************* * Open Behavioral Health Information Technology Architecture (OBHITA.org) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package gov.samhsa.consent2share.service.provider; import gov.samhsa.consent2share.service.dto.LookupDto; import gov.samhsa.consent2share.service.reference.StateCodeService; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; /** * The Class ProviderSearchLookupServiceImpl. */ @Transactional public class ProviderSearchLookupServiceImpl implements ProviderSearchLookupService { /** The logger. */ final Logger logger = LoggerFactory.getLogger(this.getClass()); /** The provider search url. */ String providerSearchURL; /** The state code service. */ protected StateCodeService stateCodeService; /** * Instantiates a new provider search lookup service impl. * * @param providerSearchURL * the provider search url * @param stateCodeService * the state code service */ public ProviderSearchLookupServiceImpl(String providerSearchURL, StateCodeService stateCodeService) { super(); this.providerSearchURL = providerSearchURL; this.stateCodeService = stateCodeService; } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #getProviderSearchURL() */ @Override public String getProviderSearchURL() { return providerSearchURL; } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #setProviderSearchURL(java.lang.String) */ @Override public void setProviderSearchURL(String providerSearchURL) { this.providerSearchURL = providerSearchURL; } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #providerSearch(java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String, int) */ @Override public String providerSearch(String usstate, String city, String zipcode, String gender, String specialty, String phone, String firstname, String lastname, String facilityName, int pageNumber) { // check the rule String query = generateProviderSearchURL(usstate, city, zipcode, gender, specialty, phone, firstname, lastname, facilityName, pageNumber).replace(" ", "%20"); StringBuilder output = new StringBuilder(); output.append(callProviderSearch(query)); return output.toString().replace("]}{\"providers\":[", ""); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #providerSearch(java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, int) */ @Override public String providerSearch(String usstate, String city, String zipcode, String gender, String specialty, String phone, String firstname, String lastnameOrFacilityName, int pageNumber) { // check the rule String query = generateProviderSearchURL(usstate, city, zipcode, gender, specialty, phone, firstname, lastnameOrFacilityName, pageNumber).replace(" ", "%20"); StringBuilder output = new StringBuilder(); output.append(callProviderSearch(query)); return output.toString().replace("]}{\"providers\":[", ""); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #providerSearchByNpi(java.lang.String) */ @Override public String providerSearchByNpi(String npi) { StringBuffer query = new StringBuffer(getProviderSearchURL()); query.append("/pageNumber/0/").append(npi); return callProviderSearch(query.toString()); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #callProviderSearch(java.lang.String) */ @Override public String callProviderSearch(String query) { StringBuilder output = new StringBuilder(); try { URL queryURL; queryURL = new URL(query); logger.info("Start calling " + queryURL + "..."); URLConnection urlConnection = queryURL.openConnection(); logger.info("Success."); BufferedReader in = new BufferedReader(new InputStreamReader( urlConnection.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) output.append(inputLine); in.close(); } catch (Exception e) { logger.warn("Error while calling provider search..."); logger.warn("The exception is", e); } return output.toString(); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #generateProviderSearchURL(java.lang.String, java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String) */ @Override public String generateProviderSearchURL(String usstate, String city, String zipcode, String gender, String specialty, String phone, String firstname, String lastname, String facilityName, int pageNumber) { StringBuffer query = new StringBuffer(getProviderSearchURL()); query.append("/pageNumber/").append(pageNumber); if (usstate != null) query.append("/usstate/").append(usstate); if (city != null) query.append("/city/").append(city); if (zipcode != null) query.append("/zipcode/").append(zipcode); if (gender != null) query.append("/gender/").append(gender); if (specialty != null) query.append("/specialty/").append(specialty); if (phone != null) query.append("/phone/").append(phone); if (firstname != null) query.append("/firstname/").append(firstname); if (lastname != null) query.append("/lastname/").append(lastname); if (facilityName != null) query.append("/facilityname/").append(facilityName); return query.toString(); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #generateProviderSearchURL(java.lang.String, java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String, int) */ @Override public String generateProviderSearchURL(String usstate, String city, String zipcode, String gender, String specialty, String phone, String firstname, String lastnameOrFacilityName, int pageNumber) { StringBuffer query = new StringBuffer(getProviderSearchURL()); query.append("/pageNumber/").append(pageNumber); if (usstate != null) query.append("/usstate/").append(usstate); if (city != null) query.append("/city/").append(city); if (zipcode != null) query.append("/zipcode/").append(zipcode); if (gender != null) query.append("/gender/").append(gender); if (specialty != null) query.append("/specialty/").append(specialty); if (phone != null) query.append("/phone/").append(phone); if (firstname != null) query.append("/firstname/").append(firstname); if (lastnameOrFacilityName != null) query.append("/lastnameOrFacilityName/").append( lastnameOrFacilityName); return query.toString(); } /* * (non-Javadoc) * * @see * gov.samhsa.consent2share.service.provider.ProviderSearchLookupService * #isValidatedSearch(java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String) */ @Override public boolean isValidatedSearch(String usstate, String city, String zipcode, String gender, String specialty, String phone, String firstname, String lastname, String facilityName) { boolean validateCall = true; if (usstate == null && city == null && zipcode == null && phone == null && specialty == null && firstname == null && lastname == null && gender == null) validateCall = false; if (usstate != null && zipcode != null) validateCall = false; if (usstate != null) { if (usstate.matches("[a-zA-Z][a-zA-Z]") == true) { // Get a list of all valid US states from database via // stateCodeService service List<LookupDto> stateCodes = stateCodeService .findAllStateCodes(); boolean isValidStateCode = false; // Loop through list of valid state codes and check if usstate // value // matches a valid state for (LookupDto stateCode : stateCodes) { if (usstate.compareToIgnoreCase(stateCode.getCode()) == 0) { isValidStateCode = true; break; } } // If no state in the list matched the input value for usstate, // then // set validateCall to false if (isValidStateCode != true) { validateCall = false; } } else validateCall = false; } if (city != null && city.length() < 3) validateCall = false; if (zipcode != null && zipcode.length() < 5) validateCall = false; if (specialty != null && specialty.length() < 3) validateCall = false; if (phone != null && phone.length() != 10) validateCall = false; if (firstname != null && firstname.length() < 2) validateCall = false; if (lastname != null && lastname.length() < 2) validateCall = false; if (city != null && usstate == null) validateCall = false; return validateCall; } }