muleresourceadapter.java

来自「提供ESB 应用mule源代码 提供ESB 应用mule源代码」· Java 代码 · 共 420 行

JAVA
420
字号
/* * $Id: MuleResourceAdapter.java 11454 2008-03-20 14:29:51Z tcarlson $ * -------------------------------------------------------------------------------------- * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com * * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */package org.mule.module.jca;import org.mule.api.MuleContext;import org.mule.api.MuleException;import org.mule.api.config.ConfigurationBuilder;import org.mule.api.context.MuleContextBuilder;import org.mule.api.endpoint.EndpointBuilder;import org.mule.api.endpoint.InboundEndpoint;import org.mule.api.model.Model;import org.mule.api.service.Service;import org.mule.config.DefaultMuleConfiguration;import org.mule.context.DefaultMuleContextBuilder;import org.mule.context.DefaultMuleContextFactory;import org.mule.endpoint.EndpointURIEndpointBuilder;import org.mule.endpoint.URIBuilder;import org.mule.util.ClassUtils;import java.io.IOException;import java.io.ObjectInputStream;import java.io.Serializable;import java.util.HashMap;import java.util.Map;import javax.resource.NotSupportedException;import javax.resource.ResourceException;import javax.resource.spi.ActivationSpec;import javax.resource.spi.BootstrapContext;import javax.resource.spi.ResourceAdapter;import javax.resource.spi.ResourceAdapterInternalException;import javax.resource.spi.endpoint.MessageEndpointFactory;import javax.transaction.xa.XAResource;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * <code>MuleResourceAdapter</code> TODO */public class MuleResourceAdapter implements ResourceAdapter, Serializable{    /**     * Serial version     */    private static final long serialVersionUID = 5727648958127416509L;    /**     * logger used by this class     */    protected transient Log logger = LogFactory.getLog(this.getClass());    protected transient MuleContext muleContext;    protected transient BootstrapContext bootstrapContext;    protected MuleConnectionRequestInfo info = new MuleConnectionRequestInfo();    protected final Map endpoints = new HashMap();    protected String defaultJcaModelName;    public MuleResourceAdapter()    {        // TODO Make this work for OSGi        //RegistryContext.getOrCreateRegistry();    }    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException    {        ois.defaultReadObject();        this.logger = LogFactory.getLog(this.getClass());    }    /**     * @see javax.resource.spi.ResourceAdapter#start(javax.resource.spi.BootstrapContext)     */    public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException    {        this.bootstrapContext = bootstrapContext;        if (info.getConfigurations() != null)        {            ConfigurationBuilder configBuilder = null;            try            {                configBuilder = (ConfigurationBuilder) ClassUtils.instanciateClass(info.getConfigurationBuilder(),                    new Object[]{info.getConfigurations()});            }            catch (Exception e)            {                throw new ResourceAdapterInternalException("Failed to instanciate configurationBuilder class: "                                                           + info.getConfigurationBuilder(), e);            }            try            {                logger.info("Initializing Mule...");                MuleContextBuilder contextBuilder = new DefaultMuleContextBuilder();                DefaultMuleConfiguration config = new DefaultMuleConfiguration();                config.setSystemModelType(JcaModel.JCA_MODEL_TYPE);                contextBuilder.setMuleConfiguration(config);                muleContext = new DefaultMuleContextFactory().createMuleContext(configBuilder, contextBuilder);            }            catch (MuleException e)            {                logger.error(e);                throw new ResourceAdapterInternalException(                    "Failed to load configurations: " + info.getConfigurations(), e);            }            try            {                logger.info("Starting Mule...");                muleContext.start();            }            catch (MuleException e)            {                logger.error(e);                throw new ResourceAdapterInternalException("Failed to start management context", e);            }        }    }    /**     * @see javax.resource.spi.ResourceAdapter#stop()     */    public void stop()    {        logger.info("Stopping Mule...");        muleContext.dispose();        muleContext = null;        bootstrapContext = null;    }    /**     * @return the bootstrap context for this adapter     */    public BootstrapContext getBootstrapContext()    {        return bootstrapContext;    }    /**     * @see javax.resource.spi.ResourceAdapter#endpointActivation(javax.resource.spi.endpoint.MessageEndpointFactory,     *      javax.resource.spi.ActivationSpec)     */    public void endpointActivation(MessageEndpointFactory endpointFactory, ActivationSpec activationSpec)        throws ResourceException    {        if (activationSpec.getResourceAdapter() != this)        {            throw new ResourceException("ActivationSpec not initialized with this ResourceAdapter instance");        }        if (activationSpec.getClass().equals(MuleActivationSpec.class))        {            MuleActivationSpec muleActivationSpec = (MuleActivationSpec) activationSpec;            try            {                // Resolve modelName                String modelName = resolveModelName(muleActivationSpec);                // Lookup/create JCA Model                JcaModel model = getJcaModel(modelName);                // Create Endpoint                InboundEndpoint endpoint = createMessageInflowEndpoint(muleActivationSpec);                // Create Service                Service service = createJcaService(endpointFactory, model, endpoint);                // Keep reference to JcaService descriptor for endpointDeactivation                MuleEndpointKey key = new MuleEndpointKey(endpointFactory, muleActivationSpec);                endpoints.put(key, service);            }            catch (Exception e)            {                logger.error(e.getMessage(), e);            }        }        else        {            throw new NotSupportedException("That type of ActicationSpec not supported: " + activationSpec.getClass());        }    }    /**     * @see javax.resource.spi.ResourceAdapter#endpointDeactivation(javax.resource.spi.endpoint.MessageEndpointFactory,     *      javax.resource.spi.ActivationSpec)     */    public void endpointDeactivation(MessageEndpointFactory endpointFactory, ActivationSpec activationSpec)    {        if (activationSpec.getClass().equals(MuleActivationSpec.class))        {            MuleActivationSpec muleActivationSpec = (MuleActivationSpec) activationSpec;            MuleEndpointKey key = new MuleEndpointKey(endpointFactory, (MuleActivationSpec) activationSpec);            Service service = (Service) endpoints.remove(key);            if (service == null)            {                logger.warn("No endpoint was registered with key: " + key);                return;            }            // Resolve modelName            String modelName = null;            try            {                modelName = resolveModelName(muleActivationSpec);            }            catch (ResourceException e)            {                logger.error(e.getMessage(), e);            }            try            {                muleContext.getRegistry().unregisterService(service.getName());            }            catch (MuleException e)            {                logger.error(e.getMessage(), e);            }        }    }    protected String resolveModelName(MuleActivationSpec activationSpec) throws ResourceException    {        // JCA specification mentions activationSpec properties inheriting        // resourceAdaptor properties, but this doesn't seem to work, at        // least with JBOSS, so do it manually.        String modelName = activationSpec.getModelName();        if (modelName == null)        {            modelName = defaultJcaModelName;        }        if (modelName == null)        {            throw new ResourceException(                "The 'modelName' property has not been configured for either the MuleResourceAdaptor or MuleActicationSpec.");        }        return modelName;    }    protected JcaModel getJcaModel(String modelName) throws MuleException, ResourceException    {        Model model = muleContext.getRegistry().lookupModel(modelName);        if (model != null)        {            if (model instanceof JcaModel)            {                return (JcaModel) model;            }            else            {                throw new ResourceException("Model:-" + modelName + "  is not compatible with JCA type");            }        }        else        {            JcaModel jcaModel = new JcaModel();            jcaModel.setName(modelName);            muleContext.getRegistry().registerModel(jcaModel);            return jcaModel;        }    }    protected Service createJcaService(MessageEndpointFactory endpointFactory,                                              JcaModel model,                                              InboundEndpoint endpoint) throws MuleException    {        String name = "JcaService#" + endpointFactory.hashCode();        Service service = new JcaService();        service.setName(name);        service.getInboundRouter().addEndpoint(endpoint);        // Set endpointFactory rather than endpoint here, so we can obtain a        // new endpoint instance from factory for each incoming message in        // JcaComponet as reccomended by JCA specification        service.setComponent(new JcaComponent(endpointFactory, model.getEntryPointResolverSet(), service,            new DelegateWorkManager(bootstrapContext.getWorkManager())));        service.setModel(model);        muleContext.getRegistry().registerService(service);        return service;    }    protected InboundEndpoint createMessageInflowEndpoint(MuleActivationSpec muleActivationSpec)        throws MuleException    {        EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder(new URIBuilder(            muleActivationSpec.getEndpoint()), muleContext);        // Use asynchronous endpoint as we need to dispatch to service        // rather than send.        endpointBuilder.setSynchronous(false);        return muleContext.getRegistry().lookupEndpointFactory().getInboundEndpoint(endpointBuilder);    }    /**     * We only connect to one resource manager per ResourceAdapter instance, so any ActivationSpec will return     * the same XAResource.     *      * @see javax.resource.spi.ResourceAdapter#getXAResources(javax.resource.spi.ActivationSpec[])     */    public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException    {        return new XAResource[]{};    }    /**     * @return     */    public String getPassword()    {        return info.getPassword();    }    /**     * @return     */    public String getConfigurations()    {        return info.getConfigurations();    }    /**     * @return     */    public String getUserName()    {        return info.getUserName();    }    /**     * @param password     */    public void setPassword(String password)    {        info.setPassword(password);    }    /**     * @param configurations     */    public void setConfigurations(String configurations)    {        info.setConfigurations(configurations);    }    /**     * @param userid     */    public void setUserName(String userid)    {        info.setUserName(userid);    }    public String getConfigurationBuilder()    {        return info.getConfigurationBuilder();    }    public void setConfigurationBuilder(String configbuilder)    {        info.setConfigurationBuilder(configbuilder);    }    /**     * @return Returns the info.     */    public MuleConnectionRequestInfo getInfo()    {        return info;    }    public boolean equals(Object o)    {        if (this == o)        {            return true;        }        if (!(o instanceof MuleResourceAdapter))        {            return false;        }        final MuleResourceAdapter muleResourceAdapter = (MuleResourceAdapter) o;        if (info != null ? !info.equals(muleResourceAdapter.info) : muleResourceAdapter.info != null)        {            return false;        }        return true;    }    public int hashCode()    {        return (info != null ? info.hashCode() : 0);    }    public String getModelName()    {        return defaultJcaModelName;    }    public void setModelName(String modelName)    {        this.defaultJcaModelName = modelName;    }}

⌨️ 快捷键说明

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