This example is a fully working DTFJ application.
For clarity, this example does not perform full error checking when constructing the main Image object and does not perform CorruptData handling in all of the iterators. In a production environment, you use the techniques illustrated in the example in the Using the DTFJ interface.
In this example, the program iterates through every available Java™ thread and checks whether it is equal to any of the available image threads. When they are found to be equal, the program declares that it has, in this case, "Found a match".
import java.io.File; import java.util.Iterator; import com.ibm.dtfj.image.CorruptData; import com.ibm.dtfj.image.CorruptDataException; import com.ibm.dtfj.image.DataUnavailable; import com.ibm.dtfj.image.Image; import com.ibm.dtfj.image.ImageAddressSpace; import com.ibm.dtfj.image.ImageFactory; import com.ibm.dtfj.image.ImageProcess; import com.ibm.dtfj.java.JavaRuntime; import com.ibm.dtfj.java.JavaThread; import com.ibm.dtfj.image.ImageThread; public class DTFJEX2 { public static void main( String[] args ) { Image image = null; if ( args.length > 0 ) { File f = new File( args[0] ); try { Class factoryClass = Class .forName( "com.ibm.dtfj.image.j9.ImageFactory" ); ImageFactory factory = (ImageFactory) factoryClass.newInstance( ); image = factory.getImage( f ); } catch ( Exception ex ) { /* * Should use the error handling as shown in DTFJEX1. */ System.err.println( "Error in DTFJEX2" ); ex.printStackTrace( System.err ); } } else { System.err.println( "No filename specified" ); } if ( null == image ) { return; } MatchingThreads( image ); } public static void MatchingThreads( Image image ) { ImageThread imgThread = null; Iterator asIt = image.getAddressSpaces( ); while ( asIt.hasNext( ) ) { System.out.println( "Found ImageAddressSpace..." ); ImageAddressSpace as = (ImageAddressSpace) asIt.next( ); Iterator prIt = as.getProcesses( ); while ( prIt.hasNext( ) ) { System.out.println( "Found ImageProcess..." ); ImageProcess process = (ImageProcess) prIt.next( ); Iterator runTimesIt = process.getRuntimes( ); while ( runTimesIt.hasNext( ) ) { System.out.println( "Found Runtime..." ); JavaRuntime javaRT = (JavaRuntime) runTimesIt.next( ); Iterator javaThreadIt = javaRT.getThreads( ); while ( javaThreadIt.hasNext( ) ) { Object tempObj = javaThreadIt.next( ); /* * Should use CorruptData handling for all iterators */ if ( tempObj instanceof CorruptData ) { System.out.println( "We have some corrupt data" ); } else { JavaThread javaThread = (JavaThread) tempObj; System.out.println( "Found JavaThread..." ); try { imgThread = (ImageThread) javaThread.getImageThread( ); // Now we have a Java thread we can iterator // through the image threads Iterator imgThreadIt = process.getThreads( ); while ( imgThreadIt.hasNext( ) ) { ImageThread imgThread2 = (ImageThread) imgThreadIt .next( ); if ( imgThread.equals( imgThread2 ) ) { System.out.println( "Found a match:" ); System.out.println( "\tjavaThread " + javaThread.getName( ) + " is the same as " + imgThread2.getID( ) ); } } } catch ( CorruptDataException e ) { System.err.println( "ImageThread was corrupt: " + e.getMessage( ) ); } catch ( DataUnavailable e ) { System.out.println( "DataUnavailable: " + e.getMessage( ) ); } } } } } } } }
Many DTFJ applications will follow similar models.