From 1aab9586f6893cb5c58ef7a1107d2c7d650537f8 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 26 Jan 2016 01:57:49 +0300 Subject: [PATCH] added TestModuleProperties to JPS model (IDEA-150835) --- .../model/java/JpsJavaExtensionService.java | 6 ++ .../model/module/JpsTestModuleProperties.java | 28 ++++++++ .../impl/JpsJavaExtensionServiceImpl.java | 12 ++++ .../impl/JpsTestModulePropertiesImpl.java | 69 +++++++++++++++++++ .../java/JpsJavaModelSerializerExtension.java | 12 ++++ .../testModuleProperties/productionModule.iml | 9 +++ .../testModuleProperties/testModule.iml | 10 +++ .../testModuleProperties.ipr | 13 ++++ .../JpsProjectSerializationTest.java | 16 +++++ 9 files changed, 175 insertions(+) create mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsTestModuleProperties.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsTestModulePropertiesImpl.java create mode 100644 jps/model-serialization/testData/testModuleProperties/productionModule.iml create mode 100644 jps/model-serialization/testData/testModuleProperties/testModule.iml create mode 100644 jps/model-serialization/testData/testModuleProperties/testModuleProperties.ipr diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java index 5c5d42e4a6c2..0393f2f59ec1 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java @@ -29,6 +29,7 @@ import org.jetbrains.jps.model.library.sdk.JpsSdkReference; import org.jetbrains.jps.model.module.JpsDependencyElement; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleReference; +import org.jetbrains.jps.model.module.JpsTestModuleProperties; import org.jetbrains.jps.service.JpsServiceManager; import java.io.File; @@ -109,6 +110,11 @@ public abstract class JpsJavaExtensionService { @NotNull public abstract JpsJavaCompilerConfiguration getOrCreateCompilerConfiguration(@NotNull JpsProject project); + @Nullable + public abstract JpsTestModuleProperties getTestModuleProperties(@NotNull JpsModule module); + + public abstract void setTestModuleProperties(@NotNull JpsModule module, @NotNull JpsModuleReference productionModuleReference); + @NotNull public abstract JpsSdkReference createWrappedJavaSdkReference(@NotNull JpsJavaSdkTypeWrapper sdkType, @NotNull JpsSdkReference wrapperReference); diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsTestModuleProperties.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsTestModuleProperties.java new file mode 100644 index 000000000000..a9609e885f93 --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsTestModuleProperties.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2016 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.jps.model.module; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElement; + +/** + * @author nik + */ +public interface JpsTestModuleProperties extends JpsElement { + @NotNull JpsModuleReference getProductionModuleReference(); + @Nullable JpsModule getProductionModule(); +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java index 5ace6adc46b5..948adad0ff3f 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.impl.runConfiguration.JpsApplicationRunConfigurationPropertiesImpl; import org.jetbrains.jps.model.java.runConfiguration.JpsApplicationRunConfigurationProperties; import org.jetbrains.jps.model.java.runConfiguration.JpsApplicationRunConfigurationState; +import org.jetbrains.jps.model.module.impl.JpsTestModulePropertiesImpl; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.JpsGlobal; @@ -163,6 +164,17 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService { return configuration; } + @Nullable + @Override + public JpsTestModuleProperties getTestModuleProperties(@NotNull JpsModule module) { + return module.getContainer().getChild(JpsTestModulePropertiesImpl.ROLE); + } + + @Override + public void setTestModuleProperties(@NotNull JpsModule module, @NotNull JpsModuleReference productionModuleReference) { + module.getContainer().setChild(JpsTestModulePropertiesImpl.ROLE, new JpsTestModulePropertiesImpl(productionModuleReference)); + } + @NotNull @Override public JpsSdkReference createWrappedJavaSdkReference(@NotNull JpsJavaSdkTypeWrapper sdkType, diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsTestModulePropertiesImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsTestModulePropertiesImpl.java new file mode 100644 index 000000000000..e8fca2a09366 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsTestModulePropertiesImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2016 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.jps.model.module.impl; + +import com.intellij.openapi.util.NullableLazyValue; +import com.intellij.openapi.util.VolatileNullableLazyValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElementChildRole; +import org.jetbrains.jps.model.ex.JpsCompositeElementBase; +import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; +import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.module.JpsModuleReference; +import org.jetbrains.jps.model.module.JpsTestModuleProperties; + +/** + * @author nik + */ +public class JpsTestModulePropertiesImpl extends JpsCompositeElementBase implements JpsTestModuleProperties { + public static final JpsElementChildRole ROLE = JpsElementChildRoleBase.create("test module properties"); + private static final JpsElementChildRole MODULE_REFERENCE_CHILD_ROLE = JpsElementChildRoleBase.create("production module reference"); + private NullableLazyValue myCachedProductionModule = new VolatileNullableLazyValue() { + @Nullable + @Override + protected JpsModule compute() { + return getProductionModuleReference().resolve(); + } + }; + + public JpsTestModulePropertiesImpl(@NotNull JpsModuleReference productionModuleReference) { + myContainer.setChild(MODULE_REFERENCE_CHILD_ROLE, productionModuleReference); + } + + private JpsTestModulePropertiesImpl(JpsTestModulePropertiesImpl original) { + super(original); + } + + @NotNull + @Override + public JpsModuleReference getProductionModuleReference() { + return myContainer.getChild(MODULE_REFERENCE_CHILD_ROLE); + } + + @Nullable + @Override + public JpsModule getProductionModule() { + return myCachedProductionModule.getValue(); + } + + + @NotNull + @Override + public JpsTestModulePropertiesImpl createCopy() { + return new JpsTestModulePropertiesImpl(this); + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java index 3cb6f8478239..8c4509d07b30 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java @@ -28,6 +28,7 @@ import org.jetbrains.jps.model.module.JpsDependencyElement; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleReference; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; +import org.jetbrains.jps.model.serialization.JDomSerializationUtil; import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; import org.jetbrains.jps.model.serialization.JpsProjectExtensionSerializer; import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementSerializer; @@ -74,6 +75,17 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension saveJavaModuleExtension(module, rootModel); } + @Override + public void loadModuleOptions(@NotNull JpsModule module, @NotNull Element rootElement) { + Element testModuleProperties = JDomSerializationUtil.findComponent(rootElement, "TestModuleProperties"); + if (testModuleProperties != null) { + String productionModuleName = testModuleProperties.getAttributeValue("production-module"); + if (productionModuleName != null) { + getService().setTestModuleProperties(module, JpsElementFactory.getInstance().createModuleReference(productionModuleName)); + } + } + } + @NotNull @Override public List getProjectExtensionSerializers() { diff --git a/jps/model-serialization/testData/testModuleProperties/productionModule.iml b/jps/model-serialization/testData/testModuleProperties/productionModule.iml new file mode 100644 index 000000000000..783733d2f86c --- /dev/null +++ b/jps/model-serialization/testData/testModuleProperties/productionModule.iml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/jps/model-serialization/testData/testModuleProperties/testModule.iml b/jps/model-serialization/testData/testModuleProperties/testModule.iml new file mode 100644 index 000000000000..f5d1f5ac955f --- /dev/null +++ b/jps/model-serialization/testData/testModuleProperties/testModule.iml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/jps/model-serialization/testData/testModuleProperties/testModuleProperties.ipr b/jps/model-serialization/testData/testModuleProperties/testModuleProperties.ipr new file mode 100644 index 000000000000..d96fe4900d36 --- /dev/null +++ b/jps/model-serialization/testData/testModuleProperties/testModuleProperties.ipr @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java index 11fd9c14a968..ae80493e3e3f 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java @@ -101,6 +101,22 @@ public class JpsProjectSerializationTest extends JpsSerializationTestCase { assertEquals(getUrl("src"), root.getUrl()); } + public void testTestModuleProperties() { + loadProject("/jps/model-serialization/testData/testModuleProperties/testModuleProperties.ipr"); + List modules = myProject.getModules(); + assertEquals(2, modules.size()); + JpsModule testModule = modules.get(0); + assertEquals("testModule", testModule.getName()); + JpsModule productionModule = modules.get(1); + assertEquals("productionModule", productionModule.getName()); + + assertNull(JpsJavaExtensionService.getInstance().getTestModuleProperties(productionModule)); + JpsTestModuleProperties testModuleProperties = JpsJavaExtensionService.getInstance().getTestModuleProperties(testModule); + assertNotNull(testModuleProperties); + assertEquals("productionModule", testModuleProperties.getProductionModuleReference().getModuleName()); + assertSame(productionModule, testModuleProperties.getProductionModule()); + } + public void testProjectSdkWithoutType() { loadProject("/jps/model-serialization/testData/projectSdkWithoutType/projectSdkWithoutType.ipr"); JpsSdkReference reference = myProject.getSdkReferencesTable().getSdkReference(JpsJavaSdkType.INSTANCE);