diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyExtension.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyExtension.java new file mode 100644 index 000000000000..ba49f8e595fa --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyExtension.java @@ -0,0 +1,18 @@ +package org.jetbrains.jps.model.java; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElement; + +/** + * @author nik + */ +public interface JpsJavaDependencyExtension extends JpsElement { + boolean isExported(); + + void setExported(boolean exported); + + @NotNull + JpsJavaDependencyScope getScope(); + + void setScope(@NotNull JpsJavaDependencyScope scope); +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyScope.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyScope.java new file mode 100644 index 000000000000..a6e46aabb3c3 --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaDependencyScope.java @@ -0,0 +1,8 @@ +package org.jetbrains.jps.model.java; + +/** + * @author nik + */ +public enum JpsJavaDependencyScope { + COMPILE, TEST, RUNTIME, PROVIDED +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependencyElement.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependencyElement.java index 7f118262731a..373784efe42e 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependencyElement.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependencyElement.java @@ -1,10 +1,10 @@ package org.jetbrains.jps.model.module; -import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsCompositeElement; /** * @author nik */ -public interface JpsDependencyElement extends JpsElement { +public interface JpsDependencyElement extends JpsCompositeElement { void remove(); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionKind.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionKind.java index 0a62da133950..f0c3c7c24777 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionKind.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionKind.java @@ -9,7 +9,7 @@ import org.jetbrains.jps.model.module.JpsModule; * @author nik */ public class JavaModuleExtensionKind extends JpsElementKind implements JpsElementFactory { - public static final JavaModuleExtensionKind INSTANCE = new JavaModuleExtensionKind(); + private static final JavaModuleExtensionKind INSTANCE = new JavaModuleExtensionKind(); @NotNull @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java new file mode 100644 index 000000000000..1a241a7cb87d --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionImpl.java @@ -0,0 +1,70 @@ +package org.jetbrains.jps.model.java.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsEventDispatcher; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.JpsParentElement; +import org.jetbrains.jps.model.impl.JpsElementBase; +import org.jetbrains.jps.model.java.JpsJavaDependencyExtension; +import org.jetbrains.jps.model.java.JpsJavaDependencyScope; + +/** + * @author nik + */ +public class JpsJavaDependencyExtensionImpl extends JpsElementBase implements JpsJavaDependencyExtension { + private boolean myExported; + private JpsJavaDependencyScope myScope; + + public JpsJavaDependencyExtensionImpl(JpsEventDispatcher eventDispatcher, JpsParentElement parent, boolean exported, JpsJavaDependencyScope scope) { + super(eventDispatcher, parent); + myExported = exported; + myScope = scope; + } + + public JpsJavaDependencyExtensionImpl(JpsJavaDependencyExtensionImpl original, JpsEventDispatcher eventDispatcher, JpsParentElement parent) { + super(original, eventDispatcher, parent); + myExported = original.myExported; + myScope = original.myScope; + } + + @Override + public boolean isExported() { + return myExported; + } + + @Override + public void setExported(boolean exported) { + if (myExported != exported) { + myExported = exported; + getEventDispatcher().fireElementChanged(this); + } + } + + @NotNull + @Override + public JpsJavaDependencyScope getScope() { + return myScope; + } + + @Override + public void setScope(@NotNull JpsJavaDependencyScope scope) { + if (!scope.equals(myScope)) { + myScope = scope; + getEventDispatcher().fireElementChanged(this); + } + } + + @NotNull + @Override + public JpsJavaDependencyExtensionImpl createCopy(@NotNull JpsModel model, + @NotNull JpsEventDispatcher eventDispatcher, + JpsParentElement parent) { + return new JpsJavaDependencyExtensionImpl(this, eventDispatcher, parent); + } + + @Override + public void applyChanges(@NotNull JpsJavaDependencyExtensionImpl modified) { + setExported(modified.myExported); + setScope(modified.myScope); + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionKind.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionKind.java new file mode 100644 index 000000000000..bd6e6bdcb81c --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaDependencyExtensionKind.java @@ -0,0 +1,31 @@ +package org.jetbrains.jps.model.java.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.*; +import org.jetbrains.jps.model.java.JpsJavaDependencyExtension; +import org.jetbrains.jps.model.java.JpsJavaDependencyScope; +import org.jetbrains.jps.model.module.JpsDependencyElement; + +/** + * @author nik + */ +public class JpsJavaDependencyExtensionKind extends JpsElementKind + implements JpsElementFactory { + public static final JpsJavaDependencyExtensionKind INSTANCE = new JpsJavaDependencyExtensionKind(); + + @NotNull + @Override + public JpsJavaDependencyExtensionImpl create(@NotNull JpsModel model, + @NotNull JpsEventDispatcher eventDispatcher, + JpsParentElement parent) { + return new JpsJavaDependencyExtensionImpl(eventDispatcher, parent, false, JpsJavaDependencyScope.COMPILE); + } + + public static JpsJavaDependencyExtension getExtension(@NotNull JpsDependencyElement element) { + JpsJavaDependencyExtensionImpl extension = element.getContainer().getChild(INSTANCE); + if (extension == null) { + extension = element.getContainer().setChild(INSTANCE); + } + return extension; + } +} diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java index cc6562a97c11..a5d3bf2a71fb 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java @@ -1,16 +1,38 @@ package org.jetbrains.jps.model; +import org.jetbrains.jps.model.java.JpsJavaDependencyScope; +import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.java.JpsJavaModuleType; import org.jetbrains.jps.model.java.impl.JavaModuleExtensionKind; +import org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionImpl; +import org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionKind; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.module.JpsDependencyElement; +import org.jetbrains.jps.model.module.JpsLibraryDependency; import org.jetbrains.jps.model.module.JpsModule; /** * @author nik */ public class JpsJavaExtensionTest extends JpsModelTestCase { - public void test() { + public void testModule() { final JpsModule module = myModel.getProject().addModule(JpsJavaModuleType.INSTANCE, "m"); JavaModuleExtensionKind.getExtension(module).setOutputUrl("file://path"); assertEquals("file://path", JavaModuleExtensionKind.getExtension(module).getOutputUrl()); } + + public void testDependency() { + final JpsModel model = myModel.createModifiableModel(new TestJpsEventDispatcher()); + final JpsModule module = model.getProject().addModule(JpsJavaModuleType.INSTANCE, "m"); + final JpsLibrary library = model.getProject().addLibrary(JpsJavaLibraryType.INSTANCE, "l"); + final JpsLibraryDependency dependency = module.getDependenciesList().addLibraryDependency(library); + JpsJavaDependencyExtensionKind.getExtension(dependency).setScope(JpsJavaDependencyScope.TEST); + JpsJavaDependencyExtensionKind.getExtension(dependency).setExported(true); + model.commit(); + + final JpsDependencyElement dep = assertOneElement(assertOneElement(myModel.getProject().getModules()).getDependenciesList().getDependencies()); + final JpsJavaDependencyExtensionImpl extension = dep.getContainer().getChild(JpsJavaDependencyExtensionKind.INSTANCE); + assertTrue(extension.isExported()); + assertSame(JpsJavaDependencyScope.TEST, extension.getScope()); + } }