ContextService.java 4.07 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.osgi.service.log.LogService
 */
package com.day.commons.simplejndi.impl;

import com.day.commons.simplejndi.impl.ContextMap;
import com.day.commons.simplejndi.impl.InitialContextProxy;
import java.lang.reflect.Field;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;
import javax.naming.spi.InitialContextFactoryBuilder;
import javax.naming.spi.NamingManager;
import org.osgi.service.log.LogService;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
public class ContextService
implements InitialContextFactory {
    private LogService log;
    private InitialContextFactoryBuilder myIcfBuilder;

    protected void activate() {
        if (this.canRegisterInitialContextFactoryBuilder()) {
            try {
                this.myIcfBuilder = new InitialContextFactoryBuilder(){

                    @Override
                    public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) {
                        return ContextService.this;
                    }
                };
                NamingManager.setInitialContextFactoryBuilder(this.myIcfBuilder);
            }
            catch (NamingException e) {
                this.log.log(1, "Error while registering InitialContextFactoryBuilder in NamingManager", (Throwable)e);
                e.printStackTrace();
            }
            this.log.log(3, "Registered InitialContextFactoryBuilder in NamingManager");
        }
    }

    protected void deactivate() {
        ContextMap.getInstance().clear();
        if (NamingManager.hasInitialContextFactoryBuilder() && this.myIcfBuilder != null) {
            try {
                Field[] fields;
                for (Field field : fields = NamingManager.class.getDeclaredFields()) {
                    if (field.getType() != InitialContextFactoryBuilder.class) continue;
                    field.setAccessible(true);
                    if (this.myIcfBuilder == field.get(null)) {
                        field.set(null, null);
                        this.log.log(3, "InitialContextFactoryBuilder removed");
                        continue;
                    }
                    this.log.log(3, "InitialContextFactoryBuilder is not mine");
                }
            }
            catch (Throwable t) {
                this.log.log(3, "Cannot access private InitialContextFactoryBuilder field in NamingManager", t);
            }
        }
    }

    @Override
    public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
        if (this.myIcfBuilder == null && NamingManager.hasInitialContextFactoryBuilder()) {
            return new InitialContext(environment);
        }
        return new InitialContextProxy(environment);
    }

    private boolean canRegisterInitialContextFactoryBuilder() {
        boolean registrationAllowed = true;
        if (NamingManager.hasInitialContextFactoryBuilder()) {
            this.log.log(3, "InitialContextFactoryBuilder already defined in NamingManager");
            registrationAllowed = false;
        } else {
            try {
                InitialContext ctx = new InitialContext();
                Hashtable env = ctx.getEnvironment();
                Object factory = env.get("java.naming.factory.initial");
                if (factory != null) {
                    this.log.log(3, "InitialContextFactory " + factory + " registered in default environment; not registering InitialContextFactoryBuilder");
                    registrationAllowed = false;
                }
            }
            catch (NamingException ne) {
                // empty catch block
            }
        }
        return registrationAllowed;
    }

    protected void bindLog(LogService logService) {
        this.log = logService;
    }

    protected void unbindLog(LogService logService) {
        if (this.log == logService) {
            this.log = null;
        }
    }

}