private static boolean isValidWeakMetaClass(MetaClass metaClass) { return isValidWeakMetaClass(metaClass, GroovySystem.getMetaClassRegistry().getMetaClassCreationHandler()); }
/** * <p>Enables the ExpandoMetaClassCreationHandle with the registry * * <code>ExpandoMetaClassCreationHandle.enable();</code> * */ public static void enable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() != instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(instance); } } }
public static void disable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() == instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(new MetaClassCreationHandle()); } } } }
private MetaClass getMetaClassUnderLock() { MetaClass answer = getStrongMetaClass(); if (answer!=null) return answer; answer = getWeakMetaClass(); final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); MetaClassRegistry.MetaClassCreationHandle mccHandle = metaClassRegistry.getMetaClassCreationHandler(); if (isValidWeakMetaClass(answer, mccHandle)) { return answer; } answer = mccHandle.create(classRef.get(), metaClassRegistry); answer.initialize(); if (GroovySystem.isKeepJavaMetaClasses()) { setStrongMetaClass(answer); } else { setWeakMetaClass(answer); } return answer; }
/** * <p>Enables the ExpandoMetaClassCreationHandle with the registry * * <code>ExpandoMetaClassCreationHandle.enable();</code> * */ public static void enable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); if (metaClassRegistry.getMetaClassCreationHandler() != instance) { instance.modifiedExpandos.clear(); metaClassRegistry.setMetaClassCreationHandle(instance); } }
public static void disable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); if (metaClassRegistry.getMetaClassCreationHandler() == instance) { instance.modifiedExpandos.clear(); metaClassRegistry.setMetaClassCreationHandle(new MetaClassCreationHandle()); } } }
private void proxyMetaClasses() { Set<Class> allClasses = getLoadedClasses(); MetaClassRegistry registry = GroovySystem.getMetaClassRegistry(); Map<Class, MetaClass> originalMetaClasses = new HashMap(); for (Class theClass : allClasses) { MetaClass originalMetaClass = registry.getMetaClass(theClass); originalMetaClasses.put(theClass, originalMetaClass); } originalMetaClassCreationHandle = registry.getMetaClassCreationHandler(); registry.setMetaClassCreationHandle(this); // creates and sets meta classes from the original meta classes for (Map.Entry<Class, MetaClass> e : originalMetaClasses.entrySet()) { Class theClass = e.getKey(); MetaClass metaClass = e.getValue(); MetaClass proxyMetaClass = proxyMetaClass(theClass, metaClass); registry.setMetaClass(theClass, proxyMetaClass); } }
/** * <p>Enables the ExpandoMetaClassCreationHandle with the registry * * <code>ExpandoMetaClassCreationHandle.enable();</code> * */ public static void enable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() != instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(instance); } } }
/** * <p>Enables the ExpandoMetaClassCreationHandle with the registry * * <code>ExpandoMetaClassCreationHandle.enable();</code> * */ public static void enable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() != instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(instance); } } }
/** * <p>Enables the ExpandoMetaClassCreationHandle with the registry * * <code>ExpandoMetaClassCreationHandle.enable();</code> * */ public static void enable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() != instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(instance); } } }
public static void disable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() == instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(new MetaClassCreationHandle()); } } } }
public static void disable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() == instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(new MetaClassCreationHandle()); } } } }
public static void disable() { final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); synchronized (metaClassRegistry) { if (metaClassRegistry.getMetaClassCreationHandler() == instance) { ClassInfo.clearModifiedExpandos(); metaClassRegistry.setMetaClassCreationHandle(new MetaClassCreationHandle()); } } } }
private void performRegistryCallbacks() { MetaClassRegistry registry = GroovySystem.getMetaClassRegistry(); if(!modified) { modified = true; // Implementation note: By default Groovy uses soft references to store MetaClass // this insures the registry doesn't grow and get out of hand. By doing this we're // saying this this EMC will be a hard reference in the registry. As we're only // going have a small number of classes that have modified EMC this is ok if(inRegistry) { MetaClass currMetaClass = registry.getMetaClass(theClass); if(!(currMetaClass instanceof ExpandoMetaClass) && currMetaClass instanceof AdaptingMetaClass) { ((AdaptingMetaClass)currMetaClass).setAdaptee(this); } else { registry.setMetaClass(theClass, this); } } } // Implementation note: EMC handles most cases by itself except for the case where yuou // want to call a dynamically injected method registered with a parent on a child class // For this to work the MetaClassRegistry needs to have an ExpandoMetaClassCreationHandle // What this does is ensure that EVERY class created in the registry uses an EMC // Then when an EMC changes it reports back to the EMCCreationHandle which will // tell child classes of this class to re-inherit their methods if(registry.getMetaClassCreationHandler() instanceof ExpandoMetaClassCreationHandle) { ExpandoMetaClassCreationHandle creationHandler = (ExpandoMetaClassCreationHandle)registry.getMetaClassCreationHandler(); if(!creationHandler.hasModifiedMetaClass(this)) creationHandler.registerModifiedMetaClass(this); } }
private MetaClass getMetaClassUnderLock() { MetaClass answer; answer = getMetaClassForClass(); if (answer != null) return answer; final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); answer = metaClassRegistry.getMetaClassCreationHandler() .create(get(), metaClassRegistry); answer.initialize(); if (GroovySystem.isKeepJavaMetaClasses()) { setStrongMetaClass(answer); } else { setWeakMetaClass(answer); } return answer; }
private MetaClass getMetaClassUnderLock() { MetaClass answer = getStrongMetaClass(); if (answer!=null) return answer; answer = getWeakMetaClass(); final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); MetaClassRegistry.MetaClassCreationHandle mccHandle = metaClassRegistry.getMetaClassCreationHandler(); if (answer != null) { boolean enableGloballyOn = (mccHandle instanceof ExpandoMetaClassCreationHandle); boolean cachedAnswerIsEMC = (answer instanceof ExpandoMetaClass); // if EMC.enableGlobally() is OFF, return whatever the cached answer is. // but if EMC.enableGlobally() is ON and the cached answer is not an EMC, come up with a fresh answer if(!enableGloballyOn || cachedAnswerIsEMC) { return answer; } } answer = mccHandle.create(get(), metaClassRegistry); answer.initialize(); if (GroovySystem.isKeepJavaMetaClasses()) { setStrongMetaClass(answer); } else { setWeakMetaClass(answer); } return answer; }
private MetaClass getMetaClassUnderLock() { MetaClass answer = getStrongMetaClass(); if (answer!=null) return answer; answer = getWeakMetaClass(); final MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); MetaClassRegistry.MetaClassCreationHandle mccHandle = metaClassRegistry.getMetaClassCreationHandler(); if (answer != null) { boolean enableGloballyOn = (mccHandle instanceof ExpandoMetaClassCreationHandle); boolean cachedAnswerIsEMC = (answer instanceof ExpandoMetaClass); // if EMC.enableGlobally() is OFF, return whatever the cached answer is. // but if EMC.enableGlobally() is ON and the cached answer is not an EMC, come up with a fresh answer if(!enableGloballyOn || cachedAnswerIsEMC) { return answer; } } answer = mccHandle.create(get(), metaClassRegistry); answer.initialize(); if (GroovySystem.isKeepJavaMetaClasses()) { setStrongMetaClass(answer); } else { setWeakMetaClass(answer); } return answer; }