[prev in list] [next in list] [prev in thread] [next in thread]
List: openejb-development
Subject: Re: svn commit: r643904 - /openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/op
From: "Manu George" <manu.t.george () gmail ! com>
Date: 2008-04-02 14:01:29
Message-ID: 466797bd0804020649j6835a903qe62efe0cf1fad223 () mail ! gmail ! com
[Download RAW message or body]
Well it seems the mistake I did was use wordpad from windows to edit
the file :(.
Regards
Manu
On Wed, Apr 2, 2008 at 7:02 PM, <manugeorge@apache.org> wrote:
> Author: manugeorge
> Date: Wed Apr 2 06:32:25 2008
> New Revision: 643904
>
> URL: http://svn.apache.org/viewvc?rev=643904&view=rev
> Log:
> reverting back to older revision = 643871
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
>
> Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
>
> URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/ \
> main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?rev=643904&r1=643903&r2=643904&view=diff
> ==============================================================================
> --- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java \
> (original)
> +++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java \
> Wed Apr 2 06:32:25 2008 @@ -1,376 +1,368 @@
> -/**
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -package org.apache.openejb.core.stateless;
> -
> -import java.lang.reflect.Method;
> -import java.rmi.RemoteException;
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.List;
> -import java.util.Map;
> -
> -import javax.ejb.SessionBean;
> -import javax.ejb.SessionContext;
> -import javax.naming.Context;
> -import javax.naming.NamingException;
> -import javax.transaction.TransactionManager;
> -import javax.xml.ws.WebServiceContext;
> -
> -import org.apache.openejb.Injection;
> -import org.apache.openejb.OpenEJBException;
> -import org.apache.openejb.SystemException;
> -import org.apache.openejb.core.BaseContext;
> -import org.apache.openejb.core.CoreDeploymentInfo;
> -import org.apache.openejb.core.Operation;
> -import org.apache.openejb.core.ThreadContext;
> -import org.apache.openejb.core.interceptor.InterceptorData;
> -import org.apache.openejb.core.interceptor.InterceptorStack;
> -import org.apache.openejb.spi.SecurityService;
> -import org.apache.openejb.util.LinkedListStack;
> -import org.apache.openejb.util.LogCategory;
> -import org.apache.openejb.util.Logger;
> -import org.apache.openejb.util.SafeToolkit;
> -import org.apache.openejb.util.Stack;
> -import org.apache.xbean.recipe.ConstructionException;
> -import org.apache.xbean.recipe.ObjectRecipe;
> -import org.apache.xbean.recipe.Option;
> -import org.apache.xbean.recipe.StaticRecipe;
> -
> -public class StatelessInstanceManager {
> - private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB, \
> "org.apache.openejb.util.resources");
> -
> - protected int poolLimit = 0;
> - protected int beanCount = 0;
> - protected boolean strictPooling = false;
> -
> - protected PoolQueue poolQueue = null;
> -
> - protected final SafeToolkit toolkit = \
> SafeToolkit.getToolkit("StatefulInstanceManager");
> - private TransactionManager transactionManager;
> - private SecurityService securityService;
> -
> - public StatelessInstanceManager(TransactionManager transactionManager, \
> SecurityService securityService, int timeout, int poolSize, boolean strictPooling) \
> {
> - this.transactionManager = transactionManager;
> - this.securityService = securityService;
> - this.poolLimit = poolSize;
> - this.strictPooling = strictPooling;
> -
> - if (strictPooling && poolSize < 1) {
> - throw new IllegalArgumentException("Cannot use strict pooling with a \
> pool size less than one. Strict pooling blocks threads till an instance in the \
> pool is available. Please increase the pool size or set strict \
> pooling to false");
> - }
> -
> - if (this.strictPooling) {
> - poolQueue = new PoolQueue(timeout);
> - }
> - }
> -
> - /**
> - * Removes an instance from the pool and returns it for use
> - * by the container in business methods.
> - *
> - * If the pool is at it's limit the StrictPooling flag will
> - * cause this thread to wait.
> - *
> - * If StrictPooling is not enabled this method will create a
> - * new stateless bean instance performing all required injection
> - * and callbacks before returning it in a method ready state.
> - *
> - * @param callContext
> - * @return
> - * @throws OpenEJBException
> - */
> - public Object getInstance(ThreadContext callContext)
> - throws OpenEJBException {
> - CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> - Data data = (Data) deploymentInfo.getContainerData();
> - Stack pool = data.getPool();
> - Object bean = pool.pop();
> - if(strictPooling){
> - synchronized(pool){
> - while (bean == null && pool.size() >= poolLimit) {
> - poolQueue.waitForAvailableInstance();
> - bean = pool.pop();
> - }
> - }
> - }
> - if (bean == null) {
> -
> - Class beanClass = deploymentInfo.getBeanClass();
> - ObjectRecipe objectRecipe = new ObjectRecipe(beanClass);
> - objectRecipe.allow(Option.FIELD_INJECTION);
> - objectRecipe.allow(Option.PRIVATE_PROPERTIES);
> - objectRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
> -
> - Operation originalOperation = callContext.getCurrentOperation();
> - BaseContext.State[] originalAllowedStates = \
> callContext.getCurrentAllowedStates();
> -
> - try {
> - Context ctx = deploymentInfo.getJndiEnc();
> - SessionContext sessionContext;
> - // This needs to be synchronized as this code is multi-threaded.
> - // In between the lookup and the bind a bind may take place in \
> another Thread.
> - // This is a fix for GERONIMO-3444
> - synchronized(this){
> - try {
> - sessionContext = (SessionContext) \
> ctx.lookup("java:comp/EJBContext");
> - } catch (NamingException e1) {
> - sessionContext = createSessionContext();
> - // TODO: This should work
> - ctx.bind("java:comp/EJBContext", sessionContext);
> - }
> - }
> - if (javax.ejb.SessionBean.class.isAssignableFrom(beanClass) || \
> hasSetSessionContext(beanClass)) {
> - callContext.setCurrentOperation(Operation.INJECTION);
> - \
> callContext.setCurrentAllowedStates(StatelessContext.getStates());
> - objectRecipe.setProperty("sessionContext", new \
> StaticRecipe(sessionContext));
> - }
> -
> - WebServiceContext wsContext;
> - // This is a fix for GERONIMO-3444
> - synchronized(this){
> - try {
> - wsContext = (WebServiceContext) \
> ctx.lookup("java:comp/WebServiceContext");
> - } catch (NamingException e) {
> - wsContext = new EjbWsContext(sessionContext);
> - ctx.bind("java:comp/WebServiceContext", wsContext);
> - }
> - }
> -
> - fillInjectionProperties(objectRecipe, beanClass, deploymentInfo, \
> ctx);
> -
> - bean = objectRecipe.create(beanClass.getClassLoader());
> - Map unsetProperties = objectRecipe.getUnsetProperties();
> - if (unsetProperties.size() > 0) {
> - for (Object property : unsetProperties.keySet()) {
> - logger.warning("Injection: No such property '" + property \
> + "' in class " + beanClass.getName());
> - }
> - }
> -
> - HashMap<String, Object> interceptorInstances = new HashMap<String, \
> Object>();
> - for (InterceptorData interceptorData : \
> deploymentInfo.getAllInterceptors()) {
> - if (interceptorData.getInterceptorClass().equals(beanClass)) \
> continue;
> -
> - Class clazz = interceptorData.getInterceptorClass();
> - ObjectRecipe interceptorRecipe = new ObjectRecipe(clazz);
> - interceptorRecipe.allow(Option.FIELD_INJECTION);
> - interceptorRecipe.allow(Option.PRIVATE_PROPERTIES);
> - interceptorRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
> -
> - fillInjectionProperties(interceptorRecipe, clazz, \
> deploymentInfo, ctx);
> -
> - try {
> - Object interceptorInstance = \
> interceptorRecipe.create(clazz.getClassLoader());
> - interceptorInstances.put(clazz.getName(), \
> interceptorInstance);
> - } catch (ConstructionException e) {
> - throw new Exception("Failed to create interceptor: " + \
> clazz.getName(), e);
> - }
> - }
> -
> - interceptorInstances.put(beanClass.getName(), bean);
> -
> -
> - try {
> - callContext.setCurrentOperation(Operation.POST_CONSTRUCT);
> - \
> callContext.setCurrentAllowedStates(StatelessContext.getStates());
> -
> - List<InterceptorData> callbackInterceptors = \
> deploymentInfo.getCallbackInterceptors();
> - InterceptorStack interceptorStack = new InterceptorStack(bean, \
> null, Operation.POST_CONSTRUCT, callbackInterceptors, \
> interceptorInstances);
> - interceptorStack.invoke();
> - } catch (Exception e) {
> - throw e;
> - }
> -
> - try {
> - if (bean instanceof SessionBean){
> - callContext.setCurrentOperation(Operation.CREATE);
> - \
> callContext.setCurrentAllowedStates(StatelessContext.getStates());
> - Method create = deploymentInfo.getCreateMethod();
> - InterceptorStack interceptorStack = new \
> InterceptorStack(bean, create, Operation.CREATE, new ArrayList<InterceptorData>(), \
> new HashMap());
> - interceptorStack.invoke();
> - }
> - } catch (Exception e) {
> - throw e;
> - }
> -
> - bean = new Instance(bean, interceptorInstances);
> - } catch (Throwable e) {
> - if (e instanceof java.lang.reflect.InvocationTargetException) {
> - e = ((java.lang.reflect.InvocationTargetException) \
> e).getTargetException();
> - }
> - String t = "The bean instance " + bean + " threw a system \
> exception:" + e;
> - logger.error(t, e);
> - throw new org.apache.openejb.ApplicationException(new \
> RemoteException("Cannot obtain a free instance.", e));
> - } finally {
> - callContext.setCurrentOperation(originalOperation);
> - callContext.setCurrentAllowedStates(originalAllowedStates);
> - }
> - }
> - return bean;
> - }
> -
> - private static void fillInjectionProperties(ObjectRecipe objectRecipe, Class \
> clazz, CoreDeploymentInfo deploymentInfo, Context context) {
> - for (Injection injection : deploymentInfo.getInjections()) {
> - if (!injection.getTarget().isAssignableFrom(clazz)) continue;
> - try {
> - String jndiName = injection.getJndiName();
> - Object object = context.lookup("java:comp/env/" + jndiName);
> - if (object instanceof String) {
> - String string = (String) object;
> - // Pass it in raw so it could be potentially converted to
> - // another data type by an xbean-reflect property editor
> - objectRecipe.setProperty(injection.getTarget().getName() + "/" \
> + injection.getName(), string);
> - } else {
> - objectRecipe.setProperty(injection.getTarget().getName() + "/" \
> + injection.getName(), new StaticRecipe(object));
> - }
> - } catch (NamingException e) {
> - logger.warning("Injection data not found in enc: jndiName='" + \
> injection.getJndiName() + "', target=" + injection.getTarget() + "/" + \
> injection.getName());
> - }
> - }
> - }
> -
> - private boolean hasSetSessionContext(Class beanClass) {
> - try {
> - beanClass.getMethod("setSessionContext", SessionContext.class);
> - return true;
> - } catch (NoSuchMethodException e) {
> - return false;
> - }
> - }
> -
> - private SessionContext createSessionContext() {
> - return new StatelessContext(transactionManager, securityService);
> - }
> -
> - /**
> - * All instances are removed from the pool in getInstance(...). They are only
> - * returned by the StatelessContainer via this method under two circumstances.
> - *
> - * 1. The business method returns normally
> - * 2. The business method throws an application exception
> - *
> - * Instances are not returned to the pool if the business method threw a \
> system
> - * exception.
> - *
> - * @param callContext
> - * @param bean
> - * @throws OpenEJBException
> - */
> - public void poolInstance(ThreadContext callContext, Object bean) throws \
> OpenEJBException {
> - if (bean == null) {
> - throw new SystemException("Invalid arguments");
> - }
> -
> - CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> - Data data = (Data) deploymentInfo.getContainerData();
> - Stack pool = data.getPool();
> -
> - if (strictPooling) {
> - synchronized (pool) {
> - if (pool.size() < poolLimit) {
> - pool.push(bean);
> - poolQueue.notifyWaitingThreads();
> - } else {
> - freeInstance(callContext, (Instance) bean);
> - }
> - }
> - } else {
> - if (pool.size() >= poolLimit) {
> - freeInstance(callContext, (Instance)bean);
> - } else {
> - pool.push(bean);
> - }
> - }
> - }
> -
> - private void freeInstance(ThreadContext callContext, Instance instance) {
> - try {
> - callContext.setCurrentOperation(Operation.PRE_DESTROY);
> - callContext.setCurrentAllowedStates(StatelessContext.getStates());
> - CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> -
> - Method remove = instance.bean instanceof SessionBean? \
> deploymentInfo.getCreateMethod(): null;
> -
> - List<InterceptorData> callbackInterceptors = \
> deploymentInfo.getCallbackInterceptors();
> - InterceptorStack interceptorStack = new \
> InterceptorStack(instance.bean, remove, Operation.PRE_DESTROY, \
> callbackInterceptors, instance.interceptors);
> -
> - interceptorStack.invoke();
> - } catch (Throwable re) {
> - logger.error("The bean instance " + instance + " threw a system \
> exception:" + re, re);
> - }
> -
> - }
> -
> - /**
> - * This method has no work to do as all instances are removed from
> - * the pool on getInstance(...) and not returned via poolInstance(...)
> - * if they threw a system exception.
> - *
> - * @param callContext
> - * @param bean
> - */
> - public void discardInstance(ThreadContext callContext, Object bean) {
> -
> - }
> -
> - public void deploy(CoreDeploymentInfo deploymentInfo) {
> - Data data = new Data(poolLimit);
> - deploymentInfo.setContainerData(data);
> - }
> -
> - public void undeploy(CoreDeploymentInfo deploymentInfo) {
> - Data data = (Data) deploymentInfo.getContainerData();
> - if (data == null) return;
> - Stack pool = data.getPool();
> - //TODO ejbRemove on each bean in pool.
> - //clean pool
> - deploymentInfo.setContainerData(null);
> - }
> -
> - static class PoolQueue {
> - private final long waitPeriod;
> -
> - public PoolQueue(long time) {
> - waitPeriod = time;
> - }
> -
> - public synchronized void waitForAvailableInstance()
> - throws org.apache.openejb.InvalidateReferenceException {
> - try {
> - wait(waitPeriod);
> - } catch (InterruptedException ie) {
> - throw new org.apache.openejb.InvalidateReferenceException(new \
> RemoteException("No instance available to service request", ie));
> - }
> - }
> -
> - public synchronized void notifyWaitingThreads() {
> - notify();
> - }
> - }
> -
> - private static final class Data {
> - private final Stack pool;
> -
> - public Data(int poolLimit) {
> - pool = new LinkedListStack(poolLimit);
> - }
> -
> - public Stack getPool() {
> - return pool;
> - }
> - }
> -
> -}
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.openejb.core.stateless;
> +
> +import java.lang.reflect.Method;
> +import java.rmi.RemoteException;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import javax.ejb.SessionBean;
> +import javax.ejb.SessionContext;
> +import javax.naming.Context;
> +import javax.naming.NamingException;
> +import javax.transaction.TransactionManager;
> +import javax.xml.ws.WebServiceContext;
> +
> +import org.apache.openejb.Injection;
> +import org.apache.openejb.OpenEJBException;
> +import org.apache.openejb.SystemException;
> +import org.apache.openejb.core.BaseContext;
> +import org.apache.openejb.core.CoreDeploymentInfo;
> +import org.apache.openejb.core.Operation;
> +import org.apache.openejb.core.ThreadContext;
> +import org.apache.openejb.core.interceptor.InterceptorData;
> +import org.apache.openejb.core.interceptor.InterceptorStack;
> +import org.apache.openejb.spi.SecurityService;
> +import org.apache.openejb.util.LinkedListStack;
> +import org.apache.openejb.util.LogCategory;
> +import org.apache.openejb.util.Logger;
> +import org.apache.openejb.util.SafeToolkit;
> +import org.apache.openejb.util.Stack;
> +import org.apache.xbean.recipe.ConstructionException;
> +import org.apache.xbean.recipe.ObjectRecipe;
> +import org.apache.xbean.recipe.Option;
> +import org.apache.xbean.recipe.StaticRecipe;
> +
> +public class StatelessInstanceManager {
> + private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB, \
> "org.apache.openejb.util.resources"); +
> + protected int poolLimit = 0;
> + protected int beanCount = 0;
> + protected boolean strictPooling = false;
> +
> + protected PoolQueue poolQueue = null;
> +
> + protected final SafeToolkit toolkit = \
> SafeToolkit.getToolkit("StatefulInstanceManager"); + private TransactionManager \
> transactionManager; + private SecurityService securityService;
> +
> + public StatelessInstanceManager(TransactionManager transactionManager, \
> SecurityService securityService, int timeout, int poolSize, boolean strictPooling) \
> { + this.transactionManager = transactionManager;
> + this.securityService = securityService;
> + this.poolLimit = poolSize;
> + this.strictPooling = strictPooling;
> +
> + if (strictPooling && poolSize < 1) {
> + throw new IllegalArgumentException("Cannot use strict pooling with a \
> pool size less than one. Strict pooling blocks threads till an instance in the \
> pool is available. Please increase the pool size or set strict pooling to false"); \
> + } +
> + if (this.strictPooling) {
> + poolQueue = new PoolQueue(timeout);
> + }
> + }
> +
> + /**
> + * Removes an instance from the pool and returns it for use
> + * by the container in business methods.
> + *
> + * If the pool is at it's limit the StrictPooling flag will
> + * cause this thread to wait.
> + *
> + * If StrictPooling is not enabled this method will create a
> + * new stateless bean instance performing all required injection
> + * and callbacks before returning it in a method ready state.
> + *
> + * @param callContext
> + * @return
> + * @throws OpenEJBException
> + */
> + public Object getInstance(ThreadContext callContext)
> + throws OpenEJBException {
> + CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> + Data data = (Data) deploymentInfo.getContainerData();
> + Stack pool = data.getPool();
> + Object bean = pool.pop();
> +
> + while (strictPooling && bean == null && pool.size() >= poolLimit) {
> + poolQueue.waitForAvailableInstance();
> + bean = pool.pop();
> + }
> +
> + if (bean == null) {
> +
> + Class beanClass = deploymentInfo.getBeanClass();
> + ObjectRecipe objectRecipe = new ObjectRecipe(beanClass);
> + objectRecipe.allow(Option.FIELD_INJECTION);
> + objectRecipe.allow(Option.PRIVATE_PROPERTIES);
> + objectRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
> +
> + Operation originalOperation = callContext.getCurrentOperation();
> + BaseContext.State[] originalAllowedStates = \
> callContext.getCurrentAllowedStates(); +
> + try {
> + Context ctx = deploymentInfo.getJndiEnc();
> + SessionContext sessionContext;
> + // This needs to be synchronized as this code is multi-threaded.
> + // In between the lookup and the bind a bind may take place in \
> another Thread. + // This is a fix for GERONIMO-3444
> + synchronized(this){
> + try {
> + sessionContext = (SessionContext) \
> ctx.lookup("java:comp/EJBContext"); + } catch (NamingException \
> e1) { + sessionContext = createSessionContext();
> + // TODO: This should work
> + ctx.bind("java:comp/EJBContext", sessionContext);
> + }
> + }
> + if (javax.ejb.SessionBean.class.isAssignableFrom(beanClass) || \
> hasSetSessionContext(beanClass)) { + \
> callContext.setCurrentOperation(Operation.INJECTION); + \
> callContext.setCurrentAllowedStates(StatelessContext.getStates()); + \
> objectRecipe.setProperty("sessionContext", new StaticRecipe(sessionContext)); + \
> } +
> + WebServiceContext wsContext;
> + // This is a fix for GERONIMO-3444
> + synchronized(this){
> + try {
> + wsContext = (WebServiceContext) \
> ctx.lookup("java:comp/WebServiceContext"); + } catch \
> (NamingException e) { + wsContext = new \
> EjbWsContext(sessionContext); + \
> ctx.bind("java:comp/WebServiceContext", wsContext); + }
> + }
> +
> + fillInjectionProperties(objectRecipe, beanClass, deploymentInfo, \
> ctx); +
> + bean = objectRecipe.create(beanClass.getClassLoader());
> + Map unsetProperties = objectRecipe.getUnsetProperties();
> + if (unsetProperties.size() > 0) {
> + for (Object property : unsetProperties.keySet()) {
> + logger.warning("Injection: No such property '" + property \
> + "' in class " + beanClass.getName()); + }
> + }
> +
> + HashMap<String, Object> interceptorInstances = new HashMap<String, \
> Object>(); + for (InterceptorData interceptorData : \
> deploymentInfo.getAllInterceptors()) { + if \
> (interceptorData.getInterceptorClass().equals(beanClass)) continue; +
> + Class clazz = interceptorData.getInterceptorClass();
> + ObjectRecipe interceptorRecipe = new ObjectRecipe(clazz);
> + interceptorRecipe.allow(Option.FIELD_INJECTION);
> + interceptorRecipe.allow(Option.PRIVATE_PROPERTIES);
> + interceptorRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
> +
> + fillInjectionProperties(interceptorRecipe, clazz, \
> deploymentInfo, ctx); +
> + try {
> + Object interceptorInstance = \
> interceptorRecipe.create(clazz.getClassLoader()); + \
> interceptorInstances.put(clazz.getName(), interceptorInstance); + \
> } catch (ConstructionException e) { + throw new \
> Exception("Failed to create interceptor: " + clazz.getName(), e); + \
> } + }
> +
> + interceptorInstances.put(beanClass.getName(), bean);
> +
> +
> + try {
> + callContext.setCurrentOperation(Operation.POST_CONSTRUCT);
> + \
> callContext.setCurrentAllowedStates(StatelessContext.getStates()); +
> + List<InterceptorData> callbackInterceptors = \
> deploymentInfo.getCallbackInterceptors(); + InterceptorStack \
> interceptorStack = new InterceptorStack(bean, null, Operation.POST_CONSTRUCT, \
> callbackInterceptors, interceptorInstances); + \
> interceptorStack.invoke(); + } catch (Exception e) {
> + throw e;
> + }
> +
> + try {
> + if (bean instanceof SessionBean){
> + callContext.setCurrentOperation(Operation.CREATE);
> + \
> callContext.setCurrentAllowedStates(StatelessContext.getStates()); + \
> Method create = deploymentInfo.getCreateMethod(); + \
> InterceptorStack interceptorStack = new InterceptorStack(bean, create, \
> Operation.CREATE, new ArrayList<InterceptorData>(), new HashMap()); + \
> interceptorStack.invoke(); + }
> + } catch (Exception e) {
> + throw e;
> + }
> +
> + bean = new Instance(bean, interceptorInstances);
> + } catch (Throwable e) {
> + if (e instanceof java.lang.reflect.InvocationTargetException) {
> + e = ((java.lang.reflect.InvocationTargetException) \
> e).getTargetException(); + }
> + String t = "The bean instance " + bean + " threw a system \
> exception:" + e; + logger.error(t, e);
> + throw new org.apache.openejb.ApplicationException(new \
> RemoteException("Cannot obtain a free instance.", e)); + } finally {
> + callContext.setCurrentOperation(originalOperation);
> + callContext.setCurrentAllowedStates(originalAllowedStates);
> + }
> + }
> + return bean;
> + }
> +
> + private static void fillInjectionProperties(ObjectRecipe objectRecipe, Class \
> clazz, CoreDeploymentInfo deploymentInfo, Context context) { + for \
> (Injection injection : deploymentInfo.getInjections()) { + if \
> (!injection.getTarget().isAssignableFrom(clazz)) continue; + try {
> + String jndiName = injection.getJndiName();
> + Object object = context.lookup("java:comp/env/" + jndiName);
> + if (object instanceof String) {
> + String string = (String) object;
> + // Pass it in raw so it could be potentially converted to
> + // another data type by an xbean-reflect property editor
> + objectRecipe.setProperty(injection.getTarget().getName() + "/" \
> + injection.getName(), string); + } else {
> + objectRecipe.setProperty(injection.getTarget().getName() + "/" \
> + injection.getName(), new StaticRecipe(object)); + }
> + } catch (NamingException e) {
> + logger.warning("Injection data not found in enc: jndiName='" + \
> injection.getJndiName() + "', target=" + injection.getTarget() + "/" + \
> injection.getName()); + }
> + }
> + }
> +
> + private boolean hasSetSessionContext(Class beanClass) {
> + try {
> + beanClass.getMethod("setSessionContext", SessionContext.class);
> + return true;
> + } catch (NoSuchMethodException e) {
> + return false;
> + }
> + }
> +
> + private SessionContext createSessionContext() {
> + return new StatelessContext(transactionManager, securityService);
> + }
> +
> + /**
> + * All instances are removed from the pool in getInstance(...). They are only
> + * returned by the StatelessContainer via this method under two circumstances.
> + *
> + * 1. The business method returns normally
> + * 2. The business method throws an application exception
> + *
> + * Instances are not returned to the pool if the business method threw a \
> system + * exception.
> + *
> + * @param callContext
> + * @param bean
> + * @throws OpenEJBException
> + */
> + public void poolInstance(ThreadContext callContext, Object bean) throws \
> OpenEJBException { + if (bean == null) {
> + throw new SystemException("Invalid arguments");
> + }
> +
> + CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> + Data data = (Data) deploymentInfo.getContainerData();
> + Stack pool = data.getPool();
> +
> + if (strictPooling) {
> + pool.push(bean);
> + poolQueue.notifyWaitingThreads();
> + } else {
> + if (pool.size() >= poolLimit) {
> + freeInstance(callContext, (Instance)bean);
> + } else {
> + pool.push(bean);
> + }
> + }
> + }
> +
> + private void freeInstance(ThreadContext callContext, Instance instance) {
> + try {
> + callContext.setCurrentOperation(Operation.PRE_DESTROY);
> + callContext.setCurrentAllowedStates(StatelessContext.getStates());
> + CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
> +
> + Method remove = instance.bean instanceof SessionBean? \
> deploymentInfo.getCreateMethod(): null; +
> + List<InterceptorData> callbackInterceptors = \
> deploymentInfo.getCallbackInterceptors(); + InterceptorStack \
> interceptorStack = new InterceptorStack(instance.bean, remove, \
> Operation.PRE_DESTROY, callbackInterceptors, instance.interceptors); +
> + interceptorStack.invoke();
> + } catch (Throwable re) {
> + logger.error("The bean instance " + instance + " threw a system \
> exception:" + re, re); + }
> +
> + }
> +
> + /**
> + * This method has no work to do as all instances are removed from
> + * the pool on getInstance(...) and not returned via poolInstance(...)
> + * if they threw a system exception.
> + *
> + * @param callContext
> + * @param bean
> + */
> + public void discardInstance(ThreadContext callContext, Object bean) {
> +
> + }
> +
> + public void deploy(CoreDeploymentInfo deploymentInfo) {
> + Data data = new Data(poolLimit);
> + deploymentInfo.setContainerData(data);
> + }
> +
> + public void undeploy(CoreDeploymentInfo deploymentInfo) {
> + Data data = (Data) deploymentInfo.getContainerData();
> + if (data == null) return;
> + Stack pool = data.getPool();
> + //TODO ejbRemove on each bean in pool.
> + //clean pool
> + deploymentInfo.setContainerData(null);
> + }
> +
> + static class PoolQueue {
> + private final long waitPeriod;
> +
> + public PoolQueue(long time) {
> + waitPeriod = time;
> + }
> +
> + public synchronized void waitForAvailableInstance()
> + throws org.apache.openejb.InvalidateReferenceException {
> + try {
> + wait(waitPeriod);
> + } catch (InterruptedException ie) {
> + throw new org.apache.openejb.InvalidateReferenceException(new \
> RemoteException("No instance available to service request", ie)); + }
> + }
> +
> + public synchronized void notifyWaitingThreads() {
> + notify();
> + }
> + }
> +
> + private static final class Data {
> + private final Stack pool;
> +
> + public Data(int poolLimit) {
> + pool = new LinkedListStack(poolLimit);
> + }
> +
> + public Stack getPool() {
> + return pool;
> + }
> + }
> +
> +}
>
>
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic