From ec53bd4125323dd6e63cff83a44cdd5dda347c77 Mon Sep 17 00:00:00 2001 From: Steve Springett Date: Sat, 26 Apr 2014 01:25:56 -0500 Subject: [PATCH] Cleaning up Velocity. Minor change to Engine and ServiceLoaders to optionally use custom ClassLoader. Former-commit-id: c0a96b36f4959a8b28b6b73e24ad884845140bd6 --- .../org/owasp/dependencycheck/Engine.java | 19 +++++++++++++-- .../analyzer/AnalyzerService.java | 4 ++-- .../data/update/UpdateService.java | 4 ++-- .../reporting/ReportGenerator.java | 23 +++++-------------- .../analyzer/AnalyzerServiceTest.java | 2 +- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/dependency-check-core/src/main/java/org/owasp/dependencycheck/Engine.java b/dependency-check-core/src/main/java/org/owasp/dependencycheck/Engine.java index 5c8bbd389..2f620166d 100644 --- a/dependency-check-core/src/main/java/org/owasp/dependencycheck/Engine.java +++ b/dependency-check-core/src/main/java/org/owasp/dependencycheck/Engine.java @@ -66,19 +66,34 @@ public class Engine { * A Map of analyzers grouped by Analysis phase. */ private final Set fileTypeAnalyzers; + /** + * The ClassLoader to use when dynamically loading Analyzer and Update services. + */ + private ClassLoader serviceClassLoader; /** * The Logger for use throughout the class. */ private static final Logger LOGGER = Logger.getLogger(Engine.class.getName()); + /** * Creates a new Engine. * * @throws DatabaseException thrown if there is an error connecting to the database */ public Engine() throws DatabaseException { + this(Thread.currentThread().getContextClassLoader()); + } + + /** + * Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services. + * + * @throws DatabaseException thrown if there is an error connecting to the database + */ + public Engine(ClassLoader serviceClassLoader) throws DatabaseException { this.dependencies = new ArrayList(); this.analyzers = new EnumMap>(AnalysisPhase.class); this.fileTypeAnalyzers = new HashSet(); + this.serviceClassLoader = serviceClassLoader; ConnectionFactory.initialize(); @@ -110,7 +125,7 @@ public class Engine { analyzers.put(phase, new ArrayList()); } - final AnalyzerService service = new AnalyzerService(); + final AnalyzerService service = new AnalyzerService(serviceClassLoader); final Iterator iterator = service.getAnalyzers(); while (iterator.hasNext()) { final Analyzer a = iterator.next(); @@ -413,7 +428,7 @@ public class Engine { * Cycles through the cached web data sources and calls update on all of them. */ private void doUpdates() { - final UpdateService service = new UpdateService(); + final UpdateService service = new UpdateService(serviceClassLoader); final Iterator iterator = service.getDataSources(); while (iterator.hasNext()) { final CachedWebDataSource source = iterator.next(); diff --git a/dependency-check-core/src/main/java/org/owasp/dependencycheck/analyzer/AnalyzerService.java b/dependency-check-core/src/main/java/org/owasp/dependencycheck/analyzer/AnalyzerService.java index 932f15e14..69f13a9bd 100644 --- a/dependency-check-core/src/main/java/org/owasp/dependencycheck/analyzer/AnalyzerService.java +++ b/dependency-check-core/src/main/java/org/owasp/dependencycheck/analyzer/AnalyzerService.java @@ -36,8 +36,8 @@ public class AnalyzerService { /** * Creates a new instance of AnalyzerService. */ - public AnalyzerService() { - loader = ServiceLoader.load(Analyzer.class); + public AnalyzerService(ClassLoader classLoader) { + loader = ServiceLoader.load(Analyzer.class, classLoader); } /** diff --git a/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/UpdateService.java b/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/UpdateService.java index d5064e773..ac6128d52 100644 --- a/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/UpdateService.java +++ b/dependency-check-core/src/main/java/org/owasp/dependencycheck/data/update/UpdateService.java @@ -36,8 +36,8 @@ public class UpdateService { /** * Creates a new instance of UpdateService. */ - public UpdateService() { - loader = ServiceLoader.load(CachedWebDataSource.class); + public UpdateService(ClassLoader classLoader) { + loader = ServiceLoader.load(CachedWebDataSource.class, classLoader); } /** diff --git a/dependency-check-core/src/main/java/org/owasp/dependencycheck/reporting/ReportGenerator.java b/dependency-check-core/src/main/java/org/owasp/dependencycheck/reporting/ReportGenerator.java index caa89d27d..d437ebd1f 100644 --- a/dependency-check-core/src/main/java/org/owasp/dependencycheck/reporting/ReportGenerator.java +++ b/dependency-check-core/src/main/java/org/owasp/dependencycheck/reporting/ReportGenerator.java @@ -36,7 +36,6 @@ import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import org.owasp.dependencycheck.analyzer.Analyzer; import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; import org.owasp.dependencycheck.dependency.Dependency; @@ -123,29 +122,19 @@ public class ReportGenerator { * @return a velocity engine. */ private VelocityEngine createVelocityEngine() { - final VelocityEngine ve = new VelocityEngine(); - ve.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, VelocityLoggerRedirect.class.getName()); - ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); - ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); - return ve; + final VelocityEngine engine = new VelocityEngine(); + // Logging redirection for Velocity - Required by Jenkins and other server applications + engine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, VelocityLoggerRedirect.class.getName()); + return engine; } /** - * Creates a new Velocity Context initialized with escape and date tools. + * Creates a new Velocity Context. * * @return a Velocity Context. */ private Context createContext() { - //REMOVED all of the velocity tools to simplify the engine trying to resolve issues running this in Jenkins -// final ToolManager manager = new ToolManager(); -// final Context c = manager.createContext(); -// final EasyFactoryConfiguration config = new EasyFactoryConfiguration(); -// config.addDefaultTools(); -// config.toolbox("application").tool("esc", "org.apache.velocity.tools.generic.EscapeTool"). -// tool("org.apache.velocity.tools.generic.DateTool"); -// manager.configure(config); - final VelocityContext c = new VelocityContext(); - return c; + return new VelocityContext(); } /** diff --git a/dependency-check-core/src/test/java/org/owasp/dependencycheck/analyzer/AnalyzerServiceTest.java b/dependency-check-core/src/test/java/org/owasp/dependencycheck/analyzer/AnalyzerServiceTest.java index caa204348..e0964c0f7 100644 --- a/dependency-check-core/src/test/java/org/owasp/dependencycheck/analyzer/AnalyzerServiceTest.java +++ b/dependency-check-core/src/test/java/org/owasp/dependencycheck/analyzer/AnalyzerServiceTest.java @@ -33,7 +33,7 @@ public class AnalyzerServiceTest extends BaseTest { */ @Test public void testGetAnalyzers() { - AnalyzerService instance = new AnalyzerService(); + AnalyzerService instance = new AnalyzerService(Thread.currentThread().getContextClassLoader()); Iterator result = instance.getAnalyzers(); boolean found = false;