KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > jonas > resource > Rar


1 /**
2  * JOnAS: Java(TM) Open Application Server
3  * Copyright (C) 1999-2005 Bull S.A.
4  * Contact: jonas-team@objectweb.org
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  * USA
20  *
21  * --------------------------------------------------------------------------
22  * $Id: Rar.java,v 1.37 2005/04/29 11:18:34 benoitf Exp $
23  * --------------------------------------------------------------------------
24  */

25
26
27 package org.objectweb.jonas.resource;
28
29 import java.io.File JavaDoc;
30 import java.net.URL JavaDoc;
31 import java.util.Enumeration JavaDoc;
32 import java.util.Hashtable JavaDoc;
33 import java.util.Iterator JavaDoc;
34 import java.util.List JavaDoc;
35 import java.util.Properties JavaDoc;
36 import java.util.Vector JavaDoc;
37 import java.util.jar.JarEntry JavaDoc;
38
39 import javax.management.InstanceNotFoundException JavaDoc;
40 import javax.management.MBeanRegistrationException JavaDoc;
41 import javax.management.MBeanServer JavaDoc;
42 import javax.management.MalformedObjectNameException JavaDoc;
43 import javax.management.ObjectName JavaDoc;
44 import javax.management.modelmbean.ModelMBean JavaDoc;
45 import javax.naming.Context JavaDoc;
46 import javax.naming.InitialContext JavaDoc;
47 import javax.naming.NamingException JavaDoc;
48 import javax.resource.Referenceable JavaDoc;
49 import javax.resource.spi.ActivationSpec JavaDoc;
50 import javax.resource.spi.ConnectionManager JavaDoc;
51 import javax.resource.spi.ManagedConnectionFactory JavaDoc;
52 import javax.resource.spi.ResourceAdapter JavaDoc;
53 import javax.resource.spi.ResourceAdapterAssociation JavaDoc;
54 import javax.resource.spi.ResourceAllocationException JavaDoc;
55 import javax.resource.spi.work.WorkManager JavaDoc;
56
57 import org.apache.commons.modeler.ManagedBean;
58 import org.apache.commons.modeler.Registry;
59
60 import org.objectweb.transaction.jta.TransactionManager;
61
62 import org.objectweb.jonas_ejb.deployment.api.ActivationConfigPropertyDesc;
63
64 import org.objectweb.jonas_rar.deployment.api.AdminobjectDesc;
65 import org.objectweb.jonas_rar.deployment.api.AuthenticationMechanismDesc;
66 import org.objectweb.jonas_rar.deployment.api.ConfigPropertyDesc;
67 import org.objectweb.jonas_rar.deployment.api.ConnectionDefinitionDesc;
68 import org.objectweb.jonas_rar.deployment.api.ConnectorDesc;
69 import org.objectweb.jonas_rar.deployment.api.InboundResourceadapterDesc;
70 import org.objectweb.jonas_rar.deployment.api.JonasActivationspecDesc;
71 import org.objectweb.jonas_rar.deployment.api.JonasAdminobjectDesc;
72 import org.objectweb.jonas_rar.deployment.api.JonasConnectionDefinitionDesc;
73 import org.objectweb.jonas_rar.deployment.api.JonasConnectorDesc;
74 import org.objectweb.jonas_rar.deployment.api.MessageadapterDesc;
75 import org.objectweb.jonas_rar.deployment.api.MessagelistenerDesc;
76 import org.objectweb.jonas_rar.deployment.api.OutboundResourceadapterDesc;
77 import org.objectweb.jonas_rar.deployment.api.RarDeploymentDesc;
78 import org.objectweb.jonas_rar.deployment.api.RequiredConfigPropertyDesc;
79 import org.objectweb.jonas_rar.deployment.api.ResourceadapterDesc;
80 import org.objectweb.jonas_rar.deployment.api.TmConfigPropertyDesc;
81 import org.objectweb.jonas_rar.deployment.lib.wrapper.RarManagerWrapper;
82
83 import org.objectweb.jonas.common.JJarFile;
84 import org.objectweb.jonas.common.Log;
85 import org.objectweb.jonas.ear.EarServiceImpl;
86 import org.objectweb.jonas.jmx.J2eeObjectName;
87 import org.objectweb.jonas.jmx.JmxService;
88 import org.objectweb.jonas.jmx.JonasObjectName;
89 import org.objectweb.jonas.jtm.TransactionService;
90 import org.objectweb.jonas.management.JonasMBeanTools;
91 import org.objectweb.jonas.service.ServiceException;
92 import org.objectweb.jonas.service.ServiceManager;
93
94 import org.objectweb.util.monolog.api.BasicLevel;
95 import org.objectweb.util.monolog.api.Logger;
96
97 /**
98  * Rar object
99  * @author Eric Hardesty
100  */

101
102 public class Rar {
103
104     /**
105      * Main logger
106      */

107     private static Logger logger = null;
108     /**
109      * Pool infomation logger
110      */

111     private static Logger poolLogger = null;
112     /**
113      * Config property setter logger
114      */

115     private static Logger setterLogger = null;
116     /**
117      * Management logger
118      */

119     private static Logger manageLogger = null;
120
121     String JavaDoc rarFileName = null;
122     ClassLoader JavaDoc curLoader = null;
123     boolean isInEar;
124     URL JavaDoc earUrl = null;
125     Context JavaDoc rCtx = null;
126     String JavaDoc jDomain = null;
127     String JavaDoc jServer = null;
128     Vector JavaDoc jndinames = new Vector JavaDoc();
129
130     String JavaDoc lnkJndiName = "";
131     String JavaDoc lnkRarFilename = "";
132
133     JCAResource jcaResourceMBean = null;
134     String JavaDoc JCAResourceName = null;
135     Registry oRegistry = null;
136
137     // J2EE CA 1.5 objects
138
private WorkManager JavaDoc workMgr = null;
139     private ResourceBootstrapContext bootCtx = null;
140
141     // Properties for inits
142

143     // JCA resource service configuration parameters
144
public static final String JavaDoc CLASS = "jonas.service.resource.class";
145     public static final String JavaDoc JNDI_NAME = "jndiname";
146     public static final String JavaDoc RAR_FILENAME = "rarfilename";
147     public static final String JavaDoc LNK_JNDI_NAME = "lnkjndiname";
148     public static final String JavaDoc LNK_RAR_FILENAME = "lnkrarfilename";
149     public static final String JavaDoc OBJ_TYPE = "objtype";
150     public static final String JavaDoc RESOURCE_LIST = "jonas.service.resource.resources";
151
152     public static final int DEF_WRK_THREADS = 5;
153     public static final int DEF_EXEC_TIME = 0;
154
155     public static final String JavaDoc JCD = "JCD";
156     public static final String JavaDoc JAS = "JAS";
157     public static final String JavaDoc JAO = "JAO";
158
159     public String JavaDoc objectName = null;
160     public String JavaDoc pathName = null;
161     public ResourceAdapter resAdp = null;
162     public ConnectorDesc raConn = null;
163     public JonasConnectorDesc lnkJonasConn = null;
164     public JonasConnectorDesc jonasConn = null;
165
166     public String JavaDoc xmlContent = null;
167     public String JavaDoc jonasXmlContent = null;
168
169
170     private class ConfigObj {
171         public String JavaDoc type;
172         public int offset;
173         public String JavaDoc jndiName;
174         public String JavaDoc rarFilename;
175         public String JavaDoc lnkJndiName;
176         public String JavaDoc lnkRarFilename;
177         public String JavaDoc interfaceStr;
178         public String JavaDoc classStr;
179         public Object JavaDoc factory;
180         public ConnectionManager JavaDoc cm;
181         public boolean basicPass;
182         public boolean defaultAS;
183         public List JavaDoc reqConfigProps;
184         public ConfigObj(String JavaDoc fType, int off, String JavaDoc jndi, String JavaDoc fName,
185                           String JavaDoc intStr, String JavaDoc clsStr, Object JavaDoc fact) {
186             type = fType;
187             offset = off;
188             jndiName = jndi;
189             rarFilename = fName;
190             interfaceStr = intStr;
191             classStr = clsStr;
192             factory = fact;
193             cm = null;
194             reqConfigProps = null;
195             lnkJndiName = "";
196             lnkRarFilename = "";
197             defaultAS = false;
198         }
199     }
200
201     /**
202      * Hold list of default ActivationSpecs
203      */

204     private static Vector JavaDoc defaultAS = new Vector JavaDoc();
205
206     /**
207      * Hashtable mapping a filename to an RAR object
208      */

209     public static Hashtable JavaDoc fileName2RA = new Hashtable JavaDoc();
210     /**
211      * These hashtables associate an RAR with other objects
212      */

213     public static Hashtable JavaDoc jndiName2RA = new Hashtable JavaDoc();
214
215     private Hashtable JavaDoc cfgObjs = new Hashtable JavaDoc();
216     /**
217      * Hashtable mapping a jndiname to an "external" factory
218      */

219     private static Hashtable JavaDoc jndiName2Factory = new Hashtable JavaDoc();
220
221     /**
222      * The transaction manager in the server
223      */

224     private TransactionManager tm = null;
225
226     /**
227      * Reference to a MBean server.
228      */

229     private MBeanServer JavaDoc mbeanServer = null;
230
231     /**
232      * ObjectName for the jcaResource
233      */

234     private String JavaDoc jcaResourceObjectName = null;
235
236     /**
237      * The ConnectionManager manages connections of resource adapters
238      * and more exactly the association between logical connections,
239      * physical connections, local transactions and global transaction(XA)
240      */

241     private ConnectionManagerImpl cm = null;
242
243     /**
244      * JNDI Context
245      */

246     private Context JavaDoc ictx = null;
247
248     /**
249      * Resource Utility factory
250      */

251     ResourceUtility ru = null;
252
253     /**
254      * - Get the loggers
255      * - Get the global jndi context
256      * - Get the list of the resource adapters. The list is reachable in the
257      * - context parameter under the name RESOURCE_LIST.
258      * - Get the transaction manager into the jndi
259      * - Set the XML validation property
260      */

261     public Rar() {
262         if (logger == null) {
263             logger = Log.getLogger(Log.JONAS_JCA_PREFIX+".process");
264         }
265         if (poolLogger == null) {
266             poolLogger = Log.getLogger(Log.JONAS_JCA_PREFIX+".pool");
267         }
268         if (setterLogger == null) {
269             setterLogger = Log.getLogger(Log.JONAS_JCA_PREFIX+".setters");
270         }
271         if (manageLogger == null) {
272             manageLogger = Log.getLogger(Log.JONAS_JCA_PREFIX+".management");
273         }
274
275         curLoader = Thread.currentThread().getContextClassLoader();
276
277         ru = new ResourceUtility(null, null, logger, setterLogger, manageLogger);
278     }
279
280     /**
281      * - Get the loggers
282      * - Get the global jndi context
283      * - Get the list of the resource adapters. The list is reachable in the
284      * - context parameter under the name RESOURCE_LIST.
285      * - Get the transaction manager into the jndi
286      * - Set the XML validation property
287      */

288     public Rar(Context JavaDoc ctx, String JavaDoc jDom, String JavaDoc jServ,
289                 WorkManager JavaDoc wrkMgr, ResourceBootstrapContext btCtx) {
290         if (logger == null) {
291             logger = Log.getLogger(Log.JONAS_JCA_PREFIX + ".process");
292         }
293         if (poolLogger == null) {
294             poolLogger = Log.getLogger(Log.JONAS_JCA_PREFIX + ".pool");
295         }
296         if (setterLogger == null) {
297             setterLogger = Log.getLogger(Log.JONAS_JCA_PREFIX + ".setters");
298         }
299         if (manageLogger == null) {
300             manageLogger = Log.getLogger(Log.JONAS_JCA_PREFIX + ".management");
301         }
302
303         try {
304             rarFileName = (String JavaDoc) ctx.lookup("rarFileName");
305             isInEar = ((Boolean JavaDoc) ctx.lookup("isInEar")).booleanValue();
306             if (isInEar) {
307                 earUrl = (URL JavaDoc) ctx.lookup("earUrl");
308             }
309             curLoader = (ClassLoader JavaDoc) ctx.lookup("classloader");
310         } catch (NamingException JavaDoc e) {
311             String JavaDoc err = "Error while getting parameter from context param.";
312             logger.log(BasicLevel.ERROR, err + e.getMessage());
313             throw new ResourceServiceException(err, e);
314         } catch (Exception JavaDoc ex) {
315             String JavaDoc err = "Error while getting parameter from context param.";
316             logger.log(BasicLevel.ERROR, err + ex.getMessage());
317             throw new ResourceServiceException(err, ex);
318         }
319
320         workMgr = wrkMgr;
321         bootCtx = btCtx;
322         rCtx = ctx;
323         jDomain = jDom;
324         jServer = jServ;
325
326         // Avoid using NamingManager here: performance is not a goal here.
327
try {
328             ictx = new InitialContext JavaDoc();
329         } catch (NamingException JavaDoc e) {
330             logger.log(BasicLevel.ERROR, "Cannot create initial context when Resource service initializing");
331             throw new ServiceException("Cannot create initial context when Resource service initializing", e);
332         }
333
334         // Get a reference to the Transaction service
335
try {
336             ServiceManager sm = ServiceManager.getInstance();
337             TransactionService ts = (TransactionService) sm.getTransactionService();
338             tm = ts.getTransactionManager();
339         } catch (Exception JavaDoc e) {
340             logger.log(BasicLevel.ERROR, "Cannot get the Transaction service: " + e);
341             throw new ServiceException("Cannot get the Transaction service: ", e);
342         }
343
344         // Get the JMX Server via JMX Service
345
try {
346             mbeanServer =
347                 ((JmxService) ServiceManager.getInstance().getJmxService()).getJmxServer();
348         } catch (Exception JavaDoc e) {
349             // the JMX service may not be started
350
mbeanServer = null;
351         }
352
353         // Use Jakarta Common Modeler API
354
oRegistry = JonasMBeanTools.getRegistry();
355
356         ru = new ResourceUtility(mbeanServer, oRegistry, logger, setterLogger, manageLogger);
357     }
358
359     /**
360      * Process the resource adapter. This Resource Adapter is configured via
361      * xml files in the rar file
362      */

363     public Context JavaDoc processRar() throws Exception JavaDoc {
364
365         String JavaDoc onRar = null;
366         // Get the ra.xml and jonas-ra.xml descriptions
367
RarDeploymentDesc radesc = null;
368         ConnectorDesc conn = null;
369         JonasConnectorDesc jConn = null;
370         xmlContent = null;
371         jonasXmlContent = null;
372         ConnectionManager JavaDoc cm = null;
373         ManagedConnectionFactory JavaDoc mcf = null;
374
375         radesc = RarManagerWrapper.getInstance(rCtx);
376         conn = radesc.getConnectorDesc();
377         jConn = radesc.getJonasConnectorDesc();
378         xmlContent = radesc.getXmlContent();
379         jonasXmlContent = radesc.getJOnASXmlContent();
380
381         if(conn == null && jConn == null) {
382             logger.log(BasicLevel.ERROR, "Rar.processRar: Resource (" + rarFileName
383                                          + ") must be a valid RAR file.");
384             throw new Exception JavaDoc("resource input file incorrect");
385         }
386
387         // Need to check if rarlink is specified. If yes and has been processed, then get the correct
388
// Connector object and continue, if it has not been processed, then add this rar to the
389
// deferred list and it will be processed at end of the rar files. If no rarlink, then
390
// make sure that the connector object is valid.
391
String JavaDoc rarVal = null;
392         if (jConn != null) {
393             rarVal = (jConn.getRarlink() == null
394                       ? null
395                       : jConn.getRarlink());
396             if (rarVal != null && rarVal.length() > 0) {
397                 lnkJndiName = rarVal;
398                 conn = getConnectorDesc(rarVal);
399                 if (conn == null) {
400                     return rCtx;
401                 }
402                 ConfigObj co = (ConfigObj) getConfigObject(rarVal);
403                 lnkRarFilename = co.rarFilename;
404                 xmlContent = getXmlContent(rarVal);
405                 // Get the config parameters
406
lnkJonasConn = getJonasConnectorDesc(rarVal);
407             } else if (conn == null) {
408                 logger.log(BasicLevel.ERROR, "Rar.processRar: Resource (" + rarFileName
409                                              + ") is not valid.");
410                 throw new Exception JavaDoc("resource input file incorrect: no ra.xml file");
411             }
412             bldSecurityTable(lnkJonasConn, jConn);
413             raConn = conn;
414             jonasConn = jConn;
415         } else {
416             logger.log(BasicLevel.ERROR, "Rar.processRar: Resource (" + rarFileName
417                                          + ") must be a valid RAR file, there must be jonas-ra.xml file.");
418             throw new Exception JavaDoc("resource input file incorrect: no jonas-ra.xml file");
419         }
420
421         // Setup the global pool parameters
422
ConnectionManagerPoolParams pParams =
423                 ru.configurePoolParams(jConn.getPoolParamsDesc(),
424                                        jConn.getJdbcConnParamsDesc(),
425                                        null);
426
427         // Process the RAR file adding each of the jar files into the classloader and if the
428
// native-lib is defined then place all other files into that directory.
429

430         extractJars(rarFileName, jConn);
431
432         // Process the config values
433
ResourceadapterDesc ra = conn.getResourceadapterDesc();
434
435         // Check Authentication Mechanisms, must if some exist then BasicPassword
436
// must be present
437
boolean basicPass = true;
438         List JavaDoc authList = ra.getAuthenticationMechanismList();
439         if (authList != null && authList.size() > 0) {
440             basicPass = false;
441             for (Iterator JavaDoc i = authList.iterator(); i.hasNext();) {
442                 AuthenticationMechanismDesc am = (AuthenticationMechanismDesc) i.next();
443                 if (am.getAuthenticationMechanismType().equalsIgnoreCase("BasicPassword")) {
444                     basicPass = true;
445                     break;
446                 }
447             }
448             if (!basicPass) {
449                 logger.log(BasicLevel.ERROR, "Rar.processRar: Resource (" + rarFileName + ") doesn't contain an AuthenticationMechanismType that is supported by JOnAS(BasicPassword).");
450                 throw new Exception JavaDoc("No AuthenticationMechanismType that is supported by JOnAS(BasicPassword).");
451             }
452         }
453
454         ConfigPropertyDesc [] cfgRaJonas = null;
455
456         String JavaDoc logEnabled = null;
457         if (jConn.getLogEnabled() != null) {
458             logEnabled = jConn.getLogEnabled().trim();
459         }
460         String JavaDoc logTopic = null;
461         if (jConn.getLogTopic() != null) {
462             logTopic = jConn.getLogTopic().trim();
463         }
464
465         Referenceable JavaDoc cf = null;
466         String JavaDoc jndiName = null;
467         String JavaDoc mcfc = null;
468         ConfigObj cObj = null;
469
470         if (lnkJonasConn != null) {
471             cfgRaJonas = ru.buildConfigProperty(ra.getConfigPropertyList(),
472                                                 jConn.getJonasConfigPropertyList(),
473                                                 lnkJonasConn.getJonasConfigPropertyList());
474         } else {
475             cfgRaJonas = ru.buildConfigProperty(ra.getConfigPropertyList(),
476                                                 jConn.getJonasConfigPropertyList(),
477                                                 null);
478         }
479
480         Properties JavaDoc tmProp = new Properties JavaDoc();
481         if (jConn.getTmParamsDesc() != null) {
482             List JavaDoc tmParams = jConn.getTmParamsDesc().getTmConfigPropertyList();
483             if (tmParams != null) {
484                 for (Iterator JavaDoc i = tmParams.iterator(); i.hasNext();) {
485                     TmConfigPropertyDesc tpd = (TmConfigPropertyDesc) i.next();
486                     String JavaDoc tpdVal = tpd.getTmConfigPropertyValue();
487                     if (tpdVal == null) {
488                         tpdVal = "";
489                     }
490                     tmProp.setProperty(tpd.getTmConfigPropertyName(), tpdVal);
491                 }
492                 if (logger.isLoggable(BasicLevel.DEBUG)) {
493                     logger.log(BasicLevel.DEBUG, "TM Properties: " + tmProp);
494                 }
495             }
496         }
497
498         String JavaDoc specVersion = conn.getSpecVersion();
499         if (specVersion.equals("1.0")) {
500             jndiName = jConn.getJndiName().trim();
501             ConnectionManagerPoolParams cmpp = ru.configurePoolParams(jConn.getPoolParamsDesc(),
502                                                jConn.getJdbcConnParamsDesc(), null);
503             onRar = registerRarMBean(cfgRaJonas, specVersion, jndiName);
504             cm = ru.createConnectionManager(ra.getTransactionSupport(), tm,
505                                             logger, poolLogger);
506             // Only need to build an MCF for a 1.0 resource adapter
507
mcfc = ra.getManagedconnectionfactoryClass();
508             mcf = (ManagedConnectionFactory JavaDoc) ru.processMCF(conn, jConn, cm, curLoader, rarFileName,
509                                                            mcfc,
510                                                            jndiName, logEnabled, logTopic,
511                                                            cfgRaJonas, resAdp, 0);
512             ((ConnectionManagerImpl) cm).setResourceAdapter(mcf, cmpp);
513
514             cf = (Referenceable JavaDoc) mcf.createConnectionFactory(cm);
515
516             // Add entry to list of configured objects
517
cObj = new ConfigObj(JCD, 0, jndiName, rarFileName, null, mcfc, cf);
518             cObj.cm = cm;
519             cObj.basicPass = basicPass;
520
521             cfgObjs.put(jndiName, cObj);
522
523             jndinames.add(jndiName);
524
525             ru.registerMBean(cf, jndiName, onRar, conn, jonasConn, JCD, 0,
526                              jcaResourceMBean, JCAResourceName, jDomain, jServer, ictx,
527                              buildProp(cfgRaJonas), "", (ConnectionManagerImpl)cm);
528             ((ConnectionManagerImpl) cm).setXAName(ru.getJcaMcfName(jndiName));
529             ((ConnectionManagerImpl) cm).registerXAResource(tmProp);
530
531         } else if (conn.getSpecVersion().equals("1.5")) {
532             String JavaDoc raStr = conn.getResourceadapterDesc().getResourceadapterClass().trim();
533             boolean isResAdapt = false;
534             logger.log(BasicLevel.INFO, "Starting deployment of " + rarFileName);
535             if (raStr != null && raStr.length() > 0) {
536                 isResAdapt = true;
537
538                 // Instantiate the resource adapter class
539
Class JavaDoc raClass = curLoader.loadClass(raStr);
540                 resAdp = (ResourceAdapter) raClass.newInstance();
541
542                 ru.processSetters(raClass, resAdp, rarFileName, cfgRaJonas);
543
544                 // Call Resourceadapter start method
545
try {
546                     resAdp.start(bootCtx);
547                 } catch (Exception JavaDoc ex) {
548                     logger.log(BasicLevel.ERROR, "Rar: Error from resource ("
549                                                  + rarFileName + ") start method.");
550                     throw new Exception JavaDoc("Error from start method. " + ex);
551                 } catch (Throwable JavaDoc th) {
552                     logger.log(BasicLevel.ERROR, "Rar: Error from resource ("
553                                                  + rarFileName + ") start method.");
554                     throw new Exception JavaDoc("Error from start method. ", th);
555                 }
556             }
557
558             onRar = registerRarMBean(cfgRaJonas, specVersion, null);
559
560             // Loop thru ConnectionDefinition(outbound) factories
561
OutboundResourceadapterDesc outRa = ra.getOutboundResourceadapterDesc();
562             List JavaDoc cdList = null;
563             if (outRa != null) {
564                 cdList = outRa.getConnectionDefinitionList();
565             }
566             ConnectionDefinitionDesc conDef = null;
567             JonasConnectionDefinitionDesc jConDef = null;
568             String JavaDoc id = null;
569             int idOffset = -1;
570             if (cdList != null) {
571                 for (int cd = 0; cd < cdList.size(); cd++) {
572                     conDef = (ConnectionDefinitionDesc) cdList.get(cd);
573                     id = conDef.getId();
574                     idOffset++;
575                     jConDef = (JonasConnectionDefinitionDesc)
576                                ru.getJonasXML(jConn, id, idOffset, JCD);
577
578
579                     if (jConDef.getLogEnabled() != null) {
580                         logEnabled = jConDef.getLogEnabled().trim();
581                     }
582                     if (jConDef.getLogTopic() != null) {
583                         logTopic = jConDef.getLogTopic().trim();
584                     }
585                     ConfigPropertyDesc [] cfgCdDesc =
586                                  ru.buildConfigProperty(conDef.getConfigPropertyList(),
587                                                         jConDef.getJonasConfigPropertyList(),
588                                                         null);
589                     ConnectionManagerPoolParams pool =
590                         ru.configurePoolParams(jConDef.getPoolParamsDesc(),
591                                                jConDef.getJdbcConnParamsDesc(),
592                                                pParams);
593                     cm = ru.createConnectionManager(outRa.getTransactionSupport(), tm,
594                             logger, poolLogger);
595
596                     jndiName = jConDef.getJndiName().trim();
597                     mcfc = conDef.getManagedconnectionfactoryClass();
598                     mcf = (ManagedConnectionFactory JavaDoc)
599                                      ru.processMCF(conn, jConn, cm, curLoader, rarFileName,
600                                                    mcfc, jndiName, logEnabled, logTopic,
601                                                    cfgCdDesc, resAdp, idOffset);
602                     ((ConnectionManagerImpl) cm).setResourceAdapter(mcf, pool);
603
604                     cf = (Referenceable JavaDoc) mcf.createConnectionFactory(cm);
605
606                     // Add entry to list of configured objects
607
cObj = new ConfigObj(JCD, idOffset, jndiName, rarFileName, null, mcfc, cf);
608                     cObj.cm = cm;
609                     cObj.basicPass = basicPass;
610
611                     cfgObjs.put(jndiName, cObj);
612
613                     jndinames.add(jndiName);
614
615                     String JavaDoc desc = "";
616                     List JavaDoc descList = jConDef.getDescriptionList();
617                     if (descList != null) {
618                         for (int i = 0; i < descList.size(); i++) {
619                             String JavaDoc tmp = (String JavaDoc) descList.get(i);
620                             desc = desc + tmp;
621                         }
622                     }
623                     ru.registerMBean(cf, jndiName, onRar, conn, jonasConn, JCD, idOffset,
624                             jcaResourceMBean, JCAResourceName, jDomain, jServer, ictx,
625                             buildProp(cfgCdDesc), desc, (ConnectionManagerImpl)cm);
626
627                     ((ConnectionManagerImpl) cm).setXAName(ru.getJcaMcfName(jndiName));
628                     ((ConnectionManagerImpl) cm).registerXAResource(tmProp);
629                 }
630             }
631
632             // We only want to do anything with Inbound or Adminobjects if the Resourceadapter
633
// class was specified, otherwise it is a 1.0 RAR with a 1.5 ra.xml
634
if (isResAdapt) {
635                 // Loop thru Messagelisteners (inbound) factories
636
InboundResourceadapterDesc inAdapt = ra.getInboundResourceadapterDesc();
637                 MessageadapterDesc msgAdapt = null;
638                 List JavaDoc mlList = null;
639                 if (inAdapt != null) {
640                     msgAdapt = inAdapt.getMessageadapterDesc();
641                     mlList = null;
642                     if (msgAdapt != null) {
643                         mlList = msgAdapt.getMessagelistenerList();
644                     }
645                 }
646                 MessagelistenerDesc msgList = null;
647                 JonasActivationspecDesc jAct = null;
648                 id = null;
649                 idOffset = -1;
650                 if (mlList != null) {
651                     for (int ml = 0; ml < mlList.size(); ml++) {
652 &nbs