injectableproviderfactory.java

来自「resetful样式的ws样例,一种面向资源的webservices服务」· Java 代码 · 共 470 行 · 第 1/2 页

JAVA
470
字号
/* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. *  * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. *  * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License").  You * may not use this file except in compliance with the License. You can obtain * a copy of the License at https://jersey.dev.java.net/CDDL+GPL.html * or jersey/legal/LICENSE.txt.  See the License for the specific * language governing permissions and limitations under the License. *  * When distributing the software, include this License Header Notice in each * file and include the License file at jersey/legal/LICENSE.txt. * Sun designates this particular file as subject to the "Classpath" exception * as provided by Sun in the GPL Version 2 section of the License file that * accompanied this code.  If applicable, add the following below the License * Header, with the fields enclosed by brackets [] replaced by your own * identifying information: "Portions Copyrighted [year] * [name of copyright owner]" *  * Contributor(s): *  * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license."  If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above.  However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */package com.sun.jersey.impl.application;import com.sun.jersey.spi.resource.InjectableProviderContext;import com.sun.jersey.api.container.ContainerException;import com.sun.jersey.api.model.Parameter;import com.sun.jersey.impl.model.ReflectionHelper;import com.sun.jersey.impl.modelapi.annotation.AnnotatedMethod;import com.sun.jersey.impl.modelapi.annotation.MethodList;import com.sun.jersey.spi.inject.Injectable;import com.sun.jersey.spi.service.ComponentContext;import com.sun.jersey.spi.inject.InjectableProvider;import com.sun.jersey.spi.service.ComponentProvider.Scope;import java.lang.annotation.Annotation;import java.lang.reflect.AccessibleObject;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.lang.reflect.TypeVariable;import java.security.AccessController;import java.security.PrivilegedAction;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.SortedSet;import java.util.TreeSet;import java.util.logging.Logger;import javax.ws.rs.HttpMethod;import javax.ws.rs.Path;/** * * @author Paul.Sandoz@Sun.Com */public final class InjectableProviderFactory implements InjectableProviderContext {        private static final Logger LOGGER = Logger.getLogger(InjectableProviderFactory.class.getName());            private static final class MetaInjectableProvider {        final InjectableProvider ip;        final Class<? extends Annotation> ac;        final Class<?> cc;                MetaInjectableProvider(                InjectableProvider ip,                Class<? extends Annotation> ac,                 Class<?> cc) {            this.ip = ip;            this.ac = ac;            this.cc = cc;        }    }        private Map<Class<? extends Annotation>, LinkedList<MetaInjectableProvider>> ipm =             new HashMap<Class<? extends Annotation>, LinkedList<MetaInjectableProvider>>();            @SuppressWarnings("unchecked")    public void add(InjectableProvider ip) {        Type[] args = getMetaArguments(ip.getClass());        if (args != null) {            MetaInjectableProvider mip = new MetaInjectableProvider(ip,                     (Class)args[0], (Class)args[1]);                        // TODO change to add first            getList(mip.ac).add(mip);        } else {            // TODO throw exception or log error                    }    }    public void configure(ComponentProviderCache componentProviderCache) {        for (InjectableProvider ip :             componentProviderCache.getProvidersAndServices(InjectableProvider.class)) {            add(ip);        }    }        private LinkedList<MetaInjectableProvider> getList(Class<? extends Annotation> c) {        LinkedList<MetaInjectableProvider> l = ipm.get(c);        if (l == null) {            l = new LinkedList<MetaInjectableProvider>();            ipm.put(c, l);        }        return l;    }        private Type[] getMetaArguments(Class<? extends InjectableProvider> c) {        Class _c = c;        while (_c != Object.class) {            Type[] ts = _c.getGenericInterfaces();            for (Type t : ts) {                if (t instanceof ParameterizedType) {                    ParameterizedType pt = (ParameterizedType)t;                    if (pt.getRawType() == InjectableProvider.class) {                        Type[] args = pt.getActualTypeArguments();                        for (int i = 0; i < args.length; i++)                            args[i] = getResolvedType(args[i], c, _c);                                                    if (args[0] instanceof Class &&                                args[1] instanceof Class &&                                (args[1] == Type.class || args[1] == Parameter.class))                            return args;                    }                }            }                        _c = _c.getSuperclass();        }                return null;            }        private Type getResolvedType(Type t, Class c, Class dc) {        if (t instanceof Class)            return t;        else if (t instanceof TypeVariable) {            ReflectionHelper.ClassTypePair ct = ReflectionHelper.                    resolveTypeVariable(c, dc, (TypeVariable)t);            if (ct != null)                return ct.c;            else                 return t;        } else if (t instanceof ParameterizedType) {            ParameterizedType pt = (ParameterizedType)t;            return pt.getRawType();        } else            return t;    }        private List<MetaInjectableProvider> findInjectableProviders(            Class<? extends Annotation> ac,             Class<?> cc,            Scope s) {        List<MetaInjectableProvider> subips = new ArrayList<MetaInjectableProvider>();                for (MetaInjectableProvider i : getList(ac)) {            if (s == i.ip.getScope()) {                if (i.cc.isAssignableFrom(cc)) {                    subips.add(i);                                        }            }        }                return subips;        }        // InjectableProviderContext    public <A extends Annotation, C> Injectable getInjectable(            Class<? extends Annotation> ac,                         ComponentContext ic,            A a,            C c,            Scope s) {        return getInjectable(ac, ic, a, c, Collections.singletonList(s));    }        public <A extends Annotation, C> Injectable getInjectable(            Class<? extends Annotation> ac,                         ComponentContext ic,            A a,            C c,            List<Scope> ls) {        for (Scope s : ls) {            Injectable i = _getInjectable(ac, ic, a, c, s);            if (i != null)                return i;            else {                // TODO log warnings if injection cannot be performed                // This is a little tricky for injection of                 // ContextResolver<JAXBContext> as it is meant to be null                 // or an aggregation.                // LOGGER.warning(ic.getAccesibleObject().toString());            }        }                return null;    }        @SuppressWarnings("unchecked")    private <A extends Annotation, C> Injectable _getInjectable(            Class<? extends Annotation> ac,                         ComponentContext ic,            A a,            C c,            Scope s) {        for (MetaInjectableProvider mip : findInjectableProviders(ac, c.getClass(), s)) {            Injectable i = mip.ip.getInjectable(ic, a, c);            if (i != null)                return i;        }        return null;    }        public Injectable getInjectable(Parameter p) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?