TestResourceService.java

package com.github.jonasrutishauser.cdi.test.jndi;

import static javax.naming.Context.INITIAL_CONTEXT_FACTORY;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.jboss.weld.injection.spi.helpers.AbstractResourceServices;
import org.osjava.sj.SimpleJndi;
import org.osjava.sj.jndi.MemoryContext;

import jakarta.annotation.Resource;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.spi.CDI;
import jakarta.enterprise.inject.spi.InjectionPoint;

public class TestResourceService extends AbstractResourceServices {

    static {
        if (System.getProperty(INITIAL_CONTEXT_FACTORY) == null) {
            System.setProperty(INITIAL_CONTEXT_FACTORY, org.osjava.sj.MemoryContextFactory.class.getName());
            System.setProperty(SimpleJndi.SHARED, "true");
            System.setProperty(SimpleJndi.JNDI_SYNTAX_SEPARATOR, "/");
            System.setProperty(MemoryContext.IGNORE_CLOSE, "true");
        }
    }

    @Override
    public Object resolveResource(InjectionPoint injectionPoint) {
        try {
            return super.resolveResource(injectionPoint);
        } catch (IllegalArgumentException e) {
            throw e;
        } catch (RuntimeException e) {
            if (e.getMessage().startsWith("Error looking up ") && injectionPoint.getType() instanceof Class) {
                Instance<?> instance = CDI.current().select((Class<?>) injectionPoint.getType());
                if (instance.isResolvable()) {
                    return instance.get();
                }
            }
            throw e;
        }
    }

    @Override
    protected String getResourceName(InjectionPoint injectionPoint) {
        Resource resource = getResourceAnnotation(injectionPoint);
        if (!resource.lookup().isBlank()) {
            return resource.lookup();
        }
        return super.getResourceName(injectionPoint);
    }

    @Override
    protected Context getContext() {
        try {
            return new InitialContext();
        } catch (NamingException e) {
            throw new IllegalStateException();
        }
    }

}