For Lucene, we have a good toolbox like Luke to view, diagnose, edit etc. Do we have similar tool (at least display) for EhCache (when we enable diskPersistent)?
I don't know of any such tool, and the file format isn't really specified or defined as API. Basically, EhCache writes serialized objects to the data and index files. You can read and display them if you access the files directly. To get you going, here is a program as a starting point:
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.RandomAccessFile;
import java.lang.reflect.Field;
import net.sf.ehcache.Element;
import net.sf.ehcache.store.disk.DiskStorageFactory.DiskMarker;
public class EhcacheViewer
{
public static void main( String[] args ) throws Exception
{
final RandomAccessFile data = new RandomAccessFile( "cache/my-cache.data", "r" );
ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "cache/my-cache.index" ) );
try
{
while( true )
{
Object key = ois.readObject();
DiskMarker marker = (DiskMarker) ois.readObject();
long pos = getPosition( marker );
int size = marker.getSize();
data.seek( pos );
byte[] value = new byte[size];
data.readFully( value );
ObjectInputStream ois2 = new ObjectInputStream( new ByteArrayInputStream( value ) );
Element element = (Element) ois2.readObject();
System.out.println( "Element: " + element );
}
}
catch( EOFException e )
{
// ...
}
ois.close();
data.close();
}
private static long getPosition( DiskMarker marker ) throws Exception
{
Field field = marker.getClass().getDeclaredField( "position" );
field.setAccessible( true );
return (Long) field.get( marker );
}
}