componentimpl.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 681 行
JAVA
681 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.webbeans.component;import com.caucho.config.program.FieldComponentProgram;import com.caucho.config.*;import com.caucho.config.j2ee.*;import com.caucho.config.program.ConfigProgram;import com.caucho.config.program.ContainerProgram;import com.caucho.config.types.*;import com.caucho.naming.*;import com.caucho.util.*;import com.caucho.webbeans.*;import com.caucho.webbeans.bytecode.*;import com.caucho.webbeans.cfg.*;import com.caucho.webbeans.context.*;import java.lang.reflect.*;import java.lang.annotation.*;import java.util.*;import javax.annotation.*;import javax.webbeans.*;/** * Configuration for the xml web bean component. */public class ComponentImpl implements ComponentFactory, ObjectProxy { private static final L10N L = new L10N(ComponentImpl.class); private static final Object []NULL_ARGS = new Object[0]; private static final ConfigProgram []NULL_INJECT = new ConfigProgram[0]; protected WbWebBeans _webbeans; private WbComponentType _type; private Type _targetType; private boolean _isFromClass; private String _name; private boolean _hasBinding; private ArrayList<WbBinding> _bindingList = new ArrayList<WbBinding>(); private WebBeansHandle _handle; protected ScopeContext _scope; private String _scopeId; protected ConfigProgram []_injectProgram = NULL_INJECT; protected ConfigProgram []_initProgram = NULL_INJECT; protected ConfigProgram []_destroyProgram = NULL_INJECT; private ContainerProgram _init; public ComponentImpl(WbWebBeans webbeans) { _webbeans = webbeans; } public WbWebBeans getWebBeans() { return _webbeans; } /** * Returns the component's EL binding name. */ public void setName(String name) { _name = name; } /** * Gets the component's EL binding name. */ public String getName() { return _name; } public void addNameBinding(String name) { WbBinding binding = new WbBinding(); binding.setClass(Named.class); binding.addValue("value", name); _bindingList.add(binding); } /** * Gets the component type. */ public WbComponentType getType() { return _type; } /** * Sets the component type. */ public void setType(WbComponentType type) { if (type == null) throw new NullPointerException(); _type = type; } public void setTargetType(Type type) { _targetType = type; } public Type getTargetType() { return _targetType; } public String getTargetSimpleName() { if (_targetType instanceof Class) return ((Class) _targetType).getSimpleName(); else return String.valueOf(_targetType); } public Class getTargetClass() { if (_targetType instanceof Class) return ((Class) _targetType); else if (_targetType instanceof ParameterizedType) return (Class) ((ParameterizedType) _targetType).getRawType(); else return (Class) _targetType; } public String getClassName() { if (_targetType instanceof Class) return ((Class) _targetType).getName(); else return String.valueOf(_targetType); } /** * Adds a component binding. */ public void setBindingList(ArrayList<WbBinding> bindingList) { _bindingList = bindingList; } public ArrayList<WbBinding> getBindingList() { return _bindingList; } /** * Sets the scope annotation. */ public void setScope(ScopeContext scope) { _scope = scope; } /** * Gets the scope annotation. */ public ScopeContext getScope() { return _scope; } public boolean isSingleton() { return (_scope instanceof SingletonScope || _scope instanceof ApplicationScope); } /** * Sets the init program. */ public void setInit(ContainerProgram init) { _init = init; } /** * Add to the init program. */ public void addProgram(ConfigProgram program) { if (_init == null) _init = new ContainerProgram(); _init.addProgram(program); } /** * True if the component was defined by class introspection. */ public void setFromClass(boolean isFromClass) { _isFromClass = isFromClass; } /** * True if the component was defined by class introspection. */ public boolean isFromClass() { return _isFromClass; } /** * Returns the serialization handle */ public WebBeansHandle getHandle() { return _handle; } /** * Initialization. */ public void init() { introspect(); if (_type == null) _type = _webbeans.createComponentType(Component.class); generateScopeId(); _handle = new WebBeansHandle(_targetType, _bindingList); } protected void introspect() { } private void generateScopeId() { long crc64 = 17; crc64 = Crc64.generate(crc64, String.valueOf(_targetType)); if (_name != null) crc64 = Crc64.generate(crc64, _name); for (WbBinding binding : _bindingList) { crc64 = binding.generateCrc64(crc64); } StringBuilder sb = new StringBuilder(); Base64.encode(sb, crc64); _scopeId = sb.toString(); } /** * Called for implicit introspection. */ protected void introspectScope(Class type) { Class scopeClass = null; if (getScope() == null) { for (Annotation ann : type.getDeclaredAnnotations()) { if (ann.annotationType().isAnnotationPresent(ScopeType.class)) { if (scopeClass != null) throw new ConfigException(L.l("{0}: @ScopeType annotation @{1} conflicts with @{2}. WebBeans components may only have a single @ScopeType.", type.getName(), scopeClass.getName(), ann.annotationType().getName())); scopeClass = ann.annotationType(); setScope(_webbeans.getScopeContext(scopeClass)); } } } } /** * Introspects the methods for any @Produces */ protected void introspectBindings() { } public boolean isMatch(ArrayList<Annotation> bindList) { for (int i = 0; i < bindList.size(); i++) { if (! isMatch(bindList.get(i))) return false; } return true; } /** * Returns true if at least one of this component's bindings match * the injection binding. */ public boolean isMatch(Annotation bindAnn) { for (int i = 0; i < _bindingList.size(); i++) { if (_bindingList.get(i).isMatch(bindAnn)) return true; } return false; } public boolean isMatchByBinding(ArrayList<Binding> bindList) { for (int i = 0; i < bindList.size(); i++) { if (! isMatchByBinding(bindList.get(i))) return false; } return true; } /** * Returns true if at least one of this component's bindings match * the injection binding. */ public boolean isMatchByBinding(Binding binding) { for (int i = 0; i < _bindingList.size(); i++) { if (_bindingList.get(i).isMatch(binding)) return true; } return false; } /** * Returns the component object if it already exists */ public Object getIfExists() { if (_scope != null) return _scope.get(this, false); else return get(); } /** * Returns the component object, creating if necessary */ public Object get() { if (_scope != null) { Object value = _scope.get(this, false); if (value != null) { return value; } } return create(); } public Object get(ConfigContext env) { if (_scope != null) { Object value = _scope.get(this, false); if (value != null) return value; } else { Object value = env.get(this); if (value != null) return value; } Object value; if (_scope != null) { value = createNew(null); _scope.put(this, value); env = new ConfigContext(this, value, _scope); } else { value = createNew(env); } init(value, env); return value; } /** * Creates a new instance of the component. */ public Object create() { try { ConfigContext env = new ConfigContext(_scope); Object value = createNew(env); env.put(this, value); if (_scope != null) _scope.put(this, value); init(value, env); return value; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } /** * Creates a new instance of the component. */ public Object createNoInit() { try { Object value = createNew(null); if (_injectProgram.length > 0) { ConfigContext env = new ConfigContext(this, value, null); for (ConfigProgram program : _injectProgram) { program.inject(value, env); } } return value; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } /** * Creates a new instance of the component * * @param env the configuration environment * @return the new object */ protected Object createNew(ConfigContext env) { throw new UnsupportedOperationException(getClass().getName()); } /** * Initialize the created value */ protected Object init(Object value, ConfigContext env) { if (_init != null) _init.inject(value, env); for (ConfigProgram inject : _injectProgram) { inject.inject(value, env); } for (ConfigProgram inject : _initProgram) { inject.inject(value, env); } if (_destroyProgram.length > 0) { env.addDestructor(this, value); } return value; } /** * Returns true if there's a destroy program. */ public boolean isDestroyPresent() { return _destroyProgram.length > 0; } /** * Destroys the value */ public void destroy(Object value, ConfigContext env) { for (ConfigProgram inject : _destroyProgram) inject.inject(value, env); } /** * Destroys the value */ public void destroy(Object value) { destroy(value, null); } /** * Binds parameters */ public void bind() { } public void createProgram(ArrayList<ConfigProgram> initList, Field field) throws ConfigException { initList.add(new FieldComponentProgram(this, field)); } public String getScopeId() { return _scopeId; } // // ObjectProxy // /** * Returns the new object for JNDI */ public Object createObject(Hashtable env) { return get(); } protected ConfigException error(Method method, String msg) { return new ConfigException(LineConfigException.loc(method) + msg); } public boolean equals(Object obj) { if (this == obj) return true; else if (! (obj instanceof ComponentImpl)) return false; ComponentImpl comp = (ComponentImpl) obj; if (! _targetType.equals(comp._targetType)) { return false; } int size = _bindingList.size(); if (size != comp._bindingList.size()) { return false; } for (int i = size - 1; i >= 0; i--) { if (! comp._bindingList.contains(_bindingList.get(i))) { return false; } } return true; } public String toDebugString() { StringBuilder sb = new StringBuilder(); if (_targetType instanceof Class) sb.append(((Class) _targetType).getSimpleName()); else sb.append(String.valueOf(_targetType)); sb.append("["); for (WbBinding binding : _bindingList) { sb.append(binding.toDebugString()); sb.append(","); } if (_type != null) { sb.append("@"); sb.append(_type.getType().getSimpleName()); } else sb.append("@null"); if (_scope != null) { sb.append(", @"); sb.append(_scope.getClass().getSimpleName()); } if (_name != null) { sb.append(", name="); sb.append(_name); } sb.append("]"); return sb.toString(); } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append("["); if (_targetType instanceof Class) sb.append(((Class) _targetType).getSimpleName()); else sb.append(String.valueOf(_targetType)); sb.append(", "); if (_type != null) { sb.append("@"); sb.append(_type.getType().getSimpleName()); } else sb.append("@null"); if (_name != null) { sb.append(", "); sb.append("name="); sb.append(_name); } if (_scope != null) { sb.append(", @"); sb.append(_scope.getClass().getSimpleName()); } sb.append("]"); return sb.toString(); } protected static String getSimpleName(Type type) { if (type instanceof Class) return ((Class) type).getSimpleName(); else return String.valueOf(type); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?