private void createProjects( ProjectDescriptor rootProjectDescriptor, GradleInternal gradle, ClassLoaderScope buildRootClassLoaderScope) { ProjectInternal rootProject = projectFactory.createProject( rootProjectDescriptor, null, gradle, buildRootClassLoaderScope.createChild("root-project"), buildRootClassLoaderScope); gradle.setRootProject(rootProject); addProjects(rootProject, rootProjectDescriptor, gradle, buildRootClassLoaderScope); }
private void applyScript(Object script) { URI scriptUri = resolver.resolveUri(script); UriScriptSource scriptSource = new UriScriptSource("script", scriptUri); ClassLoaderScope classLoaderScopeChild = classLoaderScope.createChild(); ScriptHandler scriptHandler = scriptHandlerFactory.create(scriptSource, classLoaderScopeChild); ScriptPlugin configurer = configurerFactory.create( scriptSource, scriptHandler, classLoaderScopeChild, classLoaderScope, "buildscript", DefaultScript.class, false); for (Object target : targets) { configurer.apply(target); } }
public Class<? extends Plugin> resolve() { ClassPath classPath = classPathFactory.create(); Factory<? extends ClassLoader> loader = parent.loader(classPath); PluginRegistry pluginRegistry = new DefaultPluginRegistry(loader, instantiator); return pluginRegistry.getTypeForId(pluginId.toString()); }
public void apply(final Object target) { DefaultServiceRegistry services = new DefaultServiceRegistry(); services.add(ScriptPluginFactory.class, DefaultScriptPluginFactory.this); services.add(ScriptHandlerFactory.class, scriptHandlerFactory); services.add(ClassLoaderScope.class, targetScope); services.add(LoggingManagerInternal.class, loggingManagerFactory.create()); services.add(Instantiator.class, instantiator); services.add(ScriptHandler.class, scriptHandler); services.add(FileLookup.class, fileLookup); services.add(ModelRuleSourceDetector.class, modelRuleSourceDetector); ScriptSource withImports = importsReader.withImports(scriptSource); PluginDependenciesService pluginDependenciesService = new PluginDependenciesService(getSource()); services.add(PluginDependenciesService.class, pluginDependenciesService); ScriptCompiler compiler = scriptCompilerFactory.createCompiler(withImports); compiler.setClassloader(baseScope.getExportClassLoader()); boolean supportsPluginsBlock = ProjectScript.class.isAssignableFrom(scriptType); String onPluginBlockError = supportsPluginsBlock ? null : "Only Project build scripts can contain plugins {} blocks"; PluginsAndBuildscriptTransformer scriptBlockTransformer = new PluginsAndBuildscriptTransformer( classpathClosureName, onPluginBlockError, documentationRegistry); StatementExtractingScriptTransformer classpathScriptTransformer = new StatementExtractingScriptTransformer(classpathClosureName, scriptBlockTransformer); compiler.setTransformer(classpathScriptTransformer); ScriptRunner<? extends BasicScript> classPathScriptRunner = compiler.compile(scriptType); classPathScriptRunner.getScript().init(target, services); classPathScriptRunner.run(); List<PluginRequest> pluginRequests = pluginDependenciesService.getRequests(); PluginAwareInternal pluginAware = target instanceof PluginAwareInternal ? (PluginAwareInternal) target : null; pluginRequestApplicator.applyPlugins(pluginRequests, scriptHandler, pluginAware, targetScope); compiler.setClassloader(targetScope.getLocalClassLoader()); BuildScriptTransformer transformer = new BuildScriptTransformer( "no_" + classpathScriptTransformer.getId(), classpathScriptTransformer.invert(), scriptSource); compiler.setTransformer(transformer); // TODO - find a less tangled way of getting this in here, see the verifier impl for why it's // needed compiler.setVerifier(new ClosureCreationInterceptingVerifier()); ScriptRunner<? extends BasicScript> runner = compiler.compile(scriptType); BasicScript script = runner.getScript(); script.init(target, services); if (ownerScript && target instanceof ScriptAware) { ((ScriptAware) target).setScript(script); } runner.run(); }
public void applyPlugins( Iterable<? extends PluginRequest> requests, final ScriptHandler scriptHandler, final PluginAware target, ClassLoaderScope classLoaderScope) { final PluginResolutionApplicator resolutionApplicator = new PluginResolutionApplicator(target); List<Result> results = collect( requests, new Transformer<Result, PluginRequest>() { public Result transform(PluginRequest request) { return resolveToFoundResult(request); } }); ImmutableListMultimap<Boolean, Result> categorizedResults = groupBy( results, new Transformer<Boolean, Result>() { public Boolean transform(Result original) { return original.legacyFound != null; } }); final List<Result> legacy = categorizedResults.get(true); List<Result> nonLegacy = categorizedResults.get(false); // Could be different to ids in the requests as they may be unqualified final Map<Result, String> legacyActualPluginIds = Maps.newLinkedHashMap(); if (!legacy.isEmpty()) { final RepositoryHandler repositories = scriptHandler.getRepositories(); final List<MavenArtifactRepository> mavenRepos = repositories.withType(MavenArtifactRepository.class); for (final Result result : legacy) { result.legacyFound.action.execute( new LegacyPluginResolveContext() { public Dependency add( String pluginId, final String m2RepoUrl, Object dependencyNotation) { legacyActualPluginIds.put(result, pluginId); boolean repoExists = any( mavenRepos, new Spec<MavenArtifactRepository>() { public boolean isSatisfiedBy(MavenArtifactRepository element) { return element.getUrl().toString().equals(m2RepoUrl); } }); if (!repoExists) { repositories.maven( new Action<MavenArtifactRepository>() { public void execute(MavenArtifactRepository mavenArtifactRepository) { mavenArtifactRepository.setUrl(m2RepoUrl); } }); } return scriptHandler .getDependencies() .add(ScriptHandler.CLASSPATH_CONFIGURATION, dependencyNotation); } }); } } Configuration classpathConfiguration = scriptHandler.getConfigurations().getByName(ScriptHandler.CLASSPATH_CONFIGURATION); Set<File> files = classpathConfiguration.getFiles(); if (!files.isEmpty()) { ClassPath classPath = new DefaultClassPath(files); Factory<? extends ClassLoader> loader = classLoaderScope.getParent().loader(classPath); classLoaderScope.export(loader); } classLoaderScope.lock(); // We're making an assumption here that the target's plugin registry is backed classLoaderScope. // Because we are only build.gradle files right now, this holds. // It won't for arbitrary scripts though. for (final Map.Entry<Result, String> entry : legacyActualPluginIds.entrySet()) { final PluginRequest request = entry.getKey().request; final String id = entry.getValue(); applyPlugin( request, id, new Runnable() { public void run() { target.getPlugins().apply(id); } }); } for (final Result result : nonLegacy) { applyPlugin( result.request, result.found.resolution.getPluginId().toString(), new Runnable() { public void run() { resolutionApplicator.execute(result.found.resolution); } }); } }