resource.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 623 行
JAVA
623 行
/* * 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.jca;import com.caucho.config.program.ConfigProgram;import com.caucho.config.Config;import com.caucho.config.ConfigException;import com.caucho.config.program.ContainerProgram;import com.caucho.jca.cfg.JavaMailConfig;import com.caucho.jmx.IntrospectionMBean;import com.caucho.jmx.Jmx;import com.caucho.loader.ClassLoaderListener;import com.caucho.loader.CloseListener;import com.caucho.loader.Environment;import com.caucho.loader.EnvironmentListener;import com.caucho.loader.StartListener;import com.caucho.naming.Jndi;import com.caucho.util.CharBuffer;import com.caucho.util.L10N;import com.caucho.webbeans.manager.WebBeansContainer;import javax.annotation.PostConstruct;import javax.management.Attribute;import javax.management.MBeanAttributeInfo;import javax.management.MBeanInfo;import javax.management.MBeanServer;import javax.management.NotificationFilter;import javax.management.ObjectName;import javax.naming.Context;import javax.naming.InitialContext;import javax.resource.spi.ManagedConnectionFactory;import javax.resource.spi.ResourceAdapter;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;/** * Configuration for the init-param pattern. */public class Resource { private static final Logger log = Logger.getLogger(Resource.class.getName()); private static L10N L = new L10N(Resource.class); private Class _type; private String _var; private String _name; private String _jndiName; private String _mbeanName; private Class _mbeanInterface; // private ArrayList<BuilderProgram> _args = new ArrayList<BuilderProgram>(); private ArrayList<Object> _args = new ArrayList<Object>(); private boolean _isPreInit; private boolean _localTransactionOptimization = true; private boolean _shareable = true; private Object _object; private MBeanInfo _mbeanInfo; /** * Sets the config variable name. */ public void setVar(String var) { _var = var; } /** * Sets the JNDI name */ public void setJndiName(String name) { _jndiName = name; } /** * Gets the JNDI name */ public String getJndiName() { return _jndiName; } /** * Sets the WebBeans name */ public void setName(String name) { _name = name; } /** * Gets the WebBeans name */ public String getName() { return _name; } /** * Sets the mbean name */ public void setMbeanName(String name) { _mbeanName = name; } /** * Gets the mbean name */ public String getMbeanName() { return _mbeanName; } /** * Sets the class */ public void setType(Class resourceClass) { if (resourceClass.getName().equals("javax.mail.Session")) _type = JavaMailConfig.class; else _type = resourceClass; } /** * Sets the class */ public void setClass(Class resourceClass) { _type = resourceClass; } /** * Gets the type; */ public Class getType() { return _type; } /** * Sets the class */ public void setMbeanInterface(Class cl) { _mbeanInterface = cl; } /** * Adds an argument. */ /* public void addArg(BuilderProgram builder) { _args.add(builder); } */ public void addArg(Object arg) { _args.add(arg); } /** * Sets the local-transaction-optimization flag */ public void setLocalTransactionOptimization(boolean enable) { _localTransactionOptimization = enable; } /** * Sets the shareable */ public void setShareable(boolean shareable) { _shareable = shareable; } /** * Adds the init program */ public void addInit(ContainerProgram init) { preInit(); init.configure(_object); } /** * Adds the listener program */ public Object createListener() throws Exception { return createMbeanListener(); } /** * Adds the listener program */ public Object createMbeanListener() throws Exception { preInit(); if (_mbeanName != null) return new MBeanListener(); else throw new ConfigException(L.l("<listener> needs a <resource> with an mbean-name.")); } ObjectName getObjectName() throws Exception { preInit(); if (_mbeanName != null) return Jmx.getObjectName(_mbeanName); else return null; } MBeanInfo getMBeanInfo() throws Exception { preInit(); return _mbeanInfo; } /** * Initialize the resource. */ private void preInit() { try { if (_isPreInit) return; _isPreInit = true; Object oldObject = null; if (_jndiName != null) { try { String jndiName = Jndi.getFullName(_jndiName); Context ic = new InitialContext(); oldObject = ic.lookup(_jndiName); } catch (Exception e) { } } MBeanServer mbeanServer = Jmx.getMBeanServer(); ObjectName mbeanName = null; if (_mbeanName != null) mbeanName = Jmx.getObjectName(_mbeanName); if (_type != null) { } else if (oldObject != null) { _object = oldObject; return; } else if (mbeanName != null && mbeanServer.getMBeanInfo(mbeanName) != null) { return; } else throw new ConfigException(L.l("<resource> configuration needs a <type>. The <type> is the class name of the resource bean.")); Constructor constructor = getConstructor(_args.size()); Class []params = constructor.getParameterTypes(); Object []args = new Object[_args.size()]; /* for (int i = 0; i < args.length; i++) args[i] = _args.get(i).configure(params[i]); */ for (int i = 0; i < args.length; i++) args[i] = _args.get(i); _object = constructor.newInstance(args); if (mbeanName != null) { Object mbean = _object; if (_mbeanInterface != null) mbean = new IntrospectionMBean(mbean, _mbeanInterface); Jmx.register(mbean, mbeanName); _mbeanInfo = mbeanServer.getMBeanInfo(mbeanName); } } catch (Exception e) { throw ConfigException.create(e); } } /** * Returns the constructor based on the length. */ private Constructor getConstructor(int len) throws Exception { Constructor []constructors = _type.getConstructors(); for (int i = 0; i < constructors.length; i++) { if (constructors[i].getParameterTypes().length == len) return constructors[i]; } throw new ConfigException(L.l("`{0}' has no matching constructors.", _type.getName())); } /** * Initialize the resource. */ @PostConstruct public void init() throws Throwable { preInit(); if (_type == null || _object == null) return; Config.init(_object); _object = Config.replaceObject(_object); if (_object instanceof ClassLoaderListener) { ClassLoaderListener listener = (ClassLoaderListener) _object; Environment.addClassLoaderListener(listener); } if (_object instanceof EnvironmentListener) { EnvironmentListener listener = (EnvironmentListener) _object; Environment.addEnvironmentListener(listener); } Object jndiObject = _object; boolean isStart = false; if (_object instanceof ResourceAdapter) { ResourceManagerImpl.addResource((ResourceAdapter) _object); isStart = true; } if (_object instanceof ManagedConnectionFactory) { ResourceManagerImpl rm = ResourceManagerImpl.createLocalManager(); ManagedConnectionFactory mcf; mcf = (ManagedConnectionFactory) _object; ConnectionPool cm = rm.createConnectionPool(); cm.setShareable(_shareable); cm.setLocalTransactionOptimization(_localTransactionOptimization); Object connectionFactory = cm.init(mcf); cm.start(); jndiObject = connectionFactory; isStart = true; } Method start = null; try { start = _object.getClass().getMethod("start", new Class[0]); } catch (Throwable e) { } Method stop = null; try { stop = _object.getClass().getMethod("stop", new Class[0]); } catch (Throwable e) { } if (_jndiName != null) Jndi.bindDeepShort(_jndiName, jndiObject); if (isStart) { } else if (start != null || stop != null) Environment.addEnvironmentListener(new StartListener(_object)); else if (CloseListener.getDestroyMethod(_object.getClass()) != null) Environment.addClassLoaderListener(new CloseListener(_object)); String name = _name; if (_name == null) name = _var; if (_name == null) name = _jndiName; WebBeansContainer webBeans = WebBeansContainer.create(); if (name != null) webBeans.addSingleton(_object, name); else webBeans.addSingleton(_object); if (log.isLoggable(Level.CONFIG)) logConfig(); } private void logConfig() { StringBuilder sb = new StringBuilder(); if (_object instanceof ResourceAdapter) sb.append("jca-resource"); else if (_object instanceof ManagedConnectionFactory) sb.append("jca-resource"); else sb.append("resource"); sb.append("["); boolean hasValue = false; if (_jndiName != null) { if (hasValue) sb.append(", "); hasValue = true; sb.append("jndi-name=" + _jndiName); } if (_var != null) { if (hasValue) sb.append(", "); hasValue = true; sb.append("var=" + _var); } if (_mbeanName != null) { if (hasValue) sb.append(", "); hasValue = true; sb.append("mbean-name=" + _mbeanName); } if (_type != null) { if (hasValue) sb.append(", "); hasValue = true; sb.append("type=" + _type); } sb.append("]"); log.config(sb.toString() + " configured"); } public String toString() { if (_mbeanName != null) return "Resource[" + _mbeanName + "]"; else return "Resource[" + _jndiName + "]"; } public class MBeanInit { public void setProperty(String attrName, ConfigProgram program) throws Throwable { MBeanAttributeInfo attr = getAttribute(attrName); if (attr == null) throw new ConfigException(L.l("`{0}' is an unknown attribute for {1}", attrName, _mbeanName)); String typeName = attr.getType(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class type = Class.forName(typeName, false, loader); Object value = program.configure(type); MBeanServer server = Jmx.getMBeanServer(); server.setAttribute(getObjectName(), new Attribute(attr.getName(), value)); } private MBeanAttributeInfo getAttribute(String key) throws Throwable { MBeanInfo info = getMBeanInfo(); MBeanAttributeInfo []attrs = info.getAttributes(); if (attrs == null) return null; for (int i = 0; i < attrs.length; i++) { if (attrs[i].getName().equals(key)) return attrs[i]; } for (int i = 0; i < attrs.length; i++) { if (convertName(attrs[i].getName()).equals(key)) return attrs[i]; } return null; } private String convertName(String key) { CharBuffer cb = CharBuffer.allocate(); for (int i = 0; i < key.length(); i++) { char ch = key.charAt(i); if (! Character.isUpperCase(ch)) cb.append(ch); else if (i == 0) cb.append(Character.toLowerCase(ch)); else if (Character.isLowerCase(key.charAt(i - 1))) { cb.append('-'); cb.append(Character.toLowerCase(ch)); } else if (i + 1 != key.length() && Character.isLowerCase(key.charAt(i + 1))) { cb.append('-'); cb.append(Character.toLowerCase(ch)); } else cb.append(Character.toLowerCase(ch)); } return cb.close(); } } public class MBeanListener { private String _mbeanName; private Object _handback; private NotificationFilter _filter; public void setMbeanName(String name) { _mbeanName = name; } public String getMBeanName() { return _mbeanName; } public void setHandback(Object handback) { _handback = handback; } public Object getHandback() { return _handback; } @PostConstruct public void init() { try { if (_mbeanName != null) { ObjectName mbeanName = Jmx.getObjectName(_mbeanName); ObjectName listenerName = getObjectName(); MBeanServer server = Jmx.getMBeanServer(); server.addNotificationListener(mbeanName, listenerName, _filter, _handback); } else throw new ConfigException(L.l("mbean name is required")); } catch (Exception e) { throw ConfigException.create(e); } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?