package org.neo4j.kernel.impl.management;
import java.util.ArrayList;
import java.util.List;
import javax.management.NotCompliantMBeanException;
import org.neo4j.helpers.Service;
import org.neo4j.kernel.KernelExtension.KernelData;
import org.neo4j.kernel.impl.transaction.XaDataSourceManager;
import org.neo4j.kernel.impl.transaction.xaframework.XaDataSource;
import org.neo4j.kernel.management.XaManager;
import org.neo4j.kernel.management.XaResourceInfo;
@Service.Implementation( ManagementBeanProvider.class )
public final class XaManagerBean extends ManagementBeanProvider
{
public XaManagerBean()
{
super( XaManager.class );
}
@Override
protected Neo4jMBean createMBean( KernelData kernel ) throws NotCompliantMBeanException
{
return new XaManagerImpl( null, kernel );
}
@Override
protected Neo4jMBean createMXBean( KernelData kernel ) throws NotCompliantMBeanException
{
return new XaManagerImpl( this, kernel, true );
}
@Description( "Information about the XA transaction manager" )
private static class XaManagerImpl extends Neo4jMBean implements XaManager
{
private final XaDataSourceManager datasourceMananger;
XaManagerImpl( ManagementBeanProvider provider, KernelData kernel )
throws NotCompliantMBeanException
{
super( provider, kernel );
this.datasourceMananger = kernel.getConfig().getTxModule().getXaDataSourceManager();
}
XaManagerImpl( XaManagerBean provider, KernelData kernel, boolean isMxBean )
{
super( provider, kernel, isMxBean );
this.datasourceMananger = kernel.getConfig().getTxModule().getXaDataSourceManager();
}
@Description( "Information about all XA resources managed by the transaction manager" )
public XaResourceInfo[] getXaResources()
{
return getXaResourcesImpl( datasourceMananger );
}
private static XaResourceInfo[] getXaResourcesImpl( XaDataSourceManager datasourceMananger )
{
List<XaResourceInfo> result = new ArrayList<XaResourceInfo>();
for ( XaDataSource datasource : datasourceMananger.getAllRegisteredDataSources() )
{
result.add( createXaResourceInfo( datasource ) );
}
return result.toArray( new XaResourceInfo[result.size()] );
}
private static XaResourceInfo createXaResourceInfo( XaDataSource datasource )
{
return new XaResourceInfo( datasource.getName(), toHexString( datasource.getBranchId() ) );
}
private static String toHexString( byte[] branchId )
{
StringBuilder result = new StringBuilder();
for ( byte part : branchId )
{
String chunk = Integer.toHexString( part );
if ( chunk.length() < 2 ) result.append( "0" );
if ( chunk.length() > 2 )
result.append( chunk.substring( chunk.length() - 2 ) );
else
result.append( chunk );
}
return result.toString();
}
}
}