/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.dlect.controller.provider;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException;
import org.dlect.controller.MainController;
import org.dlect.controller.helper.Initilisable;
import org.dlect.events.Event;
import org.dlect.events.EventListener;
import org.dlect.logging.ProviderLogger;
import org.dlect.model.Database;
import org.dlect.model.Database.DatabaseEventID;
import org.dlect.model.helper.CommonSettingNames;
import org.dlect.provider.WrappedProvider;
import org.dlect.provider.loader.ProviderDetail;
import org.dlect.provider.loader.ProviderLoader;
/**
*
* @author lee
*/
public class ProviderHelper implements EventListener, Initilisable {
private final MainController mc;
private final ProviderLoader pl;
private WrappedProvider provider;
private ProviderDetail providerDetail;
public ProviderHelper(MainController mc) {
this.mc = mc;
this.pl = new ProviderLoader();
}
@Override
public void init() {
updateProvider();
this.mc.addListener(this, Database.class);
}
@Override
public void processEvent(Event e) {
// TODO(Later) add checks for username change.
if (e.getEventID().equals(DatabaseEventID.SETTING)) {
Object after = e.getAfter();
if (after instanceof Entry) {
Entry<?, ?> newSetting = (Entry<?, ?>) after;
if (CommonSettingNames.PROVIDER_CODE.equals(newSetting.getKey())) {
updateProvider();
}
}
}
}
public List<ProviderDetail> getProviders() {
return pl.getProviders();
}
protected void updateProvider() {
Database db = mc.getDatabaseHandler().getDatabase();
if (db == null) {
// Can't do a thing with it.
provider = null;
return;
}
String providerCode = db.getSetting(CommonSettingNames.PROVIDER_CODE);
if (providerCode == null || providerCode.isEmpty()) {
// No code, so don't try.
provider = null;
return;
}
List<ProviderDetail> detail = this.pl.getProviders();
ProviderDetail pd = null;
for (ProviderDetail p : detail) {
if (p.getCode().equals(providerCode)) {
pd = p;
break;
}
}
if (pd == null) {
provider = null;
return;
}
providerDetail = pd;
try {
provider = this.pl.loadProvider(pd, db, mc.getFileController());
} catch (ExecutionException ex) {
ProviderLogger.LOGGER.error("Failed to load provider for detail:" + pd, ex);
provider = null;
}
}
public WrappedProvider getProvider() {
return provider;
}
public ProviderDetail getProviderDetail() {
if (provider == null) {
return null;
}
return providerDetail;
}
}