Add a generic instance factory to the API.

This allows storing useful objects in the registry.
This commit is contained in:
asofold 2014-07-27 15:17:08 +02:00
parent 67ac214909
commit d55cd7e4b6
3 changed files with 77 additions and 1 deletions

View File

@ -0,0 +1,42 @@
package fr.neatmonster.nocheatplus.components;
/**
* A registry for unique instances of any class type.<br>
* Currently there is no specification for what happens with registering for an
* already registered class, neither if exceptions are thrown, nor if
* dependencies will use those then.
*
* @author dev1mc
*
*/
public interface GenericInstanceRegistry {
/**
* Register the instance by its own class.
* @param instance
*/
public <T> T registerGenericInstance(T instance);
/**
* Register an instance under for a super-class. The registry implementation might specify id overriding is allowed.
* @param registerAs
* @param instance
* @return The previously registered instance. If none was registered, null is returned.
*/
public <T, TI extends T> T registerGenericInstance(Class<T> registerFor, TI instance);
/**
* Retrieve the instance registered for the given class.
* @param registeredBy
* @return The instance, or null, if none is registered.
*/
public <T> T getGenericInstance(Class<T> registeredFor);
/**
* Remove a registration. The registry implementation might specify id removing is allowed.
* @param registeredFor
* @return The previously registered instance. If none was registered, null is returned.
*/
public <T> T unregisterGenericInstance(Class<T> registeredFor);
}

View File

@ -16,7 +16,7 @@ package fr.neatmonster.nocheatplus.components;
* @author mc_dev
*
*/
public interface NoCheatPlusAPI extends ComponentRegistry<Object>, ComponentRegistryProvider, MCAccessHolder{
public interface NoCheatPlusAPI extends ComponentRegistry<Object>, ComponentRegistryProvider, GenericInstanceRegistry, MCAccessHolder {
/**
* By default addComponent(Object) will register ComponentFactories as well.

View File

@ -137,6 +137,9 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
/** The event listeners. */
private final List<Listener> listeners = new ArrayList<Listener>();
/** Storage for generic instances registration. */
private final Map<Class<?>, Object> genericInstances = new HashMap<Class<?>, Object>();
/** Components that need notification on reloading.
* (Kept here, for if during runtime some might get added.)*/
private final List<INotifyReload> notifyReload = new LinkedList<INotifyReload>();
@ -597,6 +600,8 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
subRegistries.clear();
// Just in case: clear the subComponentHolders.
subComponentholders.clear();
// Generic instances registry.
genericInstances.clear();
// Clear command changes list (compatibility issues with NPCs, leads to recalculation of perms).
if (changedCommands != null){
@ -1152,4 +1157,33 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
}
}
@Override
public <T> T registerGenericInstance(T instance) {
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) instance.getClass();
T registered = getGenericInstance(clazz);
genericInstances.put(clazz, instance);
return registered;
}
@Override
public <T, TI extends T> T registerGenericInstance(Class<T> registerFor, TI instance) {
T registered = getGenericInstance(registerFor);
genericInstances.put(registerFor, instance);
return registered;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getGenericInstance(Class<T> registeredFor) {
return (T) genericInstances.get(registeredFor);
}
@Override
public <T> T unregisterGenericInstance(Class<T> registeredFor) {
T registered = getGenericInstance(registeredFor); // Convenience.
genericInstances.remove(registeredFor);
return registered;
}
}