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;
}
}