package nucleus.factory;
import java.util.HashMap;
import nucleus.presenter.Presenter;
/**
* This is the singleton where all presenters are stored.
*/
public enum PresenterStorage {
INSTANCE;
private HashMap<String, Presenter> idToPresenter = new HashMap<>();
private HashMap<Presenter, String> presenterToId = new HashMap<>();
/**
* Adds a presenter to the storage
*
* @param presenter a presenter to add
*/
public void add(final Presenter presenter) {
String id = presenter.getClass().getSimpleName() + "/" + System.nanoTime() + "/" + (int)(Math.random() * Integer.MAX_VALUE);
idToPresenter.put(id, presenter);
presenterToId.put(presenter, id);
presenter.addOnDestroyListener(new Presenter.OnDestroyListener() {
@Override
public void onDestroy() {
idToPresenter.remove(presenterToId.remove(presenter));
}
});
}
/**
* Returns a presenter by id or null if such presenter does not exist.
*
* @param id id of a presenter that has been received by calling {@link #getId(Presenter)}
* @param <P> a type of presenter
* @return a presenter or null
*/
public <P> P getPresenter(String id) {
//noinspection unchecked
return (P)idToPresenter.get(id);
}
/**
* Returns id of a given presenter.
*
* @param presenter a presenter to get id for.
* @return if of the presenter.
*/
public String getId(Presenter presenter) {
return presenterToId.get(presenter);
}
/**
* Removes all presenters from the storage.
* Use this method for testing purposes only.
*/
public void clear() {
idToPresenter.clear();
presenterToId.clear();
}
}