From c6a4f9c6ea60824a53d7237911f0cfa5a7838ece Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 12 Jul 2012 10:44:33 +0400 Subject: [PATCH] new project model: facets added --- .../jetbrains/jps/model/module/JpsFacet.java | 20 +++++++ .../jps/model/module/JpsFacetListener.java | 11 ++++ .../jps/model/module/JpsFacetType.java | 11 ++++ .../jetbrains/jps/model/module/JpsModule.java | 10 +++- .../impl/JpsNamedCompositeElementBase.java | 6 +- .../model/library/impl/JpsLibraryImpl.java | 2 +- .../jps/model/module/impl/JpsFacetImpl.java | 56 +++++++++++++++++++ .../jps/model/module/impl/JpsFacetKind.java | 30 ++++++++++ .../module/impl/JpsFacetReferenceImpl.java | 33 +++++++++++ .../jps/model/module/impl/JpsModuleImpl.java | 15 ++++- .../org/jetbrains/jps/model/JpsFacetTest.java | 37 ++++++++++++ 11 files changed, 222 insertions(+), 9 deletions(-) create mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java create mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java create mode 100644 jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetKind.java create mode 100644 jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java create mode 100644 jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java new file mode 100644 index 000000000000..452484494845 --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java @@ -0,0 +1,20 @@ +package org.jetbrains.jps.model.module; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsNamedElement; +import org.jetbrains.jps.model.JpsReferenceableElement; + +/** + * @author nik + */ +//todo[nik] I'm not sure that we really need separate interface for facets in the project model. +//Perhaps facets should be replaced by extensions for module elements +public interface JpsFacet extends JpsNamedElement, JpsReferenceableElement { + + JpsModule getModule(); + + @NotNull + JpsFacetType getType(); + + void delete(); +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java new file mode 100644 index 000000000000..59434f2b8b7a --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java @@ -0,0 +1,11 @@ +package org.jetbrains.jps.model.module; + +import java.util.EventListener; + +/** + * @author nik + */ +public interface JpsFacetListener extends EventListener { + void facetAdded(JpsFacet facet); + void facetRemoved(JpsFacet facet); +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java new file mode 100644 index 000000000000..2ebf9626cc0f --- /dev/null +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java @@ -0,0 +1,11 @@ +package org.jetbrains.jps.model.module; + +import org.jetbrains.jps.model.JpsElementProperties; +import org.jetbrains.jps.model.JpsElementType; +import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties; + +/** + * @author nik + */ +public abstract class JpsFacetType

extends JpsElementType

implements JpsElementTypeWithDefaultProperties

{ +} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java index 6126d7442ba1..b020d641ca6f 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java @@ -11,7 +11,7 @@ import java.util.List; /** * @author nik */ -public interface JpsModule extends JpsNamedElement, JpsReferenceableElement { +public interface JpsModule extends JpsNamedElement, JpsReferenceableElement, JpsCompositeElement { @NotNull JpsUrlList getContentRootsList(); @@ -32,10 +32,13 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement type); @NotNull - JpsElementContainer getContainer(); + List getFacets(); + + JpsDependenciesList getDependenciesList(); @NotNull JpsModuleReference createReference(); @@ -53,4 +56,5 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement, Parent extends JpsCompositeElementBase> extends - JpsCompositeElementBase - implements JpsNamedElement { +public abstract class JpsNamedCompositeElementBase> extends JpsCompositeElementBase implements JpsNamedElement { private String myName; protected JpsNamedCompositeElementBase(@NotNull String name) { @@ -16,7 +14,7 @@ public abstract class JpsNamedCompositeElementBase original) { + protected JpsNamedCompositeElementBase(JpsNamedCompositeElementBase original) { super(original); myName = original.myName; } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java index 45dccc8c0cea..c8cb79a31367 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author nik */ -public class JpsLibraryImpl extends JpsNamedCompositeElementBase implements JpsLibrary { +public class JpsLibraryImpl extends JpsNamedCompositeElementBase implements JpsLibrary { private static final JpsElementCollectionKind LIBRARY_ROOTS_COLLECTION = new JpsElementCollectionKind(JpsLibraryRootKind.INSTANCE); private static final JpsTypedDataKind> TYPED_DATA_KIND = new JpsTypedDataKind>(); diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java new file mode 100644 index 000000000000..2932b7721944 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java @@ -0,0 +1,56 @@ +package org.jetbrains.jps.model.module.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElementCollection; +import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.impl.JpsNamedCompositeElementBase; +import org.jetbrains.jps.model.impl.JpsTypedDataImpl; +import org.jetbrains.jps.model.impl.JpsTypedDataKind; +import org.jetbrains.jps.model.module.JpsFacet; +import org.jetbrains.jps.model.module.JpsFacetType; +import org.jetbrains.jps.model.module.JpsModule; + +/** + * @author nik + */ +public class JpsFacetImpl extends JpsNamedCompositeElementBase implements JpsFacet { + private static final JpsTypedDataKind> TYPED_DATA_KIND = new JpsTypedDataKind>(); + + public JpsFacetImpl(JpsFacetType facetType, @NotNull String name) { + super(name); + myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(facetType, facetType.createDefaultProperties())); + } + + private JpsFacetImpl(JpsNamedCompositeElementBase original) { + super(original); + } + + @NotNull + @Override + public JpsFacetImpl createCopy() { + return new JpsFacetImpl(this); + } + + @Override + @NotNull + public JpsFacetType getType() { + return myContainer.getChild(TYPED_DATA_KIND).getType(); + } + + @Override + public JpsModule getModule() { + return myParent != null ? (JpsModule)myParent.getParent() : null; + } + + @NotNull + @Override + public JpsElementReference createReference() { + return new JpsFacetReferenceImpl(getName(), getModule().createReference()); + } + + @Override + public void delete() { + //noinspection unchecked + ((JpsElementCollection)myParent).removeChild(this); + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetKind.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetKind.java new file mode 100644 index 000000000000..2fe5d0068ef7 --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetKind.java @@ -0,0 +1,30 @@ +package org.jetbrains.jps.model.module.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsEventDispatcher; +import org.jetbrains.jps.model.impl.JpsElementCollectionKind; +import org.jetbrains.jps.model.impl.JpsElementKindBase; +import org.jetbrains.jps.model.module.JpsFacet; +import org.jetbrains.jps.model.module.JpsFacetListener; + +/** + * @author nik + */ +public class JpsFacetKind extends JpsElementKindBase { + public static final JpsFacetKind INSTANCE = new JpsFacetKind(); + public static final JpsElementCollectionKind COLLECTION_KIND = new JpsElementCollectionKind(INSTANCE); + + public JpsFacetKind() { + super("facet"); + } + + @Override + public void fireElementAdded(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { + dispatcher.getPublisher(JpsFacetListener.class).facetAdded(element); + } + + @Override + public void fireElementRemoved(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { + dispatcher.getPublisher(JpsFacetListener.class).facetRemoved(element); + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java new file mode 100644 index 000000000000..02509bb6472c --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java @@ -0,0 +1,33 @@ +package org.jetbrains.jps.model.module.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase; +import org.jetbrains.jps.model.module.JpsFacet; +import org.jetbrains.jps.model.module.JpsModuleReference; + +/** + * @author nik + */ +public class JpsFacetReferenceImpl extends JpsNamedElementReferenceBase { + public JpsFacetReferenceImpl(String facetName, JpsModuleReference moduleReference) { + super(JpsFacetKind.COLLECTION_KIND, facetName, moduleReference); + } + + private JpsFacetReferenceImpl(JpsFacetReferenceImpl original) { + super(original); + } + + @NotNull + @Override + public JpsFacetReferenceImpl createCopy() { + return new JpsFacetReferenceImpl(this); + } + + @Override + public JpsElementReference asExternal(@NotNull JpsModel model) { + model.registerExternalReference(this); + return this; + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index ab43d10076dd..27a818ec7182 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -16,7 +16,7 @@ import java.util.List; /** * @author nik */ -public class JpsModuleImpl extends JpsNamedCompositeElementBase implements JpsModule { +public class JpsModuleImpl extends JpsNamedCompositeElementBase implements JpsModule { private static final JpsTypedDataKind> TYPED_DATA_KIND = new JpsTypedDataKind>(); private static final JpsUrlListKind CONTENT_ROOTS_KIND = new JpsUrlListKind("content roots"); private static final JpsUrlListKind EXCLUDED_ROOTS_KIND = new JpsUrlListKind("excluded roots"); @@ -28,6 +28,7 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase>(type, properties)); myContainer.setChild(CONTENT_ROOTS_KIND); myContainer.setChild(EXCLUDED_ROOTS_KIND); + myContainer.setChild(JpsFacetKind.COLLECTION_KIND); myContainer.setChild(DEPENDENCIES_LIST_KIND, new JpsDependenciesListImpl()); myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND)); myContainer.setChild(JpsModuleSourceRootKind.ROOT_COLLECTION_KIND); @@ -91,6 +92,18 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase type) { + return myContainer.getChild(JpsFacetKind.COLLECTION_KIND).addChild(new JpsFacetImpl(type, name)); + } + + @NotNull + @Override + public List getFacets() { + return myContainer.getChild(JpsFacetKind.COLLECTION_KIND).getElements(); + } + @NotNull @Override public JpsDependenciesList getDependenciesList() { diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java new file mode 100644 index 000000000000..09e271aacf79 --- /dev/null +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java @@ -0,0 +1,37 @@ +package org.jetbrains.jps.model; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.java.JpsJavaModuleType; +import org.jetbrains.jps.model.module.JpsFacet; +import org.jetbrains.jps.model.module.JpsFacetType; +import org.jetbrains.jps.model.module.JpsModule; + +/** + * @author nik + */ +public class JpsFacetTest extends JpsModelTestCase { + public void testAddFacet() { + final JpsModule m = myModel.getProject().addModule("m", JpsJavaModuleType.INSTANCE); + m.addFacet("f", MY_FACET_TYPE); + assertEquals("f", assertOneElement(m.getFacets()).getName()); + } + + public void testCreateReferenceByFacet() { + final JpsFacet facet = myModel.getProject().addModule("m", JpsJavaModuleType.INSTANCE).addFacet("f", MY_FACET_TYPE); + final JpsElementReference reference = facet.createReference().asExternal(myModel); + assertSame(facet, reference.resolve()); + } + + private static final JpsFacetType MY_FACET_TYPE = new JpsFacetType() { + @Override + public DummyJpsElementProperties createCopy(DummyJpsElementProperties properties) { + return DummyJpsElementProperties.INSTANCE; + } + + @NotNull + @Override + public DummyJpsElementProperties createDefaultProperties() { + return DummyJpsElementProperties.INSTANCE; + } + }; +}