public TransactionControlImpl()

in tx-control-services/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java [64:146]


	public TransactionControlImpl(BundleContext ctx, Map<String, Object> config) throws Exception {
		
		try {
			this.config = config;
			this.localResourceSupport = getLocalResourceSupport();
			xidFactory = new XidFactoryImpl();
			log = getLog(ctx);
			
			if(log != null) {
				log.doStart();
			}
			
			transactionManager = new RecoveryWorkAroundTransactionManager(getTimeout(),
					xidFactory, log);
			
			if(log != null) {
				recoverableResources = 
						new ServiceTracker<RecoverableXAResource, RecoverableXAResource>(
								ctx, RecoverableXAResource.class, null) {

									@Override
									public RecoverableXAResource addingService(
											ServiceReference<RecoverableXAResource> reference) {
										RecoverableXAResource resource = super.addingService(reference);
										
										if(resource.getId() == null) {
											logger.warn("The RecoverableXAResource service with id {} does not have a name and will be ignored", 
													reference.getProperty("service.id"));
											return null;
										}
										
										if(log == null) {
											logger.warn("A RecoverableXAResource with id {} has been registered, but recovery logging is disabled for this Transaction Control service. No recovery will be availble in the event of a Transaction Manager failure.", resource.getId());
										}
										
										transactionManager.registerNamedXAResourceFactory(new NamedXAResourceFactory() {
											
											@Override
											public void returnNamedXAResource(NamedXAResource namedXAResource) {
												resource.releaseXAResource(((NamedXAResourceImpl)namedXAResource).xaResource);
											}
											
											@Override
											public NamedXAResource getNamedXAResource() throws SystemException {
												try {
													XAResource xaResource = resource.getXAResource();
													if(xaResource == null) {
														throw new IllegalStateException("The recoverable resource " + resource.getId() 
														+ " is currently unavailable");
													}
													return new NamedXAResourceImpl(resource.getId(), xaResource,
															transactionManager, false);
												} catch (Exception e) {
													throw new SystemException("Unable to get recoverable resource " + 
															resource.getId() + ": " + e.getMessage());
												}
											}
											
											@Override
											public String getName() {
												return resource.getId();
											}
										});
										
										return resource;
									}

									@Override
									public void removedService(ServiceReference<RecoverableXAResource> reference,
											RecoverableXAResource service) {
										transactionManager.unregisterNamedXAResourceFactory(service.getId());
									}
					
								};
				recoverableResources.open();
			} else {
				recoverableResources = null;
			}
		} catch (Exception e) {
			close();
			throw e;
		}
	}