added TestModuleProperties to JPS model (IDEA-150835)

This commit is contained in:
nik
2016-01-26 01:57:49 +03:00
parent cf0b466d88
commit 1aab9586f6
9 changed files with 175 additions and 0 deletions
@@ -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<JpsDummyElement> createWrappedJavaSdkReference(@NotNull JpsJavaSdkTypeWrapper sdkType,
@NotNull JpsSdkReference<?> wrapperReference);
@@ -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();
}
@@ -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<JpsDummyElement> createWrappedJavaSdkReference(@NotNull JpsJavaSdkTypeWrapper sdkType,
@@ -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<JpsTestModulePropertiesImpl> implements JpsTestModuleProperties {
public static final JpsElementChildRole<JpsTestModuleProperties> ROLE = JpsElementChildRoleBase.create("test module properties");
private static final JpsElementChildRole<JpsModuleReference> MODULE_REFERENCE_CHILD_ROLE = JpsElementChildRoleBase.create("production module reference");
private NullableLazyValue<JpsModule> myCachedProductionModule = new VolatileNullableLazyValue<JpsModule>() {
@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);
}
}
@@ -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<? extends JpsProjectExtensionSerializer> getProjectExtensionSerializers() {
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestModuleProperties" production-module="productionModule" />
</module>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/testModule.iml" filepath="$PROJECT_DIR$/testModule.iml" />
<module fileurl="file://$PROJECT_DIR$/productionModule.iml" filepath="$PROJECT_DIR$/productionModule.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.4" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
@@ -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<JpsModule> 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<JpsDummyElement> reference = myProject.getSdkReferencesTable().getSdkReference(JpsJavaSdkType.INSTANCE);