You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2017/07/13 18:55:59 UTC
svn commit: r1801864 - in /jmeter/trunk:
src/core/org/apache/jmeter/gui/action/ActionRouter.java xdocs/changes.xml
Author: fschumacher
Date: Thu Jul 13 18:55:59 2017
New Revision: 1801864
URL: http://svn.apache.org/viewvc?rev=1801864&view=rev
Log:
When looking for classes in ActionRouter, fall back to location of the jar,
where ActionRouter is loaded from.
Provided by Emilian Bold (emi at apache.org)
Modified:
jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionRouter.java
jmeter/trunk/xdocs/changes.xml
Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionRouter.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionRouter.java?rev=1801864&r1=1801863&r2=1801864&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionRouter.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionRouter.java Thu Jul 13 18:55:59 2017
@@ -21,10 +21,16 @@ package org.apache.jmeter.gui.action;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.CodeSource;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import javax.swing.SwingUtilities;
@@ -291,6 +297,35 @@ public final class ActionRouter implemen
}
}
+ private static List<String> findClassesThatExtend(String className, String excluding, String[] searchPath) throws IOException, ClassNotFoundException {
+ List<String> listClasses = ClassFinder.findClassesThatExtend(
+ searchPath, // strPathsOrJars - pathNames or jarfiles to search for classes
+ new Class[] { Class.forName(className) },
+ false, // innerClasses - should we include inner classes?
+ null, // contains - className should contain this string
+ // Ignore the classes which are specific to the reporting tool
+ excluding, // notContains - className should not contain this string
+ false); // annotations - true if classNames are annotations
+
+ return listClasses;
+ }
+
+ private static Optional<String[]> getCodeSourceSearchPath() {
+ CodeSource codeSource = ActionRouter.class.getProtectionDomain().getCodeSource();
+ if (codeSource != null) {
+ try {
+ URL ownLocation = codeSource.getLocation();
+ File ownPath = new File(ownLocation.toURI());
+ if (ownPath.exists()) {
+ return Optional.of(new String[] { ownPath.getAbsolutePath() });
+ }
+ } catch (URISyntaxException ex) {
+ //ignore
+ }
+ }
+ return Optional.empty();
+ }
+
/**
* Only for use by the JMeter.startGui.
* This method must not be called by getInstance() as was done previously.
@@ -301,15 +336,21 @@ public final class ActionRouter implemen
return; // already done
}
try {
- List<String> listClasses = ClassFinder.findClassesThatExtend(
- JMeterUtils.getSearchPaths(), // strPathsOrJars - pathNames or jarfiles to search for classes
- // classNames - required parent class(es) or annotations
- new Class[] {Class.forName("org.apache.jmeter.gui.action.Command") }, // $NON-NLS-1$
- false, // innerClasses - should we include inner classes?
- null, // contains - className should contain this string
- // Ignore the classes which are specific to the reporting tool
- "org.apache.jmeter.report.gui", // $NON-NLS-1$ // notContains - className should not contain this string
- false); // annotations - true if classNames are annotations
+ List<String> listClasses = findClassesThatExtend("org.apache.jmeter.gui.action.Command", // $NON-NLS-1$
+ "org.apache.jmeter.report.gui", // $NON-NLS-1$
+ JMeterUtils.getSearchPaths());
+
+ if (listClasses.isEmpty()) {
+ //fallback
+ Optional<String[]> codeSourceSearchPath = getCodeSourceSearchPath();
+ if (codeSourceSearchPath.isPresent()) {
+ log.info("Using fallback search path");
+ listClasses = findClassesThatExtend("org.apache.jmeter.gui.action.Command", // $NON-NLS-1$
+ "org.apache.jmeter.report.gui", // $NON-NLS-1$
+ codeSourceSearchPath.get());
+ }
+ }
+
if (listClasses.isEmpty()) {
log.error("!!!!!Uh-oh, didn't find any action handlers!!!!!");
throw new JMeterError("No action handlers found - check JMeterHome and libraries");
@@ -344,3 +385,4 @@ public final class ActionRouter implemen
return INSTANCE;
}
}
+
Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1801864&r1=1801863&r2=1801864&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Thu Jul 13 18:55:59 2017
@@ -128,6 +128,8 @@ Summary
<h3>General</h3>
<ul>
+ <li>When looking for classes in <code>ActionRouter</code>, fall back to location of the jar,
+ where <code>ActionRouter</code> is loaded from. Provided by Emilian Bold (emi at apache.org)</li>
</ul>
<ch_section>Non-functional changes</ch_section>