/** * Initializes default class loader. It inherits from classloader, which was used to load this * task, therefore build-in classes and resources are loaded automatically. * * <p>Notice: task's classpath has priority over default classpath, therefore we are able to * easily override resources (templates) */ protected void initClassloader() { // NOTICE: we should use the same classloader, which was used to load this task // otherwise we won't be able to cast instances // (that were loaded via different class loaders) // we are introducting workaround, // that tries to add classpath for current task to original class loader // and stores original classpath // after the task is executed, classpath is restored ClassLoader classLoader = getClass().getClassLoader(); if (classLoader instanceof AntClassLoader) { // add defined classpath AntClassLoader antClassLoader = (AntClassLoader) classLoader; antClassLoader.setParentFirst(false); antClassLoader.setProject(getProject()); savedClasspath = antClassLoader.getClasspath(); Path cp = getClasspath(); // add defined classpath to original path cp.add(new Path(getProject(), savedClasspath)); antClassLoader.setClassPath(cp); } else { // create new class loader classLoader = new AntClassLoader(getClass().getClassLoader(), getProject(), getClasspath(), false); } // set this class loader as new class loader for whole thread // ContextClassLoader is used in StringTemplate's PathGroupLoader and other classes Thread.currentThread().setContextClassLoader(classLoader); }
public Runnable createTargetInstance(Target target, Properties localProperties, Logger logger) { // System.out.println("DefaultProjectModel.createTargetInstance"); AntClassLoader loader = null; DefaultResources resources; try { org.apache.tools.ant.types.Path classPath = toAntPath(resolvePathGroup(target, "classpath")); // Allow additional classes to added to the plugin classpath. This is primarily designed to // allow the additional of instrumented testing classes and libraries for code coverage of // integration // tests with Cobertura String key = "quokka.classpath." + target.getPlugin().getArtifact().getId().getGroup(); if (log.isDebugEnabled()) { log.debug("Searching for additional classpath with key: " + key); } String additionalPath = System.getProperty(key); if ((additionalPath != null) && !additionalPath.trim().equals("")) { org.apache.tools.ant.types.Path existing = classPath; classPath = new org.apache.tools.ant.types.Path(antProject, additionalPath); log.verbose("Prefixing classpath with: " + classPath); classPath.append(existing); // Make sure additions override existing } if ("true".equals(antProject.getProperty("quokka.project.debugclassloaders"))) { loader = new QuokkaLoader(target, antProject.getClass().getClassLoader(), antProject, classPath); } else { loader = antProject.createClassLoader(classPath); } loader.setParent(antProject.getCoreLoader()); loader.setParentFirst(true); loader.setIsolated(false); loader.setThreadContextLoader(); // Initialise this plugin Plugin plugin = target.getPlugin(); loader.forceLoadClass(plugin.getClassName()); Class pluginClass = Class.forName(plugin.getClassName(), true, loader); ws.quokka.core.plugin_spi.Plugin actualPlugin = (ws.quokka.core.plugin_spi.Plugin) pluginClass.newInstance(); if (actualPlugin instanceof MetadataAware) { ((MetadataAware) actualPlugin).setMetadata(getMetadata()); } if (actualPlugin instanceof ResourcesAware) { resources = new DefaultResources(this, target, antProject, logger); ((ResourcesAware) actualPlugin).setResources(resources); } if (actualPlugin instanceof RepositoryAware) { ((RepositoryAware) actualPlugin).setRepository(getRepository()); } if (actualPlugin instanceof RepositoryFactoryAware) { ((RepositoryFactoryAware) actualPlugin) .setRepositoryFactory( (RepositoryFactory) antProject.getReference(ProjectHelper.REPOSITORY_FACTORY)); } if (actualPlugin instanceof ResolverAware) { ((ResolverAware) actualPlugin).setResolver(pathResolver); } if (actualPlugin instanceof ModelFactoryAware) { ((ModelFactoryAware) actualPlugin).setModelFactory(getModelFactory()); } actualPlugin.initialise(); return actualPlugin.getTarget( (target.getTemplateName() != null) ? target.getTemplateName() : target.getName()); } catch (Exception e) { throw new BuildException(e); } finally { if (loader != null) { loader.resetThreadContextLoader(); loader.cleanup(); } } }