All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.neo4j.procedure.impl.ProcedureHolderUtils Maven / Gradle / Ivy

package org.neo4j.procedure.impl;

import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.kernel.api.procedure.GlobalProcedures;

import java.lang.reflect.Field;

public class ProcedureHolderUtils {

    public static void unregisterProcedure(QualifiedName name, GlobalProcedures registry) {
        String kind = "procedures";
        unregisterCommon(name, registry, kind);
    }

    public static void unregisterFunction(QualifiedName name, GlobalProcedures registry) {
        String kind = "functions";
        unregisterCommon(name, registry, kind);
    }

    private static void unregisterCommon(QualifiedName name, GlobalProcedures registry, String kind) {
        try {
            GlobalProceduresRegistry globalProcRegistry = getGlobalProcRegistry(registry);

            // get the field `ProcedureRegistry registry` from the GlobalProceduresRegistry instance
            Field registryField = GlobalProceduresRegistry.class.getDeclaredField("registry");
            registryField.setAccessible(true);
            ProcedureRegistry procedureRegistry = (ProcedureRegistry) registryField.get(globalProcRegistry);

            // get `ProcedureHolder ` (i.e `ProcedureHolder procedures` or `ProcedureHolder functions`) field from the ProcedureRegistry instance
            Field procHolderField = ProcedureRegistry.class.getDeclaredField(kind);
            procHolderField.setAccessible(true);
            ProcedureHolder procedureHolder = (ProcedureHolder) procHolderField.get(procedureRegistry);

            // unregister `name` from ProcedureHolder found
            procedureHolder.unregister(name);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static GlobalProceduresRegistry getGlobalProcRegistry(GlobalProcedures registry) {
        try {
            // with embedded test database, the instance is of type LazyProcedures,
            // so we get the field `globalProcedures` from the `LazyProcedures registry` instance
            Field globalProceduresField = Class.forName("org.neo4j.procedure.LazyProcedures").getDeclaredField("globalProcedures");
            globalProceduresField.setAccessible(true);

            return (GlobalProceduresRegistry) globalProceduresField.get(registry);

        } catch (Exception e) {
            // with a real instance, the above code produces, due to LazyProcedures, produce a `NoClassDefFoundError` or an `IllegalArgumentException`
            // because `registry` is directly of type GlobalProceduresRegistry, so we cast it
            return (GlobalProceduresRegistry) registry;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy