You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by mo...@apache.org on 2009/05/07 14:50:35 UTC

svn commit: r772669 [2/7] - in /incubator/kato/trunk: HprofBinaryReaderPOC/ HprofBinaryReaderPOC/.settings/ HprofBinaryReaderPOC/META-INF/ HprofBinaryReaderPOC/bin/ HprofBinaryReaderPOC/bin/org/ HprofBinaryReaderPOC/bin/org/apache/ HprofBinaryReaderPOC...

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/IUnloadClassHProfRecord.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/IUnloadClassHProfRecord.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/IUnloadClassHProfRecord.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/InstanceFieldEntry.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/InstanceFieldEntry.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/InstanceFieldEntry.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/RandomAccesDataProvider.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/RandomAccesDataProvider.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/RandomAccesDataProvider.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/StaticFieldEntry.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/StaticFieldEntry.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/org/apache/kato/hprof/datalayer/StaticFieldEntry.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/AllTests.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/AllTests.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/AllTests.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayBitMaskMappingStrategy.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayBitMaskMappingStrategy.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayBitMaskMappingStrategy.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayCompactor.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayCompactor.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestArrayCompactor.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray$MockArrayEntryProvider.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray%24MockArrayEntryProvider.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray$MockArrayEntryProvider.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestBitMaskMappingArray.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestDataReader.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestDataReader.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestDataReader.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider$MockDataProvider.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider%24MockDataProvider.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider$MockDataProvider.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/common/TestSubsetDataProvider.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestHProf.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestHProf.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestHProf.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestSetup.class
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestSetup.class?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/bin/test/apache/kato/hprof/TestSetup.class
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/data/dumpall.hprof
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/data/dumpall.hprof?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/data/dumpall.hprof
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/data/gen.txt
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/data/gen.txt?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/data/gen.txt (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/data/gen.txt Thu May  7 14:50:21 2009
@@ -0,0 +1 @@
+ java -agentlib:hprof=heap=dump,format=b
\ No newline at end of file

Added: incubator/kato/trunk/HprofBinaryReaderPOC/data/java.hprof
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/data/java.hprof?rev=772669&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/kato/trunk/HprofBinaryReaderPOC/data/java.hprof
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayBitMaskMappingStrategy.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayBitMaskMappingStrategy.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayBitMaskMappingStrategy.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayBitMaskMappingStrategy.java Thu May  7 14:50:21 2009
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+public class  ArrayBitMaskMappingStrategy {
+	
+	private int arraySize=0;
+	private int bitshift=0;
+	private int bucketSize=0; 
+	private int mask=0;
+	
+	public ArrayBitMaskMappingStrategy(int arraySize,int bucketSize) {
+		
+		this.arraySize=arraySize;
+		bitshift=(int) (Math.log10(bucketSize-1)/Math.log10(2));
+		mask   = (1 << (bitshift+1))-1;
+		this.bucketSize = mask+1;
+	}
+
+	
+	public ArrayBitMaskMappingStrategy  doubleCapacity() {
+		
+		if(bucketSize*2<2) return null;
+		
+		return new ArrayBitMaskMappingStrategy(arraySize,bucketSize*2);
+	}
+	
+	public int getArraySize() {
+		return arraySize;
+	}
+
+	public int getBitshift() {
+		return bitshift;
+	}
+
+	public int getBucketSize() {
+		return bucketSize;
+	}
+
+	
+	/**
+	 * Returns -1 if index does not map to an array element 
+	 * 
+	 * @param index
+	 * @return element array no or -1
+	 */
+	public int getIndexArrayElement(int index) {
+		
+		int loc= index >> (bitshift+1);
+		if(loc>=arraySize) return -1;
+		return loc;
+	}
+
+	/**
+	 * Returns -1 if index does not map to an array element 
+	 * 
+	 * @param index
+	 * @return element seek no or -1
+	 */
+	public int getSeekCount(int index) {
+		if(getIndexArrayElement(index)== -1 ) return -1;
+		return index & mask;
+	}
+}
\ No newline at end of file

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayCompactor.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayCompactor.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayCompactor.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ArrayCompactor.java Thu May  7 14:50:21 2009
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+public class  ArrayCompactor {
+	
+	public static int compact(long[] array,int lastEntry) {
+		
+		
+		int target=-1;
+		for(int i=0;i<=lastEntry;i+=2) {
+			 target++;
+			  array[target]=array[i];
+			 
+		}
+		return target;
+	}
+}
\ No newline at end of file

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BasicType.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BasicType.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BasicType.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BasicType.java Thu May  7 14:50:21 2009
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+/**
+ * The basic types of the HProf format.
+ * Identifies the types of fields within classes, object instances
+ * and primitive types.
+ */
+public interface BasicType {
+	public static final int OBJECT = 2;
+	public static final int BOOLEAN = 4;
+	public static final int CHAR = 5;
+	public static final int FLOAT = 6;
+	public static final int DOUBLE = 7;
+	public static final int BYTE = 8;
+	public static final int SHORT = 9;
+	public static final int INT = 10;
+	public static final int LONG = 11;
+}
\ No newline at end of file

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BitMaskMappingArray.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BitMaskMappingArray.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BitMaskMappingArray.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/BitMaskMappingArray.java Thu May  7 14:50:21 2009
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+
+public class BitMaskMappingArray {
+
+	private ArrayBitMaskMappingStrategy strategy=null;
+	private long[] data=null;
+	private int    maxEntry=0;
+	private IArrayEntryProvider provider=null;
+	
+	
+	
+	public BitMaskMappingArray(int entries,int bucketSize,IArrayEntryProvider provider) {
+	
+			strategy=new ArrayBitMaskMappingStrategy(entries,bucketSize);
+			data=new long[entries];
+			this.provider=provider;
+	}
+	
+	/**
+	 * Retrive element from index
+	 * Returns null if element cannot be located
+	 * 
+	 * @param index 
+	 * @return object at index or null
+	 */
+	public Object get(int index) {
+		
+		
+//		List<String> state=new LinkedList<String>();
+//		state.add("Get "+index);
+//		provider.getState(state);
+//		printState(state);
+//		// ask strategy for element entry
+		
+		if(moveToLocation(index)==false) return null;
+	
+		
+		return provider.getCurrentElement();
+		
+	}
+
+	/**
+	 * Return a record location at a particular location,
+	 * rather than by index.
+	 * 
+	 * @param location within data provider
+	 * @return Object
+	 */
+	public Object getAtLocation(long location) {
+		if(provider.moveToLocation(location)==false) return null;
+		
+		return provider.getCurrentElement();
+	}
+
+	private boolean moveToLocation(int index) {
+		
+		int arraySlot=strategy.getIndexArrayElement(index);
+		if(arraySlot<0) {
+			
+			// array too small
+			// grow it...
+			increaseCapacity(index);
+			arraySlot=strategy.getIndexArrayElement(index);
+		}
+		
+		// is target slot outside current known element?
+		// if so fill array until slot reached
+		if(arraySlot>maxEntry) {
+			if(growArray(arraySlot)==false) return false;
+		}
+		
+		// move provider to the required location
+	
+		if(provider.moveToLocation(data[arraySlot])==false) return false;
+		
+		int seekNo=strategy.getSeekCount(index);
+		if(provider.moveRelativeElement(seekNo)==false) return false;
+		
+		return true;
+	}
+
+	private void printState(List<String> state) {
+		int c=1;
+		for(String s:state) {
+			System.out.println(c+":"+s);
+			c++;
+		}
+		
+	}
+
+	private boolean growArray(int arraySlot) {
+	
+		// move to last know slot
+		long loc=data[maxEntry];
+		provider.moveToLocation(loc);
+		int bucketSize=strategy.getBucketSize();
+		
+		// slots to fill in 
+		int slots=arraySlot-maxEntry;
+		
+		for(int i=0;i<slots;i++) {
+			if(provider.moveRelativeElement(bucketSize)==false) return false;
+			maxEntry++;
+			data[maxEntry]=provider.getCurrentLocation();
+		}
+		return true;
+	}
+
+	private void increaseCapacity(int index) {
+		
+		do {
+			maxEntry=ArrayCompactor.compact(data, maxEntry);
+			strategy=strategy.doubleCapacity();
+		}
+		while (strategy.getIndexArrayElement(index)<0);
+		
+		
+		
+	}
+
+	public long getLocation(int index) {
+		if(moveToLocation(index)==false) return -1;
+		
+		return provider.getCurrentLocation();
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ClassSummary.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ClassSummary.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ClassSummary.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/ClassSummary.java Thu May  7 14:50:21 2009
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.util.Iterator;
+import java.util.TreeMap;
+
+public class ClassSummary implements Iterable<String>{
+
+	private TreeMap<String,Counter> map=new TreeMap<String,Counter>();
+	
+	private class Counter {
+		int count=0;
+	}
+
+	public void record(Object record) {
+		record(record.getClass());
+		
+	}
+	
+	public void record(Class clazz) {
+		String name=clazz.getCanonicalName();
+		Counter counter=null;
+		
+		if(map.containsKey(name)) {
+			counter=map.get(name);
+		}
+		else {
+			counter=new Counter();
+			map.put(name, counter);
+		}
+		counter.count++;
+	
+	}
+
+	@Override
+	public Iterator<String> iterator() {
+
+		return map.keySet().iterator();
+	}
+
+	public Integer getCount(String tag) {
+		if(map.containsKey(tag)) return map.get(tag).count;
+		else return null;
+	}
+	
+	
+	
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataProviderBackedArrayProvider.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataProviderBackedArrayProvider.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataProviderBackedArrayProvider.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataProviderBackedArrayProvider.java Thu May  7 14:50:21 2009
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.kato.hprof.datalayer.IHeapDumpHProfRecord;
+
+public abstract class DataProviderBackedArrayProvider  implements IArrayEntryProvider{
+
+	private IDataProvider provider=null;
+	
+	public DataProviderBackedArrayProvider(IDataProvider provider) {
+		this.provider=provider;
+	}
+	
+	@Override
+	public long getCurrentLocation() {
+
+		try {
+			return provider.getCurrentLocation();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return -1;
+	}
+
+	@Override
+	public boolean moveRelativeElement(int seekNo) {
+
+		while (seekNo > 0) {
+			Object o = getCurrentElement();
+			if (o == null)
+				return false;
+			seekNo--;
+		}
+		return true;
+	}
+
+	@Override
+	public boolean moveToLocation(long l) {
+
+		try {
+		 	provider.moveTo(l);
+		 	return true;
+		} catch(IOException e) {
+			return false;
+		}
+	}
+	@Override
+	public void getState(List state) {
+		
+		state.add("DataProviderBackedarrayProvider");
+		provider.addState(state);
+		
+		
+	}
+
+	public IDataProvider getProvider() {
+		return provider;
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataReader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataReader.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataReader.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/DataReader.java Thu May  7 14:50:21 2009
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+
+
+
+public class DataReader {
+
+	
+	public static int read4Bytes(byte[] data) {
+		
+		return read4Bytes(data,0);
+	}
+
+	public static int read4Bytes(byte[] data, int i) {
+		
+		byte b1=data[i+0];
+		byte b2=data[i+1];
+		byte b3=data[i+2];
+		byte b4=data[i+3];
+		return  (b1 << 24 ) + (b2 << 16) + (b3 << 8) + b4;
+		
+		 
+
+	}
+
+	public static short read2Bytes(byte[] data, int i) {
+		byte b1=data[i+0];
+		byte b2=data[i+1];
+		return   (short) ((b1 << 8) + b2);
+		
+	}
+
+	public static long readNumber(byte[] data, int offset, int length) {
+	
+		long value=0;
+		for(int i=0;i<length;i++) {
+			value = value << 8;
+			byte b=data[offset+i];
+			value = value + (b & 0xff);
+		}
+		return value;
+	}
+	
+	public static long readNumber(IDataProvider provider, int length) throws IOException {
+		
+		long value=0;
+		for(int i=0;i<length;i++) {
+			value = value << 8;
+			short b=provider.readByte();
+			value = value + (b &0xff);
+		}
+		return value;
+	}
+
+	public static byte[] readByteArray(byte[] data, int offset, int length) {
+		byte[] results=new byte[length];
+		System.arraycopy(data,offset,results,0,length);
+		return results;
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IArrayEntryProvider.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IArrayEntryProvider.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IArrayEntryProvider.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IArrayEntryProvider.java Thu May  7 14:50:21 2009
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.util.List;
+
+
+public interface IArrayEntryProvider {
+
+	boolean moveToLocation(long l);
+
+	Object getCurrentElement();
+
+	boolean moveRelativeElement(int seekNo);
+	long getCurrentLocation();
+
+	void getState(List state);
+
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDLocationMap.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDLocationMap.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDLocationMap.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDLocationMap.java Thu May  7 14:50:21 2009
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+
+/**
+ * 
+ * Interface for various implementations that map from an ID to a location.
+ * 
+ *
+ */
+public interface IDLocationMap {
+	/** 
+	 * Extract a location by ID.
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public abstract Long getLocation(Long id);
+	
+	/**
+	 * Add a mapping from an ID to a location in the IHeapDumpHProfRecord.
+	 * 
+	 * @param ID
+	 * @param location
+	 */
+	public void put(Long ID, Long location);
+
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDToLocationHashMapper.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDToLocationHashMapper.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDToLocationHashMapper.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDToLocationHashMapper.java Thu May  7 14:50:21 2009
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Maps from ID's to locations on the heap.
+ * Uses a HashMap to do this in memory.
+ * This will not scale, but will work as a trivial implementation.
+ * 
+ */
+public class IDToLocationHashMapper implements IDLocationMap {	
+	private Map<Long,Long>  idToLocation = new HashMap<Long,Long>();
+		
+	/**
+	 * Retrieves a location by it ID.
+	 * 
+	 * @param ID
+	 * @return
+	 */
+	public Long getLocation(Long ID) {
+		Long location = idToLocation.get(ID);
+		if (location == null) {
+			return null;
+		}
+		
+		return location;
+	}
+	
+	/**
+	 * Add a mapping from an ID to a location.
+	 * 
+	 * @param ID
+	 * @param location
+	 */
+	public void put(Long ID, Long location) {
+		if (idToLocation.containsKey(ID)) {
+			System.err.println("Map already contains 0x"+Long.toHexString(ID));
+		}
+		idToLocation.put(ID, location);
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDataProvider.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDataProvider.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDataProvider.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IDataProvider.java Thu May  7 14:50:21 2009
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface IDataProvider {
+
+	void close() throws IOException;
+
+	void open() throws IOException;
+
+	void moveTo(long l) throws IOException;
+
+	String readCString() throws IOException;
+
+	int readU4() throws IOException;
+
+	long readU8() throws IOException;
+
+	long getCurrentLocation() throws IOException;
+
+	long getDataLength() throws IOException;
+
+	short readByte()throws IOException;
+
+	byte[] readBytes(int left) throws IOException;
+
+	void moveBy(int left) throws IOException;
+
+	short readU2() throws IOException;
+	
+	void addState(List state);
+
+	long dataRemaining();
+
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IViewMonitor.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IViewMonitor.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IViewMonitor.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/IViewMonitor.java Thu May  7 14:50:21 2009
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+
+public interface IViewMonitor {
+
+	void error(IOException e);
+
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/InvalidFileFormat.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/InvalidFileFormat.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/InvalidFileFormat.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/InvalidFileFormat.java Thu May  7 14:50:21 2009
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+
+public class InvalidFileFormat extends IOException {
+
+	public InvalidFileFormat(String string) {
+		// TODO Auto-generated constructor stub
+	}
+
+	public InvalidFileFormat(String msg, Exception exception) {
+		super(msg,exception);
+	}
+
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/SubsetDataProvider.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/SubsetDataProvider.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/SubsetDataProvider.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/common/SubsetDataProvider.java Thu May  7 14:50:21 2009
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.common;
+
+import java.io.IOException;
+import java.util.List;
+
+public class SubsetDataProvider implements IDataProvider {
+
+	private IDataProvider provider=null;
+	private boolean moved=true;
+	private long startPoint=0;
+	private long scope=0;
+	private long current=0;
+	
+	public SubsetDataProvider(IDataProvider provider, long range) throws IOException {
+		if(provider==null) throw new IllegalArgumentException("Provider is null");
+		if(range<0) throw new IllegalArgumentException("range "+range+" is less than 0");
+		this.provider=provider;
+		startPoint=provider.getCurrentLocation();
+		scope=range;
+	}
+	public SubsetDataProvider(IDataProvider provider,long offsetm, long range) throws IOException {
+		if(provider==null) throw new IllegalArgumentException("Provider is null");
+		if(range<0) throw new IllegalArgumentException("range "+range+" is less than 0");
+		this.provider=provider;
+		startPoint=offsetm;
+		scope=range;
+	}
+	public long getCurrentLocation() throws IOException {
+		return current;
+	}
+
+	public long getDataLength() throws IOException {
+		return scope;
+	}
+
+	public void moveBy(int left) throws IOException {
+		current+=left;
+		moved=true;
+		if(current>scope) throw new IOException("moving "+left+" is out of range "+scope);
+		
+	}
+
+	public void moveTo(long l) throws IOException {
+		if(current==l) return; // nothing to do
+		current=l;
+		moved=true;
+		if(current>scope) throw new IOException("moving "+l+" is out of range "+scope);
+		
+	}
+
+	public short readByte() throws IOException {
+		updateLocation();
+		current+=1;
+		if(current>scope) throw new IOException("reading is out of range "+scope);
+		return provider.readByte();
+		
+		
+	}
+
+	public byte[] readBytes(int left) throws IOException {
+		updateLocation();
+		current+=left;
+		if(current>scope) throw new IOException("reading "+left+" is out of range "+scope);
+		return provider.readBytes(left);
+	}
+
+	public String readCString() throws IOException {
+		updateLocation();
+		String string=provider.readCString();
+		current=provider.getCurrentLocation();
+		if(provider.getCurrentLocation()-startPoint>scope) throw new IOException("reading is out of range "+scope);
+		return string;
+	}
+
+	public int readU4() throws IOException {
+		updateLocation();
+		current+=4;
+		if(current>scope) throw new IOException("reading is out of range "+scope);
+		return provider.readU4();
+	}
+
+	public long readU8() throws IOException {
+		updateLocation();
+		current+=8;
+		if(current>scope) throw new IOException("reading is out of range "+scope);
+	
+		return provider.readU8();
+	}
+
+	@Override
+	public void close() throws IOException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void open() throws IOException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public short readU2() throws IOException {
+		updateLocation();
+		current+=2;
+		if(current>scope) throw new IOException("reading is out of range "+scope);
+		return provider.readU2();
+	}
+
+	private void updateLocation() throws IOException {
+		if(moved) {
+			provider.moveTo(current+startPoint);
+			moved=false;
+		}
+		
+	}
+
+	@Override
+	public void addState(List state) {
+		
+		state.add("SubsetProvider moved="+moved+",startPoint="+startPoint+",scope="+scope+",current="+current);
+		provider.addState(state);
+	}
+	@Override
+	public long dataRemaining() {
+		
+		return scope-current;
+	}
+	
+	
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFFormattedReporter.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFFormattedReporter.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFFormattedReporter.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFFormattedReporter.java Thu May  7 14:50:21 2009
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.apache.kato.hprof.datalayer.HProfFactory;
+import org.apache.kato.hprof.datalayer.HProfFile;
+import org.apache.kato.hprof.datalayer.IControlSettingsHProfRecord;
+import org.apache.kato.hprof.datalayer.IHProfRecord;
+import org.apache.kato.hprof.datalayer.IHeapDumpHProfRecord;
+import org.apache.kato.hprof.datalayer.IJavaStackFrameHProfRecord;
+import org.apache.kato.hprof.datalayer.IJavaStackTraceHProfRecord;
+import org.apache.kato.hprof.datalayer.ILoadClassHProfRecord;
+import org.apache.kato.hprof.datalayer.IUTF8HProfRecord;
+
+
+public class HPROFFormattedReporter {
+
+	
+	private PrintStream out=System.out;
+	private Map<Integer,Counter> stats=new TreeMap<Integer,Counter>();
+	private TreeSet<String> labels=new TreeSet<String>();
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		
+		//File dump=new File("C:/Documents and Settings/spoole/workspace/HProf Binary Format Reader/data/java.hprof");
+		HPROFFormattedReporter reporter=new HPROFFormattedReporter();
+		File hprofFile=new File(args[0]);
+		
+		try {
+			reporter.report(hprofFile);
+		} catch (IOException e) {
+			
+			e.printStackTrace();
+		}
+		
+		
+	}
+
+	public void report(File dump) throws IOException {
+		
+		HProfFile h=HProfFactory.createReader(dump);
+		
+		h.open();
+		
+		String header=h.getHeader();
+		int    idSize=h.getIdentifierSize();
+		long   timeStamp=h.getTimeStamp();
+		
+		out.println("HPROF     : "+header);
+		out.println("ID SIZE  : "+idSize);
+		out.println("TIMESTAMP: "+timeStamp);
+		
+		int counter=0;
+		while(true) {
+			
+			IHProfRecord record=h.getRecord(counter); 
+			if(record==null) break;
+			report(record);
+			counter++;
+		}
+		
+		reportStats();
+		out.println("Report completed.  "+counter+" records");
+		
+		h.close();
+
+		
+	}
+
+	private void reportStats() {
+		for(Integer i:stats.keySet()) {
+			Counter c=stats.get(i);
+			out.println("tag "+Integer.toHexString(i)+" occurs "+c.count+" time(s)");
+		}
+		
+	}
+
+	private void report(IHProfRecord record) {
+		int tag=record.getTag();
+		accumulateStatistics(tag);
+		out.println("----------------------------------------- "+toHex(tag)+":"+record.getDataLength());		
+		switch(tag) {
+		
+		case 0x01:   IUTF8HProfRecord utf8Record=(IUTF8HProfRecord)record;
+					 reportUTF8(utf8Record);
+					 break;
+					 
+		case 0x02:   ILoadClassHProfRecord loadClass=(ILoadClassHProfRecord)record;
+		 			 reportLoadClass(loadClass);
+		 			 break;
+		 			 
+		case 0x04:   IJavaStackFrameHProfRecord frameRecord=(IJavaStackFrameHProfRecord)record;
+					 reportFrameRecord(frameRecord);
+					 break;
+					 
+		case 0x05:   IJavaStackTraceHProfRecord traceRecord=(IJavaStackTraceHProfRecord)record;
+					 reportTraceRecord(traceRecord);
+					 break;
+					 
+		case 0x0C:   IHeapDumpHProfRecord dumpRecord = (IHeapDumpHProfRecord)record;
+					 reportHeapDump(dumpRecord);
+					 break;
+		case 0x0E:   IControlSettingsHProfRecord settings=(IControlSettingsHProfRecord) record;
+					 reportSettings(settings);
+					 break;
+			
+		}
+		
+	}
+
+	private void reportFrameRecord(IJavaStackFrameHProfRecord record) {
+		
+		out.println("frame - stack frame id :"+toHex(record.getStackFrameID()));
+		out.println("frame - method name id :"+toHex(record.getMethodNameID()));
+		out.println("frame - method signature id :"+toHex(record.getMethodSignatureID()));
+		out.println("frame - source file name id :"+toHex(record.getSourceFileNameID()));
+		out.println("frame - class serial number :"+record.getClassSerialNumber());
+		out.println("frame - line number :"+record.getLineNumber());
+	}
+
+	
+	private String toHex(long h) {
+		return HProfRecordFormatter.toHex(h);
+	}
+
+	private void reportLoadClass(ILoadClassHProfRecord loadClass) {
+		out.println("load class - class serial number : "+loadClass.getClassSerialNumber());
+		out.println("load class - object ID : "+toHex(loadClass.getClassObjectID()));
+		out.println("load class - stack trace serial number : "+loadClass.getStackTraceSerialNumber());
+		out.println("load class - class Name ID : "+toHex(loadClass.getClassNameID()));
+	}
+
+	private void reportUTF8(IUTF8HProfRecord utf8Record) {
+		
+		try {
+			String label=new String(utf8Record.getCharacters(),"UTF-8");
+			if(labels.contains(label)) {
+				int a=1;
+			}
+			out.println("utf8 record id: "+toHex(utf8Record.getNameID())+" data: ["+label+"]");
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+	}
+
+	private void reportTraceRecord(IJavaStackTraceHProfRecord traceRecord) {
+		out.println("stack trace serial number: "+traceRecord.getSerialNumber());
+		out.println("frame count: "+traceRecord.getFrameCount());
+		
+	}
+
+	private void reportHeapDump(IHeapDumpHProfRecord dumpRecord) {
+		out.println("dump record");
+		int index=0;
+		while(true) {
+			Object record=dumpRecord.getSubRecord(index);
+			if(record==null) break;
+			out.println(">>"+record);
+			index++;
+		}
+		
+	}
+
+	private void accumulateStatistics(int tag) {
+		
+		Counter c=null;
+		if(stats.containsKey(tag)) {
+			c=stats.get(tag);
+		}
+		else {
+			c=new Counter();
+			stats.put(tag,c);
+		}
+		c.count++;
+	}
+
+	private void reportSettings(IControlSettingsHProfRecord settings) {
+		
+		out.println("Is AllocTrace:"+settings.isAllocTrace());
+		out.println("Is CPUSampling:"+settings.isCpuSampling());
+		out.println("Stack Trace Depth:"+settings.getStackTraceDepth());
+		
+	}
+
+	public HPROFFormattedReporter() {
+		
+	}
+	
+	class Counter {
+		int count=0;
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFUTF8Reporter.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFUTF8Reporter.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFUTF8Reporter.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HPROFUTF8Reporter.java Thu May  7 14:50:21 2009
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.apache.kato.hprof.datalayer.HProfFactory;
+import org.apache.kato.hprof.datalayer.HProfFile;
+import org.apache.kato.hprof.datalayer.IHProfRecord;
+import org.apache.kato.hprof.datalayer.IUTF8HProfRecord;
+
+public class HPROFUTF8Reporter {
+
+	
+	private PrintStream out=System.out;
+	private Map<Integer,Counter> stats=new TreeMap<Integer,Counter>();
+	private TreeSet<String> labels=new TreeSet<String>();
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		
+		//File dump=new File("C:/Documents and Settings/spoole/workspace/HProf Binary Format Reader/data/java.hprof");
+		HPROFUTF8Reporter reporter=new HPROFUTF8Reporter();
+		File hprofFile=new File(args[0]);
+		
+		try {
+			reporter.report(hprofFile);
+		} catch (IOException e) {
+			
+			e.printStackTrace();
+		}
+		
+		
+	}
+
+	public void report(File dump) throws IOException {
+		
+		HProfFile h=HProfFactory.createReader(dump);
+		
+		h.open();
+		
+		
+		int counter=0;
+		while(true) {
+			IHProfRecord record=h.getRecord(counter); 
+			if(record==null) break;
+			report(record);
+			counter++;
+		}
+		
+	
+		h.close();
+
+		
+	}
+
+	private void report(IHProfRecord record) {
+		int tag=record.getTag();
+		
+		switch(tag) {
+		
+		case 0x01:   IUTF8HProfRecord utf8Record=(IUTF8HProfRecord)record;
+					 reportUTF8(utf8Record);
+					 break;
+					 
+					
+		}
+		
+	}
+
+	private static String toHex(long v) {
+		return "0x"+Long.toHexString(v);
+	}
+	private void reportUTF8(IUTF8HProfRecord utf8Record) {
+		
+		try {
+			String label=new String(utf8Record.getCharacters(),"UTF-8");
+			if(labels.contains(label)) {
+				int a=1;
+			}
+			out.println(label);
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+	}
+
+	public HPROFUTF8Reporter() {
+		
+	}
+	
+	class Counter {
+		int count=0;
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfRecordFormatter.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfRecordFormatter.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfRecordFormatter.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfRecordFormatter.java Thu May  7 14:50:21 2009
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+
+import org.apache.kato.hprof.datalayer.HProfFile;
+import org.apache.kato.hprof.datalayer.IHProfRecord;
+import org.apache.kato.hprof.datalayer.ILoadClassHProfRecord;
+import org.apache.kato.hprof.datalayer.IUTF8HProfRecord;
+
+public class HProfRecordFormatter {
+
+	private static final String hexChars="0123456789ABCDEF";
+	private HProfFile prof=null;
+	HashMap<Long, Integer> utf8s=null;
+
+	
+	public HProfRecordFormatter(HProfFile prof, HashMap<Long, Integer> utf8s) {
+		this.prof=prof;
+		this.utf8s=utf8s;
+	}
+	public  String formatData(IHProfRecord o) {
+		
+		int tag=o.getTag();
+		
+		switch(tag) {
+		
+		case 0x01 :   return formatUTF8Data((IUTF8HProfRecord)o);
+		case 0x02:    return formatLoadCLass((ILoadClassHProfRecord)o);
+		case 0x04:   return "Frame";
+		case 0x05:   return "Trace";
+		case 0x0A:   return "Thread Start";
+		case 0x0B:   return "Thread End";
+		case 0x0C:   return "HeapDump";
+		case 0x0E:   return "Settings";
+		
+		}
+		
+		return "";
+	}
+	
+	public   String formatLoadCLass(ILoadClassHProfRecord o) {
+		
+		long id=o.getClassNameID();
+		long classID=o.getClassObjectID();
+		long serialNo=o.getClassSerialNumber();
+		long stackSerial=o.getStackTraceSerialNumber();
+		
+		String className="";
+		if(utf8s.containsKey(id)) {
+			int ref=utf8s.get(id);
+			className=getName(ref);
+			if(className==null) className="";
+			else className="("+className+")";
+		}
+		return "classNameID="+toHex(id)+className+" objectid="+toHex(classID)+" serialNo="+toHex(serialNo)+" stackSerial="+toHex(stackSerial);
+	}
+
+	public String getName(Long id) {
+		if(utf8s.containsKey(id)==false) return null;
+		int ref=utf8s.get(id);
+		return getName(ref);
+	}
+	private String getName(int ref) {
+		IHProfRecord record=prof.getRecord(ref);
+		
+		if(record instanceof IUTF8HProfRecord) {
+			IUTF8HProfRecord  utf8rec=(IUTF8HProfRecord) record;
+			return utf8rec.getAsString();
+		}
+		return null;
+	}
+	public static String toHex(long v) {
+		return "0x"+Long.toHexString(v);
+	}
+	public  static String formatUTF8Data(IUTF8HProfRecord utf8Record) {
+		
+		try {
+			return new String(utf8Record.getCharacters(),"UTF-8");
+		} catch (UnsupportedEncodingException e) {
+		
+			return "Error converting data "+e.toString();
+		
+	}
+		
+	
+}
+
+	public static String getTagName(IHProfRecord o) {
+		
+		int tag=o.getTag();
+		
+		switch(tag) {
+		
+		case 0x01 :   return "UTF8";
+		case 0x02:    return "LoadClass";
+		case 0x04:   return "Frame";
+		case 0x05:   return "Trace";
+		case 0x0A:   return "Thread started";
+		case 0x0B:   return "Thread ending";
+		case 0x0C:   return "HeapDump";
+		case 0x0E:   return "Settings";
+		}
+		
+		return o.getClass().getName();
+	}
+	public static String toHex(byte[] bytes) {
+		if(bytes==null) return "<no data>";
+		return toHex(bytes,0,bytes.length);
+	}
+	public static String toHex(byte[] bytes, int start, int length) {
+		
+		if(bytes==null) return "<no data>";
+		if(bytes.length<start) return "<bad start>";
+		
+		StringBuilder builder=new StringBuilder();
+		for(int i=0;i<length;i++) {
+			int index=i+start;
+			if(index>=bytes.length) break;
+			builder.append(toHex(bytes[index]));
+			builder.append(" ");
+		}
+		return new String(builder);
+	}
+
+	private static String toHex(byte b) {
+		 int value= (int) b & 0xFF;
+		int top=value >> 4;
+		int bottom= value & 0x0F;
+		
+		return ""+hexChars.charAt(top)+hexChars.charAt(bottom);
+		
+	}
+	public static String toHex(byte[] bytes, int start, int length, int packet) {
+		if(bytes==null) return "<no data>";
+		if(bytes.length<start) return "<bad start>";
+		
+		StringBuilder builder=new StringBuilder();
+		int c=packet;
+		for(int i=0;i<length;i++) {
+			int index=i+start;
+			if(index>=bytes.length) break;
+			builder.append(toHex(bytes[index]));
+			builder.append(" ");
+			c--;
+			if(c==0) {
+				builder.append("\n");
+				c=packet;
+			}
+		}
+		return new String(builder);
+	}
+	public static String toPrintableText(byte[] bytes) {
+		if(bytes==null) return "<no data>";
+		
+		StringBuilder builder=new StringBuilder();
+		for(int i=0;i<bytes.length;i++) {
+			char c=(char) bytes[i];
+			if(Character.isLetterOrDigit(c)) {
+				builder.append(c);
+	
+			}
+			else {
+				builder.append('.');
+			}
+		}
+		return new String(builder);
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java Thu May  7 14:50:21 2009
@@ -0,0 +1,777 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Vector;
+
+import org.apache.kato.common.BasicType;
+import org.apache.kato.common.ClassSummary;
+import org.apache.kato.common.IDLocationMap;
+import org.apache.kato.common.IDToLocationHashMapper;
+import org.apache.kato.common.IViewMonitor;
+import org.apache.kato.hprof.datalayer.ConstantPoolEntry;
+import org.apache.kato.hprof.datalayer.HProfFile;
+import org.apache.kato.hprof.datalayer.IGCClassHeapDumpRecord;
+import org.apache.kato.hprof.datalayer.IHProfRecord;
+import org.apache.kato.hprof.datalayer.IHeapDumpHProfRecord;
+import org.apache.kato.hprof.datalayer.IHeapObject;
+import org.apache.kato.hprof.datalayer.IJavaStackFrameHProfRecord;
+import org.apache.kato.hprof.datalayer.IJavaStackTraceHProfRecord;
+import org.apache.kato.hprof.datalayer.ILoadClassHProfRecord;
+import org.apache.kato.hprof.datalayer.IThreadActiveHProfRecord;
+import org.apache.kato.hprof.datalayer.IThreadEndingHProfRecord;
+import org.apache.kato.hprof.datalayer.IUTF8HProfRecord;
+import org.apache.kato.hprof.datalayer.IUnloadClassHProfRecord;
+import org.apache.kato.hprof.datalayer.InstanceFieldEntry;
+import org.apache.kato.hprof.datalayer.StaticFieldEntry;
+
+public class HProfView {
+
+	private HProfFile file = null;
+	private HashMap<Long, Integer> utf8s = new HashMap<Long, Integer>();
+	private Long[] utf8ids = null;
+	private IJavaClass[] loadedClassRecordNumbers = null;
+	private IJavaThread[] threads = null;
+	private HashMap<Integer, Integer> stackTraces = new HashMap<Integer, Integer>();
+	private Integer[] stackTraceRecords=null;
+	private HashMap<Long, Integer> stackTraceFrames = new HashMap<Long, Integer>();
+	private ClassSummary recordSummary=null;
+	private IHeapDumpHProfRecord heapRecord=null;
+	private long heapRecordLocation=0;
+//	private HashMap<Long,JavaClassLoader> = new HashMap<Long,JavaClassLoader>();
+	private IDLocationMap idToLocationMap;
+	
+	// Class maps
+	private HashMap<Long,IJavaClassLoader> javaClassLoaders = new HashMap<Long,IJavaClassLoader>();
+	private HashMap<Integer,IJavaClass>  loadedClassesBySerial=new HashMap<Integer,IJavaClass>();
+	private HashMap<Long,IJavaClass>  loadedClassesByID=new HashMap<Long,IJavaClass>();
+	
+	public HProfView(HProfFile file) {
+		this.file = file;
+	}
+
+	public void open(IViewMonitor monitor) {
+
+		try {
+			file.open();
+
+			int r = 0;
+			LinkedList<IJavaClass> loadedClassesRecordNO = new LinkedList<IJavaClass>();
+			LinkedList<IJavaThread> threadRecordNO = new LinkedList<IJavaThread>();
+			LinkedList<Integer> javastacks = new LinkedList<Integer>();
+			recordSummary=new ClassSummary();
+			
+			int heapRecordNo=0;
+			while (true) {
+				IHProfRecord record = file.getRecord(r);
+				if (record == null)
+					break;
+
+				String tagName=HProfRecordFormatter.getTagName(record);
+				recordSummary.record(record);
+				if (record instanceof IUTF8HProfRecord) {
+					IUTF8HProfRecord utf8 = (IUTF8HProfRecord) record;
+					Long id = utf8.getNameID();
+					utf8s.put(id, r);
+
+				} else if (record instanceof ILoadClassHProfRecord) {
+					JavaClass c=new JavaClass(r);					
+					loadedClassesBySerial.put(c.getClassSerialNumber(),c);
+				} else if (record instanceof IUnloadClassHProfRecord) {					
+					// Remove a loaded class if it is subsequently unloaded.
+					loadedClassesBySerial.remove(((IUnloadClassHProfRecord)record).getClassSerialNumber());
+				} else if (record instanceof IThreadActiveHProfRecord) {
+					// SRDM add by serial number
+					threadRecordNO.add(new ActiveJavaThread(r));
+				} else if (record instanceof IThreadEndingHProfRecord) {
+					// SRDM remove thread by serial number.
+					
+					threadRecordNO.add(new InactiveJavaThread(r));
+
+				} else if (record instanceof IJavaStackTraceHProfRecord) {
+					// SRDM Stack traces should be attached to threads
+					// keep the most recent. Attach to thread so that when thread removed,
+					// stacktrace is removed too.
+					IJavaStackTraceHProfRecord stackTrace = (IJavaStackTraceHProfRecord) record;
+					int sn = stackTrace.getSerialNumber();
+					stackTraces.put(sn, r);
+					javastacks.add(r);
+
+				} else if (record instanceof IJavaStackFrameHProfRecord) {
+					IJavaStackFrameHProfRecord frame = (IJavaStackFrameHProfRecord) record;
+					long id = frame.getStackFrameID();
+					stackTraceFrames.put(id, r);
+
+				}
+				else if(record instanceof IHeapDumpHProfRecord) {
+					heapRecord=(IHeapDumpHProfRecord) record;
+					heapRecordNo=r;
+
+					idToLocationMap = new IDToLocationHashMapper();
+					summariseHeap(heapRecord);
+				}
+				r++;
+			}
+			
+			heapRecordLocation=file.getRecordLocation(heapRecordNo);
+			
+			utf8ids = utf8s.keySet().toArray(new Long[0]);
+			loadedClassRecordNumbers = loadedClassesRecordNO
+					.toArray(new IJavaClass[0]);
+
+			threads = threadRecordNO.toArray(new IJavaThread[0]);
+			stackTraceRecords=javastacks.toArray(new Integer[0]);			
+			
+			correlateClasses();
+			
+		} catch (IOException e) {
+
+			monitor.error(e);
+		}
+	}
+
+	private IJavaClass[] primitiveArrayClasses = new IJavaClass[8];
+	/**
+	 * Called once during processing.
+	 * Iterates over all of the classes loaded and never unloaded.
+	 * Creates the JavaClassLoaders, and creates map from object IDs to JavaClasses.
+	 * 
+	 */
+	private void correlateClasses() {
+
+		Iterator<Integer> classes = loadedClassesBySerial.keySet().iterator();
+	
+		while (classes.hasNext()) {
+			int classSerialNo = classes.next();
+			IJavaClass clazz = loadedClassesBySerial.get(classSerialNo);
+			
+			Long location =  idToLocationMap.getLocation(clazz.getClassObjectID());
+			
+			if (location == null) {
+				continue;
+			}
+			
+			IHProfRecord record =  heapRecord.getSubRecordByLocation(location);
+			long classLoaderObjectID = 0L;
+			long classObjectID = 0L;
+			if (record instanceof IGCClassHeapDumpRecord) {
+				IGCClassHeapDumpRecord classRecord = (IGCClassHeapDumpRecord) record;
+				
+				classLoaderObjectID = classRecord.getClassLoaderObjectID();
+				
+				classObjectID = classRecord.getID();
+				
+				String name = clazz.getClassName();
+				
+				if ("boolean[]".equals(name)) {
+					primitiveArrayClasses[BasicType.BOOLEAN-4] = clazz;
+				} else if ("byte[]".equals(name)) {
+					primitiveArrayClasses[BasicType.BYTE-4] = clazz;
+				} else if ("char[]".equals(name)) {
+					primitiveArrayClasses[BasicType.CHAR-4] = clazz;
+				} else if ("short[]".equals(name)) {
+					primitiveArrayClasses[BasicType.SHORT-4] = clazz;
+				} else if ("int[]".equals(name)) {
+					primitiveArrayClasses[BasicType.INT-4] = clazz;
+				} else if ("long[]".equals(name)) {
+					primitiveArrayClasses[BasicType.LONG-4] = clazz;
+				} else if ("float[]".equals(name)) {
+					primitiveArrayClasses[BasicType.FLOAT-4] = clazz;
+				} else if ("double[]".equals(name)) {
+					primitiveArrayClasses[BasicType.DOUBLE-4] = clazz;
+				}
+				
+				// Create map of classes loaded by ID.
+				loadedClassesByID.put(classObjectID, clazz);
+			} else {
+				// If the record wasn't pointing to a class, then don't do anything with this class.
+				continue;
+			}
+			
+			// retrieve classloader by ID. If it doesn't match, create one.
+			// then add this class object ID.
+			JavaClassLoader loader = (JavaClassLoader) javaClassLoaders.get(classLoaderObjectID);
+			
+			if (loader == null) {
+				loader = new JavaClassLoader(classLoaderObjectID);
+				javaClassLoaders.put(classLoaderObjectID, loader);
+			}
+			
+			loader.addClass(classObjectID);
+		}
+		
+	}
+	
+	/**
+	 * Primitive
+	 * @param type
+	 * @return
+	 */
+	public IJavaClass getPrimitiveArrayClass(int type) {
+		 if(type <4 || type >11) {
+			 throw new IllegalArgumentException("Invalid basic type for primitive array " + type);
+		 }
+		 
+		 return primitiveArrayClasses[type-4];
+	}
+	
+	/**
+	 * Returns a collection of all of the JavaClassLoaders.
+	 * 
+	 * @return Collection<JavaClassLoader>
+	 */
+	public Collection<IJavaClassLoader> getJavaClassLoaders() {
+		return javaClassLoaders.values();
+	}
+	
+	/**
+	 * Given the Object ID of a JavaClassLoader, return a JavaClassLoader
+	 * of it's ID.
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public IJavaClassLoader getJavaClassLoader(long id) {
+		return javaClassLoaders.get(id);
+	}
+
+	/**
+	 * Return a JavaClass by its serial number.
+	 * 
+	 * @param serial
+	 * @return IJavaClass instance or null.
+	 */
+	public IJavaClass getJavaClassBySerial(int serial) {
+		return loadedClassesBySerial.get(serial);
+	}
+	
+	/**
+	 * Return a IJavaClass instance referenced by its ID.
+	 * @param id object ID of class
+	 * @return IJavaClass or null
+	 */
+	public IJavaClass getJavaClassByID(long id) {		
+		IJavaClass clazz = loadedClassesByID.get(id);
+		
+		if (clazz == null) {
+			System.err.println("Failed class lookup : 0x" +
+					Long.toHexString(id));
+		}
+		//assert(clazz != null);
+		
+		return clazz;
+	}
+	
+	/**
+	 * Return an IHeapObject instance with the passed object ID.
+	 * 
+	 * @param id
+	 * @return IJavaObject with passed ID
+	 */
+	public IHeapObject getJavaObjectByID(long id) {
+		Long loc = idToLocationMap.getLocation(id);
+		if (loc == null) {
+			return null;
+		}
+		
+		IHProfRecord record =  heapRecord.getSubRecordByLocation(loc);
+		
+		if (record == null) {
+			return null;
+		}
+		
+		if (record instanceof IHeapObject) {
+			return (IHeapObject) record;
+		}
+		
+		return null;
+	}
+	
+	private void summariseHeap(IHeapDumpHProfRecord heapRecord) {
+		
+		int index=0;
+		
+		while(true) {
+			IHProfRecord rec=heapRecord.getSubRecord(index);
+			
+			/* Record the ID of this record and location in ID to record map
+			 * if this record is of an appropriate type.
+			 */
+			if (rec instanceof IHeapObject) {
+				long location = heapRecord.getSubRecordLocation(index);
+				idToLocationMap.put(((IHeapObject)rec).getID(), location);
+			} 
+						
+			if(rec==null) break;
+			recordSummary.record(rec);
+			index++;
+		}
+		
+	}
+
+	public IJavaStackFrameHProfRecord getStackFrameRecordFromID(long id) {
+		int record=stackTraceFrames.get(id);
+		return (IJavaStackFrameHProfRecord) file.getRecord(record);
+	}
+	public String getName(long id) {
+		return getUTF8String(id);
+
+	}
+
+	public String getUTF8String(long id) {
+
+		int record = getUTF8RecordID(id);
+		if (record < 0)
+			return "";
+		IHProfRecord rec = file.getRecord(record);
+		if (rec == null)
+			return null;
+		if (rec instanceof IUTF8HProfRecord) {
+			IUTF8HProfRecord utf8record = (IUTF8HProfRecord) rec;
+			return utf8record.getAsString();
+		}
+
+		return null;
+	}
+
+	public int getUTF8RecordID(long id) {
+		if (utf8s.containsKey(id)) {
+			int record = utf8s.get(id);
+			return record;
+		}
+		return -1;
+	}
+
+	public int getThreadCount() {
+		return threads.length;
+	}
+
+	public IJavaThread getThread(int ref) {
+		return threads[ref];
+	}
+
+	public int getStackTraceCount() {
+		return stackTraceRecords.length;
+	}
+	public IJavaStackTraceHProfRecord getStackTraceRecord(int ref) {
+		return (IJavaStackTraceHProfRecord) file.getRecord(stackTraceRecords[ref]);
+	}
+
+	/**
+	 * Represents a JavaClass - pulls together the LoadClass hprofrecord
+	 * and it corresponding GCClassHeapDumpRecord.
+	 *
+	 */
+	public class JavaClass implements IJavaClass {
+
+		private int ref = 0;
+
+		private JavaClass(int r) {
+			this.ref = r;
+		}
+
+		@Override
+		public String getClassName() {
+			ILoadClassHProfRecord record = getLoadedClassHProfRecord(ref);
+			return getName(record.getClassNameID());
+		}
+
+		@Override
+		public long getClassObjectID() {
+			return getLoadedClassHProfRecord(ref).getClassObjectID();
+
+		}
+
+		@Override
+		public int getClassSerialNumber() {
+
+			return getLoadedClassHProfRecord(ref).getClassSerialNumber();
+		}
+
+		@Override
+		public int getStackTraceSerialNumber() {
+
+			return getLoadedClassHProfRecord(ref).getStackTraceSerialNumber();
+		}
+
+		@Override
+		public long getClassLoaderObjectID() {
+			return getHProfRecord().getClassLoaderObjectID(); 
+		}
+		
+		
+		private IGCClassHeapDumpRecord getHProfRecord() {
+			return (IGCClassHeapDumpRecord) heapRecord.getSubRecordByLocation(idToLocationMap.getLocation(getClassObjectID()));
+		}
+
+		@Override
+		public long getSuperClassObjectID() {
+			return getHProfRecord().getSuperClassObjectID();
+		}
+		
+		@Override
+		public int getInstanceSize() {
+			return getHProfRecord().getInstanceSize();
+		}
+		
+
+		/**
+		 * Check for equality
+		 */
+		@Override
+		public boolean equals(Object obj) {
+			if (obj == null) {
+				return false;
+			} else if (!(obj instanceof JavaClass)) {
+				return false;
+			}
+			return ((JavaClass)obj).getClassSerialNumber() == getClassSerialNumber();
+		}
+
+		@Override
+		public long getProtectionDomainObjectID() {
+			return getHProfRecord().getProtectionDomainObjectID();
+		}
+
+		@Override
+		public long getSignersObjectID() {
+			return getHProfRecord().getSignersObjectID();
+		}
+
+		@Override
+		public StaticFieldEntry[] getStaticFields() {
+			return getHProfRecord().getStaticFields();
+		}
+
+		@Override
+		public ConstantPoolEntry[] getConstantPoolEntries() {
+			return getHProfRecord().getConstantPool();
+		}
+
+		@Override
+		public InstanceFieldEntry[] getInstanceFields() {
+			return getHProfRecord().getInstanceFields();
+		}
+
+		@Override
+		public int getOffsetSize() {
+			return getHProfRecord().getOffsetSize();
+		}
+	}
+
+	/**
+	 * Holds the IDs of classes loaded by this classloader.
+	 * 
+	 */
+	private class JavaClassLoader implements IJavaClassLoader {
+		private Long id;
+		private Vector<Long> classes = new Vector<Long>();
+		
+		/**
+		 * Creates a JavaClassLoader.
+		 * This identifying object ID is passed.
+		 * 
+		 * @param id Object ID of the class loader.
+		 */
+		private JavaClassLoader(Long id) {
+			this.id = id;
+		}
+		
+		/**
+		 * Returns the Object ID of this classloader.
+		 * @return long
+		 */
+		public long getID() {
+			return this.id;
+		}
+		
+		/**
+		 * Add a class to the classloader.
+		 * Private as only the 
+		 * @param ID
+		 */
+		private void addClass(Long ID) {
+			this.classes.add(ID);
+		}
+		
+		public Vector<Long> getClasses() {
+			return classes;
+		}
+	}
+		
+	public class InactiveJavaThread implements IJavaThread {
+		private int ref = 0;
+
+		private InactiveJavaThread(int ref) {
+			this.ref = ref;
+
+		}
+
+		@Override
+		public int getStackTraceSerialNumber() {
+
+			return 0;
+
+		}
+
+		@Override
+		public String getThreadGroupName() {
+
+			return "";
+		}
+
+		@Override
+		public String getThreadGroupParentName() {
+			return "";
+		}
+
+		@Override
+		public String getThreadName() {
+			return "";
+		}
+
+		@Override
+		public long getThreadObjectID() {
+
+			return 0;
+		}
+
+		@Override
+		public int getThreadSerialNumber() {
+
+			return getEndingJavaThreadRecord(ref).getThreadSerialNumber();
+		}
+
+		@Override
+		public boolean isActive() {
+
+			return false;
+		}
+
+		@Override
+		public IJavaStack getStack() {
+			
+			return null;
+		}
+	}
+
+	public class ActiveJavaThread implements IJavaThread {
+
+		private final class JavaStackFrame implements IJavaStackFrame {
+			private int frameRecord=0;
+			public JavaStackFrame(int stackRecord) {
+				this.frameRecord=stackRecord;
+			}
+
+			@Override
+			public Long getID() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				return record.getStackFrameID();
+			}
+
+			@Override
+			public int getLineNumber() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				return record.getLineNumber();
+			}
+
+			@Override
+			public IJavaClass getMethodClass() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				int sn=record.getClassSerialNumber();
+				return loadedClassesBySerial.get(sn);
+			}
+
+			@Override
+			public String getMethodName() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				long id=record.getMethodNameID();
+				return getName(id);
+			}
+
+			@Override
+			public String getMethodSignature() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				long id=record.getMethodSignatureID();
+				return getName(id);
+			}
+
+			@Override
+			public String getSourceFileName() {
+				IJavaStackFrameHProfRecord record=(IJavaStackFrameHProfRecord) file.getRecord(frameRecord);
+				long id=record.getSourceFileNameID();
+				return getName(id);
+			}
+		}
+
+		private int ref = 0;
+
+		private ActiveJavaThread(int ref) {
+			this.ref = ref;
+
+		}
+
+		@Override
+		public boolean isActive() {
+
+			return true;
+		}
+
+		@Override
+		public int getStackTraceSerialNumber() {
+
+			return getActiveJavaThreadRecord(ref).getStackTraceSerialNumber();
+		}
+
+		@Override
+		public String getThreadGroupName() {
+
+			long id = getActiveJavaThreadRecord(ref).getThreadGroupNameID();
+			return getName(id);
+		}
+
+		@Override
+		public String getThreadGroupParentName() {
+			long id = getActiveJavaThreadRecord(ref)
+					.getThreadGroupParentNameID();
+			return getName(id);
+		}
+
+		@Override
+		public String getThreadName() {
+			long id = getActiveJavaThreadRecord(ref).getThreadNameID();
+			return getName(id);
+		}
+
+		@Override
+		public long getThreadObjectID() {
+			return getActiveJavaThreadRecord(ref).getThreadObjectID();
+		}
+
+		@Override
+		public int getThreadSerialNumber() {
+			return getActiveJavaThreadRecord(ref).getThreadSerialNumber();
+		}
+
+		@Override
+		public IJavaStack getStack() {
+			// stack trace record no
+			int sn = getStackTraceSerialNumber();
+			int recordId = stackTraces.get(sn);
+			IJavaStackTraceHProfRecord record = (IJavaStackTraceHProfRecord) file
+					.getRecord(recordId);
+			int stackElements = record.getFrameCount();
+			final IJavaStackFrame[] data = new IJavaStackFrame[stackElements];
+			for (int i = 0; i < stackElements; i++) {
+				long stackFrameElementID = record.getStackFrameID(i);
+				int stackRecord=stackTraceFrames.get(stackFrameElementID);
+				data[i]=new JavaStackFrame(stackRecord);
+			}
+			IJavaStack stack = new IJavaStack() {
+
+				@Override
+				public IJavaStackFrame[] getStack() {
+
+					return data;
+				}
+
+				@Override
+				public IJavaThread getThread() {
+					return ActiveJavaThread.this;
+				}
+			};
+
+			return stack;
+		}
+
+	}
+
+	private IThreadEndingHProfRecord getEndingJavaThreadRecord(int ref) {
+
+		return (IThreadEndingHProfRecord) file.getRecord(ref);
+	}
+
+	private IThreadActiveHProfRecord getActiveJavaThreadRecord(int ref) {
+
+		return (IThreadActiveHProfRecord) file.getRecord(ref);
+	}
+
+	private ILoadClassHProfRecord getLoadedClassHProfRecord(int ref) {
+		return (ILoadClassHProfRecord) file.getRecord(ref);
+	}
+
+	public int getUTF8Count() {
+		return utf8ids.length;
+	}
+
+	public long getUTF8IDFromIndex(int index) {
+
+		return utf8ids[index];
+	}
+
+	public int getLoadedClassCount() {
+		return loadedClassRecordNumbers.length;
+	}
+
+	public IJavaClass getLoadedClass(int index) {
+		return loadedClassRecordNumbers[index];
+	}
+
+	public HProfFile getFile() {
+		return file;
+	}
+
+	public int getUTF8Length(long id) {
+
+		int record = getUTF8RecordID(id);
+		if (record < 0)
+			return record;
+		IHProfRecord rec = file.getRecord(record);
+		if (rec == null)
+			return -2;
+		if (rec instanceof IUTF8HProfRecord) {
+			IUTF8HProfRecord utf8record = (IUTF8HProfRecord) rec;
+			return utf8record.getCharacters().length;
+		}
+
+		return -3;
+
+	}
+
+	public ClassSummary getRecordSummary() {
+		return recordSummary;
+	}
+
+	
+
+	public IHeapDumpHProfRecord getHeapRecord() {
+		
+			return heapRecord;
+		
+	}
+
+	/**
+	 * Return the record number for the heap record 
+	 * @return
+	 */
+	public long getHeapRecordLocation() {
+		
+		return heapRecordLocation;
+	}
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IConstantPoolEntry.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IConstantPoolEntry.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IConstantPoolEntry.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IConstantPoolEntry.java Thu May  7 14:50:21 2009
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import org.apache.kato.common.BasicType;
+
+public interface IConstantPoolEntry {
+	public int getIndex();
+	
+	public BasicType getType();
+
+	public Object getValue();
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClass.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClass.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClass.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClass.java Thu May  7 14:50:21 2009
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import org.apache.kato.hprof.datalayer.ConstantPoolEntry;
+import org.apache.kato.hprof.datalayer.InstanceFieldEntry;
+import org.apache.kato.hprof.datalayer.StaticFieldEntry;
+
+/**
+ * Allows JavaClass information to be pulled from HProf records.
+ * 
+ *
+ */
+public interface IJavaClass {
+	/**
+	 * @return
+	 */
+	public long getClassObjectID();
+
+	public int getStackTraceSerialNumber();
+
+	public String getClassName();
+
+	public int getClassSerialNumber();
+	public long getClassLoaderObjectID();
+	public long getProtectionDomainObjectID();
+	public long getSignersObjectID();
+	
+	/**
+	 * Get the object ID of the superclass.
+	 * 
+	 * @return long object id.
+	 */
+	public long getSuperClassObjectID();
+
+	public int getInstanceSize();
+
+	public ConstantPoolEntry[] getConstantPoolEntries();
+	
+	public StaticFieldEntry[] getStaticFields();
+	
+	public InstanceFieldEntry[] getInstanceFields();
+
+	public int getOffsetSize();
+}

Added: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClassLoader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClassLoader.java?rev=772669&view=auto
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClassLoader.java (added)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/IJavaClassLoader.java Thu May  7 14:50:21 2009
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.hprof;
+
+import java.util.Collection;
+
+/**
+ * Represents a class loader. Is created by HProfView.
+ *
+ */
+public interface IJavaClassLoader {	
+	/**
+	 * The ID of the Object this class loader is identified by.
+	 * 
+	 * @return long object id.
+	 */
+	public abstract long getID();
+	
+	/**
+	 * The collection of java class loaders
+	 * 
+	 * @return Collection<IJavaClass> classes defined by this class loader.
+	 */
+	public abstract Collection<Long> getClasses();
+}