mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-10-06 10:27:26 +02:00
Add a generic instance factory to the API.
This allows storing useful objects in the registry.
This commit is contained in:
parent
67ac214909
commit
d55cd7e4b6
@ -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);
|
||||
|
||||
}
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user