diff --git a/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncludeResourceResolvers.kt b/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncludeResourceResolvers.kt new file mode 100644 index 0000000000..13c54e791d --- /dev/null +++ b/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncludeResourceResolvers.kt @@ -0,0 +1,42 @@ +package com.jetbrains.plugin.structure.intellij.xinclude + +import com.jetbrains.plugin.structure.intellij.resources.ResourceResolver +import com.jetbrains.plugin.structure.jar.META_INF +import java.nio.file.FileSystems +import java.nio.file.Path + +/** + * Resolves a resource not only in the relative path, but also in the `META-INF` subdirectory. + * + * This is used to resolve plugin descriptors that are scattered across resource roots and `META-INF` + * directories, while XIncluding each other. + */ +class MetaInfResourceResolver(private val delegateResolver: ResourceResolver) : ResourceResolver { + override fun resolveResource(relativePath: String, basePath: Path): ResourceResolver.Result { + val parentPath = getParent(basePath) ?: return ResourceResolver.Result.NotFound + return delegateResolver.resolveResource(relativePath, parentPath.resolve(META_INF).resolve(relativePath)) + } + + private fun getParent(path: Path): Path? { + val parent: Path? = path.parent + return if (parent == null && path.fileSystem != FileSystems.getDefault()) { + path.fileSystem.rootDirectories.first() + } else { + parent + } + } +} + +/** + * Resolves a resource not only in the base path, but also in the parent directory. + * + * This is used to resolve a XIncluded resource placed in the root directory being referenced + * from the `META-INF` directory. + * + */ +class InParentPathResourceResolver(private val delegateResolver: ResourceResolver) : ResourceResolver { + override fun resolveResource(relativePath: String, basePath: Path): ResourceResolver.Result { + val parentPath: Path = basePath.parent ?: return ResourceResolver.Result.NotFound + return delegateResolver.resolveResource(relativePath, parentPath) + } +} \ No newline at end of file diff --git a/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncluder.kt b/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncluder.kt index 8965094615..eb38c84d60 100644 --- a/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncluder.kt +++ b/intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/xinclude/XIncluder.kt @@ -4,10 +4,13 @@ package com.jetbrains.plugin.structure.intellij.xinclude +import com.jetbrains.plugin.structure.base.utils.simpleName import com.jetbrains.plugin.structure.intellij.plugin.PluginCreator +import com.jetbrains.plugin.structure.intellij.resources.CompositeResourceResolver import com.jetbrains.plugin.structure.intellij.resources.ResourceResolver import com.jetbrains.plugin.structure.intellij.utils.JDOMUtil import org.jdom2.* +import java.lang.Boolean.parseBoolean import java.nio.file.Path import java.util.* import java.util.regex.Pattern @@ -18,7 +21,7 @@ import java.util.regex.Pattern * The inspiring implementation is in IntelliJ Community class [`com.intellij.util.xmlb.JDOMXIncluder`](https://github.com/JetBrains/intellij-community/blob/master/platform/util/src/com/intellij/util/xmlb/JDOMXIncluder.java). * This implementation provides better messages. */ -class XIncluder private constructor(private val resourceResolver: ResourceResolver) { +class XIncluder private constructor(private val resourceResolver: ResourceResolver, private val properties: Properties) { companion object { @Throws(XIncluderException::class) @@ -27,7 +30,7 @@ class XIncluder private constructor(private val resourceResolver: ResourceResolv presentablePath: String, resourceResolver: ResourceResolver, documentPath: Path - ): Document = XIncluder(resourceResolver).resolveXIncludes(document, presentablePath, documentPath) + ): Document = XIncluder(resourceResolver, System.getProperties()).resolveXIncludes(document, presentablePath, documentPath) } private fun resolveXIncludes(document: Document, presentablePath: String, documentPath: Path): Document { @@ -41,12 +44,43 @@ class XIncluder private constructor(private val resourceResolver: ResourceResolv return Document(rootElement) } - private fun resolveIncludeOrNonInclude(element: Element, bases: Stack): List = - if (isIncludeElement(element)) { - resolveXIncludeElements(element, bases) + private fun resolveIncludeOrNonInclude(element: Element, bases: Stack): List { + return if (isIncludeElement(element)) { + if (shouldXInclude(element, bases)) { + resolveXIncludeElements(element, bases) + } else { + emptyList() + } } else { listOf(resolveNonXIncludeElement(element, bases)) } + } + + /** + * Handle conditional resolution of XInclude. + * + * - `includeIf`: Includes the document only if the corresponding property is set to a `true` value. + * - `includeUnless`: Includes the document if the corresponding property is either not set, or its value is `false`. + * + * Note: Although this feature is used by the Kotlin plugin, it should not be employed as a general purpose + * conditional inclusion method for other plugins. + */ + private fun shouldXInclude(element: Element, bases: Stack): Boolean { + val includeUnless: String? = element.getAttributeValueByLocalName(INCLUDE_UNLESS_ATTR_NAME) + val includeIf: String? = element.getAttributeValueByLocalName(INCLUDE_IF_ATTR_NAME) + if (isResolvingConditionalIncludes && includeUnless != null && includeIf != null) { + throw XIncluderException( + bases, "Cannot use '$INCLUDE_IF_ATTR_NAME' and '$INCLUDE_UNLESS_ATTR_NAME' attributes simultaneously. " + + "Specify either of these attributes or none to always include the document" + ) + } + + return if ((includeIf != null || includeUnless != null) && !isResolvingConditionalIncludes) { + false + } else includeIf == null && includeUnless == null + || (includeIf != null && properties.isTrue(includeIf)) + || (includeUnless != null && properties.isFalse(includeUnless)) + } private fun resolveXIncludeElements(xincludeElement: Element, bases: Stack): List { //V2 included configs can be located only in root @@ -67,8 +101,13 @@ class XIncluder private constructor(private val resourceResolver: ResourceResolv } val basePath = bases.peek()!!.documentPath + val resolver = CompositeResourceResolver(mutableListOf().apply { + add(resourceResolver) + if (basePath.isInMetaInf()) add(InParentPathResourceResolver(resourceResolver)) + if (basesHaveMetaInfResolution(bases)) add(MetaInfResourceResolver(resourceResolver)) + }) - when (val resourceResult = resourceResolver.resolveResource(href, basePath)) { + when (val resourceResult = resolver.resolveResource(href, basePath)) { is ResourceResolver.Result.Found -> resourceResult.use { val remoteDocument = try { JDOMUtil.loadDocument(it.resourceStream.buffered()) @@ -95,6 +134,15 @@ class XIncluder private constructor(private val resourceResolver: ResourceResolv } } + private fun Path.isInMetaInf(): Boolean { + val parent: Path? = parent + return parent?.simpleName == "META-INF" + } + + private fun basesHaveMetaInfResolution(bases: Stack): Boolean { + return bases.any { it.documentPath.isInMetaInf() } + } + private fun resolveXIncludesOfRemoteDocument( remoteDocument: Document, xincludeElement: Element, @@ -213,6 +261,23 @@ class XIncluder private constructor(private val resourceResolver: ResourceResolv private fun isIncludeElement(element: Element): Boolean = element.name == INCLUDE && element.namespace == HTTP_XINCLUDE_NAMESPACE + + private fun Element.getAttributeValueByLocalName(attributeLocalName: String): String? { + val attr = this.attributes.find { it.name == attributeLocalName } + return attr?.value + } + + private fun Properties.isTrue(key: String?): Boolean { + return parseBoolean(getProperty(key)) + } + + private fun Properties.isFalse(key: String?): Boolean { + return !parseBoolean(getProperty(key)) + } + + private val isResolvingConditionalIncludes: Boolean + get() = properties.isTrue(IS_RESOLVING_CONDITIONAL_INCLUDES_PROPERTY) + } private const val HTTP_WWW_W3_ORG_2001_XINCLUDE = "http://www.w3.org/2001/XInclude" @@ -226,4 +291,9 @@ private const val XPOINTER = "xpointer" private val HTTP_XINCLUDE_NAMESPACE = Namespace.getNamespace(XI, HTTP_WWW_W3_ORG_2001_XINCLUDE) private val XPOINTER_PATTERN = Pattern.compile("xpointer\\((.*)\\)") -private val XPOINTER_SELECTOR_PATTERN = Pattern.compile("/([^/]*)(/[^/]*)?/\\*") \ No newline at end of file +private val XPOINTER_SELECTOR_PATTERN = Pattern.compile("/([^/]*)(/[^/]*)?/\\*") + +private const val INCLUDE_UNLESS_ATTR_NAME = "includeUnless" +private const val INCLUDE_IF_ATTR_NAME = "includeIf" + +const val IS_RESOLVING_CONDITIONAL_INCLUDES_PROPERTY = "com.jetbrains.plugin.structure.intellij.xinclude.isResolvingConditionalIncludes" \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/mocks/XIncludePluginTest.kt b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/mocks/XIncludePluginTest.kt new file mode 100644 index 0000000000..a6f771d77d --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/mocks/XIncludePluginTest.kt @@ -0,0 +1,235 @@ +package com.jetbrains.plugin.structure.mocks + +import com.jetbrains.plugin.structure.base.problems.PluginProblem +import com.jetbrains.plugin.structure.base.utils.contentBuilder.buildZipFile +import com.jetbrains.plugin.structure.intellij.plugin.IdePlugin +import com.jetbrains.plugin.structure.intellij.plugin.IdePluginManager +import com.jetbrains.plugin.structure.intellij.plugin.PluginDependencyImpl +import com.jetbrains.plugin.structure.rules.FileSystemType +import com.jetbrains.plugin.structure.xinclude.withConditionalXIncludes +import com.jetbrains.plugin.structure.xinclude.withSystemProperty +import org.junit.Assert.assertEquals +import org.junit.Test +import java.nio.file.Path + +class XIncludePluginTest(fileSystemType: FileSystemType) : BasePluginManagerTest(fileSystemType) { + + @Test + fun `xinclude includeUnless with system property being set to false`() { + withConditionalXIncludes { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", false) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + additionalContent = """ + + """.trimIndent() + } + } + file("applicationServices.xml", optionalDependencyXml) + } + } + } + with(plugin.appContainerDescriptor.services) { + assertEquals(1, size) + val applicationService = first() + assertEquals("com.jetbrains.plugins.structure.mocks.ProjectService", applicationService.serviceImplementation) + } + } + } + } + + @Test + fun `xinclude includeUnless with system property being set to true`() { + withConditionalXIncludes { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", true) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + additionalContent = """ + + """.trimIndent() + } + } + file( + "applicationServices.xml", optionalDependencyXml + ) + } + } + } + assertEquals(0, plugin.appContainerDescriptor.services.size) + } + } + } + + @Test + fun `xinclude includeUnless with system property being set`() { + withConditionalXIncludes { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", true) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + depends += """Optional Dependency""" + additionalContent = """ + + """.trimIndent() + } + } + file("optionalDependency.xml", optionalDependencyXml) + } + } + } + val optionalDescriptor = plugin.optionalDescriptors.single() + assertEquals("optionalDependency.xml", optionalDescriptor.configurationFilePath) + assertEquals(PluginDependencyImpl("Optional Dependency", true, false), optionalDescriptor.dependency) + + assert(plugin.extensions.isEmpty()) + } + } + } + + @Test + fun `xinclude includeIf with system property`() { + withConditionalXIncludes { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", true) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + depends += """Optional Dependency""" + additionalContent = """ + + """.trimIndent() + } + } + file("optionalDependency.xml", optionalDependencyXml) + } + } + } + val optionalDescriptor = plugin.optionalDescriptors.single() + assertEquals("optionalDependency.xml", optionalDescriptor.configurationFilePath) + assertEquals(PluginDependencyImpl("Optional Dependency", true, false), optionalDescriptor.dependency) + + assert(plugin.extensions.isEmpty()) + } + } + } + + @Test + fun `xinclude includeIf conditional inclusion disabled`() { + withConditionalXIncludes { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", true) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + depends += """Optional Dependency""" + additionalContent = """ + + """.trimIndent() + } + } + file("optionalDependency.xml", optionalDependencyXml) + } + } + } + val optionalDescriptor = plugin.optionalDescriptors.single() + assertEquals("optionalDependency.xml", optionalDescriptor.configurationFilePath) + assertEquals(PluginDependencyImpl("Optional Dependency", true, false), optionalDescriptor.dependency) + + assert(plugin.extensions.isEmpty()) + } + } + } + + @Test + fun `conditional inclusion is disabled and conditional element with includeIf is completely ignored`() { + withSystemProperty("com.jetbrains.plugins.structure.mocks.optionalDependency", true) { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + depends += """Optional Dependency""" + additionalContent = """ + + """.trimIndent() + } + } + file("optionalDependency.xml", optionalDependencyXml) + } + } + } + assert(plugin.extensions.isEmpty()) + } + } + + @Test + fun `conditional inclusion is disabled and conditional element with includeUnless is completely ignored`() { + val plugin = buildPluginSuccess(emptyList()) { + buildZipFile(temporaryFolder.newFile("plugin.jar")) { + dir("META-INF") { + file("plugin.xml") { + perfectXmlBuilder.modify { + depends += """Optional Dependency""" + additionalContent = """ + + """.trimIndent() + } + } + file("optionalDependency.xml", optionalDependencyXml) + } + } + } + assert(plugin.extensions.isEmpty()) + } + + override fun createManager(extractDirectory: Path): IdePluginManager = + IdePluginManager.createManager(extractDirectory) + + private fun buildPluginSuccess(expectedWarnings: List, pluginFactory: IdePluginFactory = ::defaultPluginFactory, pluginFileBuilder: () -> Path): IdePlugin { + val pluginFile = pluginFileBuilder() + val successResult = createPluginSuccessfully(pluginFile, pluginFactory) + val (plugin, warnings) = successResult + assertEquals(expectedWarnings.toSet().sortedBy { it.message }, warnings.toSet().sortedBy { it.message }) + assertEquals(pluginFile, plugin.originalFile) + return plugin + } + + private val optionalDependencyXml = """ + + + + + + """.trimIndent() +} \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncluderTest.kt b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncluderTest.kt index 9ed789c6e8..32f6831713 100644 --- a/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncluderTest.kt +++ b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncluderTest.kt @@ -114,4 +114,60 @@ class XIncluderTest { fun `nothing selected error`() { testError("nothingSelected") } + + @Test + fun `includeIf variable is set`() { + withConditionalXIncludes { + val property = "xinclude.enabled" + try { + System.setProperty(property, true.toString()) + testSuccess("includeIf") + } finally { + System.clearProperty(property) + } + } + } + + @Test + fun `includeIf variable is not set`() { + withConditionalXIncludes { + testSuccess("includeIfWithUnsetProperty") + } + } + + @Test + fun `includeUnless variable is set with missing variable`() { + withConditionalXIncludes { + testSuccess("includeUnless") + } + } + + @Test + fun `includeUnless with variable that is set`() { + withConditionalXIncludes { + val property = "xinclude.disabled" + try { + System.setProperty(property, true.toString()) + testSuccess("includeUnlessWithSetProperty") + } finally { + System.clearProperty(property) + } + } + } + + @Test + fun `include in META-INF`() { + testSuccess("metaInfResolveInResourceRoot/META-INF") + } + + @Test + fun `include document in META-INF from resource root`() { + testSuccess("resourceRootResolveInMetaInf") + } + + @Test + fun `include document in META-INF from resource root and from that include a file in the META-INF`() { + testSuccess("metaInfResolveInResourceRootAndBack/META-INF") + } + } \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncludes.kt b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncludes.kt new file mode 100644 index 0000000000..ecaf77a602 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/kotlin/com/jetbrains/plugin/structure/xinclude/XIncludes.kt @@ -0,0 +1,18 @@ +package com.jetbrains.plugin.structure.xinclude + +import com.jetbrains.plugin.structure.intellij.xinclude.IS_RESOLVING_CONDITIONAL_INCLUDES_PROPERTY + +internal fun withSystemProperty(property: String, value: Boolean, block: () -> Unit) { + try { + System.setProperty(property, value.toString()) + block() + } finally { + System.clearProperty(property) + } +} + +internal fun withConditionalXIncludes(block: () -> Unit) { + withSystemProperty(IS_RESOLVING_CONDITIONAL_INCLUDES_PROPERTY, true) { + block() + } +} \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/expected.xml new file mode 100644 index 0000000000..33698e86a7 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/expected.xml @@ -0,0 +1,6 @@ + + + + 42 + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/test.xml new file mode 100644 index 0000000000..137fad6589 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIf/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/expected.xml new file mode 100644 index 0000000000..3b665d469a --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/expected.xml @@ -0,0 +1,2 @@ + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/test.xml new file mode 100644 index 0000000000..137fad6589 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeIfWithUnsetProperty/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/expected.xml new file mode 100644 index 0000000000..6b00b8fb7a --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/expected.xml @@ -0,0 +1,6 @@ + + + + 42 + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/test.xml new file mode 100644 index 0000000000..3688661d47 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnless/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/expected.xml new file mode 100644 index 0000000000..3b665d469a --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/expected.xml @@ -0,0 +1,2 @@ + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/test.xml new file mode 100644 index 0000000000..3688661d47 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/includeUnlessWithSetProperty/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/expected.xml new file mode 100644 index 0000000000..4d84ba3c73 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/expected.xml @@ -0,0 +1,6 @@ + + + + 42 + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/test.xml new file mode 100644 index 0000000000..cacc637fd9 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/META-INF/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRoot/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/expected.xml new file mode 100644 index 0000000000..1a1ba9359d --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/expected.xml @@ -0,0 +1,8 @@ + + + + + 42 + + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/part2.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/part2.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/part2.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/test.xml new file mode 100644 index 0000000000..66757e7e9a --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/META-INF/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/part1.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/part1.xml new file mode 100644 index 0000000000..4a0f2e9a23 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/metaInfResolveInResourceRootAndBack/part1.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/META-INF/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/META-INF/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/META-INF/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/expected.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/expected.xml new file mode 100644 index 0000000000..7f1edb4581 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/expected.xml @@ -0,0 +1,6 @@ + + + + 42 + + diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/part.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/part.xml new file mode 100644 index 0000000000..c8fd781163 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/part.xml @@ -0,0 +1,3 @@ + + 42 + \ No newline at end of file diff --git a/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/test.xml b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/test.xml new file mode 100644 index 0000000000..cacc637fd9 --- /dev/null +++ b/intellij-plugin-structure/tests/src/test/resources/xinclude/success/resourceRootResolveInMetaInf/test.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file