Author: doogie
Date: Fri Dec 11 22:26:24 2009
New Revision: 889838
URL: http://svn.apache.org/viewvc?rev=889838&view=rev
Log:
Generic instrumentation framework. Nothing is configured to use it yet.
Added:
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Instrumenter.java
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/InstrumenterWorker.java
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java?rev=889838&r1=889837&r2=889838&view=diff
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
Fri Dec 11 22:26:24 2009
@@ -49,6 +49,8 @@
protected Classpath classPath = new
Classpath(System.getProperty("java.class.path"));
protected String configFileLocation = null;
private boolean loaded = false;
+ private String instrumenterClassName;
+ private String instrumenterFile;
/**
* @see org.ofbiz.base.container.Container#init(java.lang.String[],
java.lang.String)
@@ -70,10 +72,22 @@
if (cc.getProperty("update-classpath") != null) {
updateClassPath =
"true".equalsIgnoreCase(cc.getProperty("update-classpath").value);
}
+ String instrumenterClassName;
+ if (cc.getProperty("ofbiz.instrumenterClassName") != null) {
+ instrumenterClassName =
cc.getProperty("ofbiz.instrumenterClassName").value;
+ } else {
+ instrumenterClassName = null;
+ }
+ String instrumenterFile;
+ if (cc.getProperty("ofbiz.instrumenterFile") != null) {
+ instrumenterFile = cc.getProperty("ofbiz.instrumenterFile").value;
+ } else {
+ instrumenterFile = null;
+ }
// load the components
try {
- loadComponents(loaderConfig, updateClassPath);
+ loadComponents(loaderConfig, updateClassPath,
instrumenterClassName, instrumenterFile);
} catch (AlreadyLoadedException e) {
throw new ContainerException(e);
} catch (ComponentException e) {
@@ -89,6 +103,10 @@
}
public synchronized void loadComponents(String loaderConfig, boolean
updateClasspath) throws AlreadyLoadedException, ComponentException {
+ loadComponents(loaderConfig, updateClasspath, null, null);
+ }
+
+ public synchronized void loadComponents(String loaderConfig, boolean
updateClasspath, String instrumenterClassName, String instrumenterFile) throws
AlreadyLoadedException, ComponentException {
// set the loaded list; and fail if already loaded
//if (loadedComponents == null) {
// loadedComponents = new LinkedList();
@@ -118,6 +136,7 @@
// set the new classloader/classpath on the current thread
if (updateClasspath) {
+ classPath.instrument(instrumenterFile, instrumenterClassName);
System.setProperty("java.class.path", classPath.toString());
ClassLoader cl = classPath.getClassLoader();
Thread.currentThread().setContextClassLoader(cl);
Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java?rev=889838&r1=889837&r2=889838&view=diff
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java
(original)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java Fri Dec
11 22:26:24 2009
@@ -88,6 +88,9 @@
}
}
+ public void instrument(String instrumenterFile, String
instrumenterClassName) {
+ _elements = InstrumenterWorker.instrument(_elements, instrumenterFile,
instrumenterClassName);
+ }
@Override
public String toString() {
@@ -128,6 +131,12 @@
if (parent == null) {
parent = ClassLoader.getSystemClassLoader();
}
+ return getClassLoader(parent);
+ }
+
+ public ClassLoader getClassLoader(ClassLoader parent) {
+ URL[] urls = getUrls();
+
return new URLClassLoader(urls, parent);
}
Added: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Instrumenter.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Instrumenter.java?rev=889838&view=auto
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Instrumenter.java
(added)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Instrumenter.java Fri
Dec 11 22:26:24 2009
@@ -0,0 +1,11 @@
+package org.ofbiz.base.start;
+
+import java.io.File;
+import java.io.IOException;
+
+public interface Instrumenter {
+ File getDefaultFile() throws IOException;
+ void open(File dataFile, boolean forInstrumenting) throws IOException;
+ byte[] instrumentClass(byte[] bytes) throws IOException;
+ void close() throws IOException;
+}
Added:
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/InstrumenterWorker.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/InstrumenterWorker.java?rev=889838&view=auto
==============================================================================
---
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/InstrumenterWorker.java
(added)
+++
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/InstrumenterWorker.java
Fri Dec 11 22:26:24 2009
@@ -0,0 +1,111 @@
+package org.ofbiz.base.start;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+public final class InstrumenterWorker {
+
+ public static final void copy(InputStream in, OutputStream out) throws
IOException {
+ byte[] buf = new byte[4096];
+ int r;
+ while ((r = in.read(buf)) != -1) {
+ out.write(buf, 0, r);
+ }
+ }
+
+ public static List<File> instrument(List<File> srcPaths, String
instrumenterFileName, String instrumenterClassName) {
+ if (instrumenterFileName == null) return srcPaths;
+ if (instrumenterClassName == null) return srcPaths;
+ Instrumenter instrumenter;
+ try {
+ List<URL> tmpUrls = new ArrayList<URL>();
+ for (File file: srcPaths) {
+ tmpUrls.add(file.toURI().toURL());
+ }
+ ClassLoader tmpLoader = new URLClassLoader(tmpUrls.toArray(new
URL[tmpUrls.size()]), InstrumenterWorker.class.getClassLoader());
+ instrumenter = (Instrumenter)
tmpLoader.loadClass(instrumenterClassName).newInstance();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ return srcPaths;
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ return srcPaths;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return srcPaths;
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ return srcPaths;
+ }
+ try {
+ File instrumenterFile = new File(instrumenterFileName);
+ instrumenterFile.delete();
+ instrumenter.open(instrumenterFile, true);
+ List<File> result = new ArrayList<File>();
+ for (File file: srcPaths) {
+ String path = file.getPath();
+ if (path.matches(".*/ofbiz[^/]*\\.(jar|zip)")) {
+ System.err.println("instrumenting " + path);
+ String prefix = path.substring(0, path.length() - 4);
+ int slash = prefix.lastIndexOf("/");
+ if (slash != -1) prefix = prefix.substring(slash + 1);
+ prefix += "-";
+ File zipTmp = File.createTempFile("instrumented-" +
prefix, path.substring(path.length() - 4));
+ try {
+ zipTmp.deleteOnExit();
+ ZipInputStream zin = new ZipInputStream(new
FileInputStream(file));
+ ZipOutputStream zout = new ZipOutputStream(new
FileOutputStream(zipTmp));
+ ZipEntry entry;
+ while ((entry = zin.getNextEntry()) != null) {
+ InputStream in;
+ long size;
+ if (entry.getName().endsWith(".class")) {
+ ByteArrayOutputStream baos = new
ByteArrayOutputStream();
+ copy(zin, baos);
+ byte[] bytes =
instrumenter.instrumentClass(baos.toByteArray());
+ size = bytes.length;
+ in = new ByteArrayInputStream(bytes);
+ } else {
+ in = zin;
+ size = entry.getSize();
+ }
+ ZipEntry newEntry = new ZipEntry(entry);
+ newEntry.setSize(size);
+ newEntry.setCompressedSize(-1);
+ zout.putNextEntry(newEntry);
+ copy(in, zout);
+ if (entry.getName().endsWith(".class")) {
+ in.close();
+ }
+ }
+ zout.close();
+ file = zipTmp;
+ } catch (IOException e) {
+ zipTmp.delete();
+ throw e;
+ }
+ }
+ result.add(file);
+ }
+ instrumenter.close();
+ return result;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return srcPaths;
+ }
+ }
+}
+
Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java?rev=889838&r1=889837&r2=889838&view=diff
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java (original)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java Fri Dec 11
22:26:24 2009
@@ -225,6 +225,7 @@
classPath.addComponent(config.baseConfig);
}
+ classPath.instrument(config.instrumenterFile,
config.instrumenterClassName);
// set the classpath/classloader
System.setProperty("java.class.path", classPath.toString());
this.classloader = classPath.getClassLoader();
@@ -447,6 +448,8 @@
public String baseDtd;
public String baseConfig;
public String logDir;
+ public String instrumenterClassName;
+ public String instrumenterFile;
public List<String> loaders;
public String awtHeadless;
public String splashLogo;
@@ -643,6 +646,9 @@
TimeZone.setDefault(TimeZone.getTimeZone(tzString));
}
+ instrumenterClassName = getProp(props,
"ofbiz.instrumenterClassName", null);
+ instrumenterFile = getProp(props, "ofbiz.instrumenterFile", null);
+
// loader classes
loaders = new ArrayList<String>();
int currentPosition = 1;