diff options
Diffstat (limited to 'plugins/gradle/tooling-extension-impl/src')
3 files changed, 245 insertions, 8 deletions
diff --git a/plugins/gradle/tooling-extension-impl/src/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/plugins/gradle/tooling-extension-impl/src/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService index 244e58d2128e..816ef05c1e4d 100644 --- a/plugins/gradle/tooling-extension-impl/src/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ b/plugins/gradle/tooling-extension-impl/src/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService @@ -17,3 +17,4 @@ org.jetbrains.plugins.gradle.tooling.builder.WarModelBuilderImpl org.jetbrains.plugins.gradle.tooling.builder.ModuleExtendedModelBuilderImpl org.jetbrains.plugins.gradle.tooling.builder.ModelBuildScriptClasspathBuilderImpl org.jetbrains.plugins.gradle.tooling.builder.ScalaModelBuilderImpl +org.jetbrains.plugins.gradle.tooling.builder.ExternalProjectBuilderImpl diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy new file mode 100644 index 000000000000..3bb6b471b755 --- /dev/null +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy @@ -0,0 +1,231 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.gradle.tooling.builder + +import com.google.gson.GsonBuilder +import com.intellij.openapi.externalSystem.model.* +import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.api.file.ContentFilterable +import org.gradle.api.file.FileCopyDetails +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.api.tasks.util.PatternFilterable +import org.jetbrains.annotations.NotNull +import org.jetbrains.annotations.Nullable +import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder +import org.jetbrains.plugins.gradle.tooling.ModelBuilderService + +import java.util.concurrent.ConcurrentHashMap + +/** + * @author Vladislav.Soroka + * @since 12/20/13 + */ +class ExternalProjectBuilderImpl implements ModelBuilderService { + + private final cache = new ConcurrentHashMap<String, ExternalProject>() + + @Override + public boolean canBuild(String modelName) { + return ExternalProject.name.equals(modelName) + } + + @Nullable + @Override + public Object buildAll(final String modelName, final Project project) { + ExternalProject externalProject = cache[project.path] + if (externalProject != null) return externalProject + + DefaultExternalProject defaultExternalProject = new DefaultExternalProject() + defaultExternalProject.externalSystemId = "GRADLE" + defaultExternalProject.name = project.name + defaultExternalProject.QName = ":".equals(project.path) ? project.name : project.path + defaultExternalProject.version = wrap(project.version) + defaultExternalProject.description = project.description + defaultExternalProject.buildDir = project.buildDir + defaultExternalProject.buildFile = project.buildFile + defaultExternalProject.group = wrap(project.group) + defaultExternalProject.projectDir = project.projectDir + defaultExternalProject.sourceSets = getSourceSets(project) + defaultExternalProject.tasks = getTasks(project) + + defaultExternalProject.plugins = getPlugins(project) + //defaultExternalProject.setProperties(project.getProperties()) + + + final Map<String, ExternalProject> childProjects = new HashMap<String, ExternalProject>(project.getChildProjects().size()) + for (Map.Entry<String, Project> projectEntry : project.getChildProjects().entrySet()) { + final Object externalProjectChild = buildAll(modelName, projectEntry.getValue()) + if (externalProjectChild instanceof ExternalProject) { + childProjects.put(projectEntry.getKey(), (ExternalProject)externalProjectChild) + } + } + defaultExternalProject.setChildProjects(childProjects) + cache.put(project.getPath(), defaultExternalProject) + + defaultExternalProject + } + + static Map<String, ExternalPlugin> getPlugins(Project project) { + def result = [:] as Map<String, ExternalPlugin> + project.convention.plugins.each { key, value -> + ExternalPlugin externalPlugin = new DefaultExternalPlugin() + externalPlugin.id = key + result.put(key, externalPlugin) + } + + result + } + + static Map<String, ExternalTask> getTasks(Project project) { + def result = [:] as Map<String, ExternalTask> + + project.tasks.all { Task task -> + ExternalTask externalTask = new DefaultExternalTask() + externalTask.name = task.name + externalTask.description = task.description + externalTask.group = task.group + externalTask.QName = task.path + result.put(externalTask.QName, externalTask) + } + + result + } + + static Map<String, ExternalSourceSet> getSourceSets(Project project) { + def result = [:] as Map<String, ExternalSourceSet> + if (!project.hasProperty("sourceSets") || !(project.sourceSets instanceof SourceSetContainer)) { + return result + } + def sourceSets = project.sourceSets as SourceSetContainer + + def (resourcesIncludes, resourcesExcludes, filterReaders) = getFilters(project, 'processResources') + def (testResourcesIncludes, testResourcesExcludes, testFilterReaders) = getFilters(project, 'processTestResources') + //def (javaIncludes,javaExcludes) = getFilters(project,'compileJava') + + sourceSets.all { SourceSet sourceSet -> + ExternalSourceSet externalSourceSet = new DefaultExternalSourceSet() + externalSourceSet.name = sourceSet.name + + def sources = [:] as Map<ExternalSystemSourceType, ExternalSourceDirectorySet> + ExternalSourceDirectorySet resourcesDirectorySet = new DefaultExternalSourceDirectorySet() + resourcesDirectorySet.name = sourceSet.resources.name + resourcesDirectorySet.srcDirs = sourceSet.resources.srcDirs + resourcesDirectorySet.outputDir = sourceSet.output.resourcesDir + + ExternalSourceDirectorySet javaDirectorySet = new DefaultExternalSourceDirectorySet() + javaDirectorySet.name = sourceSet.allJava.name + javaDirectorySet.srcDirs = sourceSet.allJava.srcDirs + javaDirectorySet.outputDir = sourceSet.output.classesDir +// javaDirectorySet.excludes = javaExcludes + sourceSet.java.excludes; +// javaDirectorySet.includes = javaIncludes + sourceSet.java.includes; + + if (SourceSet.TEST_SOURCE_SET_NAME.equals(sourceSet.name)) { + resourcesDirectorySet.excludes = testResourcesExcludes + sourceSet.resources.excludes; + resourcesDirectorySet.includes = testResourcesIncludes + sourceSet.resources.includes; + resourcesDirectorySet.filters = testFilterReaders + sources.put(ExternalSystemSourceType.TEST, javaDirectorySet) + sources.put(ExternalSystemSourceType.TEST_RESOURCE, resourcesDirectorySet) + } + else { + resourcesDirectorySet.excludes = resourcesExcludes + sourceSet.resources.excludes; + resourcesDirectorySet.includes = resourcesIncludes + sourceSet.resources.includes; + resourcesDirectorySet.filters = filterReaders + sources.put(ExternalSystemSourceType.SOURCE, javaDirectorySet) + sources.put(ExternalSystemSourceType.RESOURCE, resourcesDirectorySet) + } + + externalSourceSet.sources = sources + result[sourceSet.name] = externalSourceSet + } + result + } + + static getFilters(Project project, String taskName) { + def includes = [] + def excludes = [] + def filterReaders = [] as List<ExternalFilter> + def filterableTask = project.tasks.findByName(taskName) + if (filterableTask instanceof PatternFilterable) { + includes += filterableTask.includes + excludes += filterableTask.excludes + } + + if(System.getProperty('idea.disable.gradle.resource.filtering', 'false').toBoolean()) { + return [includes, excludes, filterReaders] + } + + try { + if (filterableTask instanceof ContentFilterable && filterableTask.metaClass.respondsTo(filterableTask, "getMainSpec")) { + def properties = filterableTask.getMainSpec().properties + def copyActions = properties?.allCopyActions ?: properties?.copyActions + + if(copyActions) { + copyActions.each { Action<? super FileCopyDetails> action -> + if (action.hasProperty('val$filterType') && action.hasProperty('val$properties')) { + def filterType = (action?.val$filterType as Class).name + def filter = [filterType: filterType] as DefaultExternalFilter + def props = action?.val$properties + if (props) { + filter.propertiesAsJsonMap = new GsonBuilder().create().toJson(props); + } + filterReaders << filter + } + else if (action.class.simpleName.equals('RenamingCopyAction') && action.hasProperty('transformer')) { + if (action.transformer.hasProperty('matcher') && action?.transformer.hasProperty('replacement')) { + String pattern = action?.transformer?.matcher.pattern().pattern + String replacement = action?.transformer?.replacement + def filter = [filterType: 'RenamingCopyFilter'] as DefaultExternalFilter + if(pattern && replacement){ + filter.propertiesAsJsonMap = new GsonBuilder().create().toJson([pattern: pattern, replacement: replacement]); + filterReaders << filter + } + } + } +// else { +// project.logger.error( +// ErrorMessageBuilder.create(project, "Resource configuration errors") +// .withDescription("Unsupported copy action found: " + action.class.name).build()) +// } + } + } + } + } + catch (Exception ignore) { +// project.logger.error( +// ErrorMessageBuilder.create(project, e, "Resource configuration errors") +// .withDescription("Unable to resolve resources filtering configuration").build()) + } + + return [includes, excludes, filterReaders] + } + + + private static String wrap(Object o) { + return o instanceof CharSequence ? o.toString() : "" + } + + @NotNull + @Override + public ErrorMessageBuilder getErrorMessageBuilder(@NotNull Project project, @NotNull Exception e) { + return ErrorMessageBuilder.create( + project, e, "Project resolve errors" + ).withDescription("Unable to resolve additional project configuration.") + } +} diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/WarModelBuilderImpl.groovy b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/WarModelBuilderImpl.groovy index 00f4c8bb0b6e..2eb7137949e2 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/WarModelBuilderImpl.groovy +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/WarModelBuilderImpl.groovy @@ -88,20 +88,25 @@ class WarModelBuilderImpl implements ModelBuilderService { if (resolver.metaClass.respondsTo(resolver, 'getSourcePaths')) { sourcePaths = resolver.getSourcePaths() - } else if (resolver.this$0.metaClass.respondsTo(resolver, 'getSourcePaths')) { + } else if (resolver.hasProperty('sourcePaths')) { + sourcePaths = resolver.sourcePaths + } else if (resolver.hasProperty('this$0') && resolver.this$0.metaClass.respondsTo(resolver, 'getSourcePaths')) { sourcePaths = resolver.this$0.getSourcePaths() - } else { + } else if (resolver.hasProperty('this$0') && resolver.this$0.hasProperty('sourcePaths')) { + sourcePaths = resolver.this$0.sourcePaths + } /*else { throw new RuntimeException("${GradleVersion.current()} is not supported by web artifact importer") - } + }*/ - (sourcePaths.flatten() as List).each { def path -> - if (path instanceof String) { - def file = new File(warTask.project.projectDir, path) - addPath(webResources, relativePath, "", file) + if(sourcePaths) { + (sourcePaths.flatten() as List).each { def path -> + if (path instanceof String) { + def file = new File(warTask.project.projectDir, path) + addPath(webResources, relativePath, "", file) + } } } - resolver.source.visit(new FileVisitor() { @Override public void visitDir(FileVisitDetails dirDetails) { |