001 /**
002 *
003 * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.jencks.factory;
019
020 import java.util.Collection;
021 import java.util.Map;
022
023 import javax.resource.spi.BootstrapContext;
024 import javax.resource.spi.work.WorkManager;
025 import javax.transaction.xa.XAException;
026
027 import org.apache.geronimo.connector.work.GeronimoWorkManager;
028 import org.apache.geronimo.transaction.ExtendedTransactionManager;
029 import org.apache.geronimo.transaction.context.TransactionContextManager;
030 import org.apache.geronimo.transaction.log.UnrecoverableLog;
031 import org.apache.geronimo.transaction.manager.TransactionLog;
032 import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
033 import org.apache.geronimo.transaction.manager.XidImporter;
034 import org.springframework.beans.factory.FactoryBean;
035 import org.springframework.beans.factory.InitializingBean;
036 import org.springframework.context.ApplicationContext;
037 import org.springframework.context.ApplicationContextAware;
038
039 /**
040 * A Spring {@link FactoryBean} for creating a {@link BootstrapContext} for the JCA container
041 * with the {@link WorkManager} and {@link ExtendedTransactionManager}.
042 *
043 * @version $Revision: 1.5 $
044 */
045 public class WorkManagerFactoryBean implements FactoryBean, InitializingBean, ApplicationContextAware {
046
047 private ApplicationContext applicationContext;
048 private GeronimoWorkManager workManager;
049 private TransactionContextManager transactionContextManager;
050 private int threadPoolSize = 30;
051 private ExtendedTransactionManager transactionManager;
052 private XidImporter xidImporter;
053 private int defaultTransactionTimeoutSeconds = 600;
054 private TransactionLog transactionLog;
055 private Collection resourceManagers;
056
057 public Object getObject() throws Exception {
058 return workManager;
059 }
060
061 public Class getObjectType() {
062 return WorkManager.class;
063 }
064
065 public boolean isSingleton() {
066 return true;
067 }
068
069 public void setApplicationContext(ApplicationContext applicationContext) {
070 this.applicationContext = applicationContext;
071 }
072
073 public void afterPropertiesSet() throws Exception {
074 workManager = createWorkManager();
075 workManager.doStart();
076 }
077
078 public GeronimoWorkManager getWorkManager() throws Exception {
079 if (workManager == null) {
080 afterPropertiesSet();
081 }
082 return workManager;
083 }
084
085 public TransactionContextManager getTransactionContextManager() throws XAException {
086 if (transactionContextManager == null && applicationContext != null) {
087 Map map = applicationContext.getBeansOfType(TransactionContextManager.class);
088 if (map.size() > 1) {
089 throw new IllegalStateException("only one TransactionContextManager can be registered");
090 } else if (map.size() == 1) {
091 transactionContextManager = (TransactionContextManager) map.values().iterator().next();
092 }
093 }
094 if (transactionContextManager == null) {
095 transactionContextManager = createTransactionContextManager();
096 }
097 return transactionContextManager;
098 }
099
100 public void setTransactionContextManager(TransactionContextManager transactionContextManager) {
101 this.transactionContextManager = transactionContextManager;
102 }
103
104 public int getThreadPoolSize() {
105 return threadPoolSize;
106 }
107
108 public void setThreadPoolSize(int threadPoolSize) {
109 this.threadPoolSize = threadPoolSize;
110 }
111
112 public ExtendedTransactionManager getTransactionManager() throws XAException {
113 if (transactionManager == null && applicationContext != null) {
114 Map map = applicationContext.getBeansOfType(ExtendedTransactionManager.class);
115 if (map.size() > 1) {
116 throw new IllegalStateException("only one ExtendedTransactionManager can be registered");
117 } else if (map.size() == 1) {
118 transactionManager = (ExtendedTransactionManager) map.values().iterator().next();
119 }
120 }
121 if (transactionManager == null) {
122 transactionManager = new TransactionManagerImpl(getDefaultTransactionTimeoutSeconds(), getTransactionLog(), getResourceManagers());
123 }
124 return transactionManager;
125 }
126
127 public void setTransactionManager(ExtendedTransactionManager transactionManager) {
128 this.transactionManager = transactionManager;
129 }
130
131 public XidImporter getXidImporter() {
132 if (xidImporter == null && transactionManager instanceof XidImporter) {
133 xidImporter = (XidImporter) transactionManager;
134 }
135 return xidImporter;
136 }
137
138 public void setXidImporter(XidImporter xidImporter) {
139 this.xidImporter = xidImporter;
140 }
141
142 public int getDefaultTransactionTimeoutSeconds() {
143 return defaultTransactionTimeoutSeconds;
144 }
145
146 public void setDefaultTransactionTimeoutSeconds(int defaultTransactionTimeoutSeconds) {
147 this.defaultTransactionTimeoutSeconds = defaultTransactionTimeoutSeconds;
148 }
149
150 public TransactionLog getTransactionLog() {
151 if (transactionLog == null) {
152 transactionLog = new UnrecoverableLog();
153 }
154 return transactionLog;
155 }
156
157 public void setTransactionLog(TransactionLog transactionLog) {
158 this.transactionLog = transactionLog;
159 }
160
161 public Collection getResourceManagers() {
162 return resourceManagers;
163 }
164
165 public void setResourceManagers(Collection resourceManagers) {
166 this.resourceManagers = resourceManagers;
167 }
168
169 // Implementation methods
170 //-------------------------------------------------------------------------
171 protected TransactionContextManager createTransactionContextManager() throws XAException {
172 return new TransactionContextManager(getTransactionManager(), getXidImporter());
173 }
174
175 protected GeronimoWorkManager createWorkManager() throws XAException {
176 return new GeronimoWorkManager(getThreadPoolSize(), getTransactionContextManager());
177 }
178 }