package br.com.etyllica.core.context.load;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import br.com.etyllica.core.context.Context;
/**
*
* @author yuripourre
*
*/
public class ApplicationLoader {
private Loader loader = new Loader();
private Updater updater = new Updater();
private Context application;
private LoaderListener listener;
private DefaultLoadApplication loadApplication;
private boolean called = false;
private ScheduledExecutorService loadExecutor;
private Future<?> future;
private static final int UPDATE_INTERVAL = 50;
private String lastText = "";
private float lastLoading = 0;
public ApplicationLoader(int w, int h) {
super();
loadApplication = new GenericLoadApplication(0, 0, w, h);
loadApplication.load();
}
public void loadApplication() {
lastText = "";
lastLoading = 0;
loadExecutor = Executors.newScheduledThreadPool(2);
future = loadExecutor.submit(loader);
loadExecutor.scheduleAtFixedRate(updater, UPDATE_INTERVAL, UPDATE_INTERVAL, TimeUnit.MILLISECONDS);
}
private class Loader implements Runnable {
public void run() {
called = false;
application.startLoad();
called = true;
}
}
private class Updater implements Runnable {
public void run() {
if(!called) {
if(!application.isLoaded()) {
notifyTextChanged();
notifyLoadingChanged();
getError();
}
} else {
//Notify window
finishLoading();
}
}
}
private void notifyTextChanged() {
String info = application.getLoadingInfo();
if(!lastText.equals(info)) {
lastText = info;
loadApplication.onChangeText(info);
}
}
private void notifyLoadingChanged() {
float loading = application.getLoading();
if(lastLoading != loading) {
lastLoading = loading;
loadApplication.onChangeLoad(loading);
}
}
protected void getError() {
try {
future.get(UPDATE_INTERVAL/2, TimeUnit.MILLISECONDS);
} catch (ExecutionException e) {
Throwable cause = e.getCause();
cause.printStackTrace();
finishLoading();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
//Ignore the Timeout Exception
//e.printStackTrace();
}
}
private void finishLoading() {
listener.onLoad(application);
}
private void checkForLoadApplication(Context context) {
DefaultLoadApplication loadApp = context.getLoadApplication();
if(loadApp != null) {
this.loadApplication = loadApp;
}
}
public DefaultLoadApplication reloadApplication(LoaderListener listener, Context context) {
context.setLoaded(false);
checkForLoadApplication(context);
this.listener = listener;
this.application = context;
loadApplication.load();
loadApplication.setLoaded(true);
loadApplication();
return loadApplication;
}
}