From 3823dcc6a440e0a528d234f9f3da164962ceebac Mon Sep 17 00:00:00 2001 From: David McKnight Date: Thu, 13 Oct 2011 15:21:51 +0000 Subject: [PATCH] tracing and support for getting class bytes via the file --- .../core/java/ClassByteStreamHandler.java | 16 +++++++-- .../dstore/core/java/RemoteClassLoader.java | 34 ++++++++++++------- .../dstore/internal/core/util/Sender.java | 16 ++++++++- 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/ClassByteStreamHandler.java b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/ClassByteStreamHandler.java index 3c811eab3d3..834b7f3c7f3 100644 --- a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/ClassByteStreamHandler.java +++ b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/ClassByteStreamHandler.java @@ -158,6 +158,9 @@ public class ClassByteStreamHandler implements IClassByteStreamHandler */ public void run() { + _dataStore.trace("receiving class bytes"); //$NON-NLS-1$ + _dataStore.trace("\tsize="+_size); //$NON-NLS-1$ + _dataStore.trace("\tbuffer="+_buffer); //$NON-NLS-1$ try { PipedInputStream ins = new PipedInputStream(); @@ -168,7 +171,10 @@ public class ClassByteStreamHandler implements IClassByteStreamHandler outStream.close(); IRemoteClassInstance instance = loadInstance(ins); - runInstance(instance); + if (instance != null){ + _dataStore.trace("running class instance "+instance); //$NON-NLS-1$ + runInstance(instance); + } } catch (Exception e) @@ -204,7 +210,13 @@ public class ClassByteStreamHandler implements IClassByteStreamHandler else { // on server run and update client - instance.arrivedOnServer(); + _dataStore.trace("calling arrived on server"); //$NON-NLS-1$ + try { + instance.arrivedOnServer(); + } + catch (Exception e){ + _dataStore.trace(e); + } _dataStore.updateRemoteClassInstance(instance, getIdentifier()); } } diff --git a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/RemoteClassLoader.java b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/RemoteClassLoader.java index 251878ae29a..c1cb9f04c1d 100644 --- a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/RemoteClassLoader.java +++ b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/java/RemoteClassLoader.java @@ -171,8 +171,9 @@ public class RemoteClassLoader extends ClassLoader */ protected Class findClass(String className) throws ClassNotFoundException { + _dataStore.trace("findClass "+className); //$NON-NLS-1$ + // first try using the datastore's local classloaders - ArrayList localLoaders = _dataStore.getLocalClassLoaders(); if (localLoaders != null) { @@ -186,7 +187,7 @@ public class RemoteClassLoader extends ClassLoader } catch (Exception e) { - e.printStackTrace(); + //e.printStackTrace(); } } } @@ -197,7 +198,6 @@ public class RemoteClassLoader extends ClassLoader Class theClass = super.findClass(className); if (theClass != null) { - //System.out.println("Using super's: " + className); return theClass; } } @@ -219,6 +219,7 @@ public class RemoteClassLoader extends ClassLoader // search the class request repository to see if the class has been requested // already ClassRequest request; + _dataStore.trace("checking class repository..."); //$NON-NLS-1$ request = (ClassRequest) _dataStore.getClassRequestRepository().get(className); if (request == null) @@ -229,7 +230,7 @@ public class RemoteClassLoader extends ClassLoader { try { - + _dataStore.trace("checking cache"); //$NON-NLS-1$ Class theClass = _urlClassLoader.findCachedClass(className); //System.out.println("Using cached: " + className); @@ -280,7 +281,7 @@ public class RemoteClassLoader extends ClassLoader */ public synchronized void receiveClass(String className, byte[] bytes, int size) { - // System.out.println("receiving "+className); + _dataStore.trace("receiving "+className); //$NON-NLS-1$ // check the class request repository to see if the class is there ClassRequest request = (ClassRequest) _dataStore.getClassRequestRepository().get(className); if (request != null) @@ -299,14 +300,21 @@ public class RemoteClassLoader extends ClassLoader Class receivedClass = null; try { - // System.out.println("defining "+className+"..."); + _dataStore.trace("defining "+className+"..."); //$NON-NLS-2$ // try to define the class. If any dependent classes cannot be // found the JRE implementation will call findClass to look for them. // Thus we could end up with a stack of requests all waiting until the // classes with no dependent classes load. receivedClass = defineClass(className, bytes, 0, size); + if (receivedClass == null){ + try { + receivedClass = findClass(className); + } + catch (Exception e){ + } + } - // System.out.println("...finished defining "+className); + _dataStore.trace("...finished defining "+className); //$NON-NLS-1$ } catch (NoClassDefFoundError e) { @@ -369,7 +377,7 @@ public class RemoteClassLoader extends ClassLoader // SUCCESS! The class has been received, and defined, so just // load it into the class request object. This action will // also notify threads waiting for the class - // System.out.println("notifying requesters"); + _dataStore.trace("notifying requesters"); request.setLoadedClass(receivedClass); if (useCaching()) { @@ -385,7 +393,7 @@ public class RemoteClassLoader extends ClassLoader */ protected void requestClassInThread(String className) { - // System.out.println("requesting (in thread)"+className); + _dataStore.trace("requesting (in thread)"+className); LoadClassThread thread = new LoadClassThread(className); thread.start(); } @@ -413,9 +421,9 @@ public class RemoteClassLoader extends ClassLoader _dataStore.requestClass(className); // wait for a response - // System.out.println("thread to wait: "+Thread.currentThread().getName()); + _dataStore.trace("thread to wait: "+Thread.currentThread().getName()); if (!request.isLoaded()) request.waitForResponse(); - // System.out.println("thread finished waiting: "+Thread.currentThread().getName()); + _dataStore.trace("thread finished waiting: "+Thread.currentThread().getName()); if (request.isLoaded()) return request.getLoadedClass(); else { // remove the request so that if another one comes in for the @@ -428,9 +436,9 @@ public class RemoteClassLoader extends ClassLoader else if (!request.isLoaded()) { // class has already been requested, wait for it to load - // System.out.println("requested elsewhere, thread to wait: "+Thread.currentThread().getName()); + _dataStore.trace("requested elsewhere, thread to wait: "+Thread.currentThread().getName()); if (!request.isLoaded()) request.waitForResponse(); - // System.out.println("requested elsewhere, thread finished waiting: "+Thread.currentThread().getName()); + _dataStore.trace("requested elsewhere, thread finished waiting: "+Thread.currentThread().getName()); if (request.isLoaded()) return request.getLoadedClass(); else throw new ClassNotFoundException(className); } diff --git a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/Sender.java b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/Sender.java index fa2a8c07230..5f961fb2abe 100644 --- a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/Sender.java +++ b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/Sender.java @@ -24,6 +24,8 @@ package org.eclipse.dstore.internal.core.util; import java.io.BufferedInputStream; import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; @@ -197,9 +199,21 @@ public class Sender implements ISender for (int i = 0; i < loaders.size(); i++) { ClassLoader loader = (ClassLoader) loaders.get(i); - + classInStream = loader.getResourceAsStream(className); classLocation = loader.getResource(className); + + if (classInStream == null && classLocation != null){ + try { + String file = classLocation.getFile(); + File f = new File(file); + if (f.exists()){ + classInStream = new FileInputStream(f); + } + } catch (Exception e) { + _dataStore.trace(e); + } + } if (classInStream != null && classLocation != null) break; } if (classLocation == null || classInStream == null)