package com.muzima.controller; import android.util.Log; import com.muzima.api.model.FormTemplate; import com.muzima.api.model.Provider; import com.muzima.api.service.ProviderService; import com.muzima.service.HTMLProviderParser; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class ProviderController { public static final String TAG = "ProviderController"; private ProviderService providerService; public List<Provider> newProviders = new ArrayList<Provider>(); public ProviderController(ProviderService providerService){ this.providerService = providerService; } public List<Provider> downloadProviderFromServerByName(String name) throws ProviderDownloadException { try { return providerService.downloadProvidersByName(name); } catch (IOException e) { Log.e(TAG, "Error while searching for patients in the server", e); throw new ProviderDownloadException(e); } } public List<Provider> downloadProvidersFromServerByName(List<String> names) throws ProviderDownloadException { HashSet<Provider> result = new HashSet<Provider>(); for (String name : names) { List<Provider> providers = downloadProviderFromServerByName(name); result.addAll(providers); } return new ArrayList<Provider>(result); } public Provider downloadProviderFromServerByUuid(String uuid) throws ProviderDownloadException { try { return providerService.downloadProviderByUuid(uuid); } catch (IOException e) { Log.e(TAG, "Error while downloading provider from the server", e); throw new ProviderDownloadException(e); } } public List<Provider> downloadProvidersFromServerByUuid(String[] uuids) throws ProviderDownloadException { HashSet<Provider> result = new HashSet<>(); try { for(String uuid : uuids) { Provider provider = providerService.downloadProviderByUuid(uuid); if(provider != null) result.add(provider); } } catch (IOException e) { Log.e(TAG, "Error while downloading providers from the server", e); throw new ProviderDownloadException(e); } return new ArrayList<>(result); } public List<Provider> getAllProviders() throws ProviderLoadException { try { return providerService.getAllProviders(); } catch (IOException e) { throw new ProviderLoadException(e); } } public void saveProvider(Provider provider) throws ProviderSaveException { try { providerService.saveProvider(provider); } catch (IOException e) { Log.e(TAG, "Error while saving the provider : " + provider.getUuid(), e); throw new ProviderSaveException(e); } } public void saveProviders(List<Provider> providers) throws ProviderSaveException { try { providerService.saveProviders(providers); } catch (IOException e) { throw new ProviderSaveException(e); } } public Provider getProviderByUuid(String uuid) throws ProviderLoadException { try { return providerService.getProviderByUuid(uuid); } catch (IOException e) { throw new ProviderLoadException(e); } } public Provider getProviderByName(String name) throws ProviderLoadException { try { List<Provider> providers = providerService.getProvidersByName(name); for (Provider provider : providers) { if (provider.getName().equals(name)) { return provider; } } } catch (IOException e) { throw new ProviderLoadException(e); } catch (org.apache.lucene.queryParser.ParseException e) { throw new ProviderLoadException(e); } return null; } public void deleteProvider(Provider provider) throws ProviderDeleteException { try { providerService.deleteProvider(provider); } catch (IOException e) { throw new ProviderDeleteException(e); } } public void deleteProviders(List<Provider> providers) throws ProviderDeleteException { try { providerService.deleteProviders(providers); } catch (IOException e) { throw new ProviderDeleteException(e); } } public Provider downloadProviderBySystemId(String systemId) throws ProviderLoadException { try { return providerService.downloadProvidersBySystemId(systemId); } catch (IOException e) { throw new ProviderLoadException(e); } } public Provider getProviderBySystemId(String systemId) { try { return providerService.getProviderBySystemId(systemId); } catch (IOException e) { throw new RuntimeException(e); } } public List<Provider> getRelatedProviders(List<FormTemplate> formTemplates, String systemId) throws ProviderDownloadException, ProviderLoadException { HashSet<Provider> providers = new HashSet<Provider>(); HTMLProviderParser htmlParserUtils = new HTMLProviderParser(); for (FormTemplate formTemplate : formTemplates) { List<String> names = new ArrayList<String>(); if (formTemplate.isHTMLForm()) { names = htmlParserUtils.parse(formTemplate.getHtml()); } else { // names = xmlParserUtils.parse(formTemplate.getModelXml()); } providers.addAll(downloadProvidersFromServerByName(names)); } //Download the provider data in to local repo for logged in user Provider loggedInProvider = downloadProviderBySystemId(systemId); if(loggedInProvider != null){ providers.add(downloadProviderBySystemId(systemId)); } return new ArrayList<Provider>(providers); } public Provider getLoggedInProvider(String systemId) throws ProviderLoadException{ return downloadProviderBySystemId(systemId); } public void newProviders(List<Provider> providers) throws ProviderLoadException { if(providers!=null && !providers.isEmpty()) { newProviders = providers; List<Provider> savedProviders = getAllProviders(); newProviders.removeAll(savedProviders); } } public List<Provider> newProviders() { return newProviders; } public void deleteAllProviders() throws ProviderDeleteException, ProviderLoadException { deleteProviders(getAllProviders()); } public static class ProviderSaveException extends Throwable { public ProviderSaveException(Throwable throwable) { super(throwable); } } public static class ProviderDownloadException extends Throwable { public ProviderDownloadException(Throwable throwable) { super(throwable); } } public static class ProviderLoadException extends Throwable { public ProviderLoadException(Throwable e) { super(e); } } public static class ProviderDeleteException extends Throwable { public ProviderDeleteException(Throwable e) { super(e); } } }