diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JpsBuilderArtifactServiceImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JpsBuilderArtifactServiceImpl.java index c9a5c8000abb..f2a4e232ee87 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JpsBuilderArtifactServiceImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JpsBuilderArtifactServiceImpl.java @@ -3,11 +3,11 @@ package org.jetbrains.jps.incremental.artifacts.impl; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.jps.incremental.artifacts.JpsBuilderArtifactService; import org.jetbrains.jps.incremental.artifacts.JpsSyntheticArtifactProvider; +import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.JpsArtifactService; import org.jetbrains.jps.model.impl.JpsElementChildRoleBase; -import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import org.jetbrains.jps.model.impl.JpsElementCollectionRole; import org.jetbrains.jps.service.JpsServiceManager; @@ -31,7 +31,7 @@ public class JpsBuilderArtifactServiceImpl extends JpsBuilderArtifactService { } public List getSyntheticArtifacts(final JpsModel model) { - JpsElementCollectionImpl artifactsCollection = model.getProject().getContainer().getChild(SYNTHETIC_ARTIFACTS); + JpsElementCollection artifactsCollection = model.getProject().getContainer().getChild(SYNTHETIC_ARTIFACTS); if (artifactsCollection == null) { List artifactList = computeSyntheticArtifacts(model); artifactsCollection = model.getProject().getContainer().setChild(SYNTHETIC_ARTIFACTS); diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java index 5010f06e4ffb..4e9cb975258b 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCollection.java @@ -16,4 +16,9 @@ public interface JpsElementCollection extends JpsElement { X addChild(X element); void removeChild(@NotNull E element); + + void removeAllChildren(); + + , P extends JpsElement> + Iterable getElementsOfType(@NotNull JpsElementType

type); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactServiceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactServiceImpl.java index 436e6b94f384..994bb9689007 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactServiceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactServiceImpl.java @@ -2,13 +2,13 @@ package org.jetbrains.jps.model.artifact.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.JpsArtifactReference; import org.jetbrains.jps.model.artifact.JpsArtifactService; import org.jetbrains.jps.model.artifact.JpsArtifactType; import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement; -import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import java.util.ArrayList; import java.util.Collections; @@ -22,7 +22,7 @@ public class JpsArtifactServiceImpl extends JpsArtifactService { @Override public List getArtifacts(@NotNull JpsProject project) { - JpsElementCollectionImpl collection = project.getContainer().getChild(JpsArtifactRole.ARTIFACT_COLLECTION_ROLE); + JpsElementCollection collection = project.getContainer().getChild(JpsArtifactRole.ARTIFACT_COLLECTION_ROLE); return collection != null ? collection.getElements() : Collections.emptyList(); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java index 3d33d4f152e1..a190a539ced7 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionImpl.java @@ -22,7 +22,7 @@ public class JpsElementCollectionImpl extends JpsElementBa myCopyToOriginal = null; } - public JpsElementCollectionImpl(JpsElementCollectionImpl original) { + private JpsElementCollectionImpl(JpsElementCollectionImpl original) { myChildRole = original.myChildRole; myElements = new SmartList(); myCopyToOriginal = new HashMap(); @@ -40,8 +40,9 @@ public class JpsElementCollectionImpl extends JpsElementBa return myElements; } - public Iterable getElementsOfType(@NotNull final JpsElementType

type) { - return new JpsElementIterable(type); + @Override + public , P extends JpsElement> Iterable getElementsOfType(@NotNull final JpsElementType

type) { + return new JpsElementIterable(type); } @NotNull @@ -73,6 +74,7 @@ public class JpsElementCollectionImpl extends JpsElementBa } } + @Override public void removeAllChildren() { List elements = new ArrayList(myElements); for (E element : elements) { @@ -111,19 +113,21 @@ public class JpsElementCollectionImpl extends JpsElementBa } } - private class JpsElementIterable implements Iterable { + private class JpsElementIterable, P extends JpsElement> implements Iterable { private final JpsElementType myType; - public JpsElementIterable(JpsElementType type) { + public JpsElementIterable(JpsElementType

type) { myType = type; } @Override public Iterator iterator() { - return new FilteringIterator(myElements.iterator(), new Condition() { + //noinspection unchecked + Iterator> iterator = (Iterator>)myElements.iterator(); + return new FilteringIterator, X>(iterator, new Condition>() { @Override - public boolean value(E e) { - return e instanceof JpsTypedElement && ((JpsTypedElement)e).getType().equals(myType); + public boolean value(JpsTypedElement e) { + return e.getType().equals(myType); } }); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionRole.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionRole.java index 79e5cc39ec95..364beffa748b 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionRole.java @@ -6,8 +6,8 @@ import org.jetbrains.jps.model.*; /** * @author nik */ -public class JpsElementCollectionRole extends JpsElementChildRoleBase> - implements JpsElementCreator> { +public class JpsElementCollectionRole extends JpsElementChildRoleBase> + implements JpsElementCreator> { private final JpsElementChildRole myChildRole; private JpsElementCollectionRole(@NotNull JpsElementChildRole role) { @@ -17,7 +17,7 @@ public class JpsElementCollectionRole extends JpsElementCh @NotNull @Override - public JpsElementCollectionImpl create() { + public JpsElementCollection create() { return new JpsElementCollectionImpl(myChildRole); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java index 6b70b0c7f86b..2432b6509a88 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java @@ -29,7 +29,7 @@ public abstract class JpsNamedElementReferenceBase collection = getCollection(parent); + JpsElementCollection collection = getCollection(parent); if (collection == null) return null; final List elements = collection.getElements(); @@ -45,7 +45,7 @@ public abstract class JpsNamedElementReferenceBase getCollection(@NotNull JpsCompositeElement parent); + protected abstract JpsElementCollection getCollection(@NotNull JpsCompositeElement parent); @Nullable protected abstract T resolve(S element); diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java index 45ebab4d6129..1e2a8d20bf93 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.model.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; +import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsElementReference; import org.jetbrains.jps.model.JpsNamedElement; @@ -29,7 +30,7 @@ public abstract class JpsNamedElementReferenceImpl getCollection(@NotNull JpsCompositeElement parent) { + protected JpsElementCollection getCollection(@NotNull JpsCompositeElement parent) { return parent.getContainer().getChild(myCollectionRole); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java index fefe103b525a..47858e6926d2 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java @@ -47,7 +47,7 @@ public class JpsProjectImpl extends JpsRootElementBase implement public

& JpsElementTypeWithDefaultProperties

> JpsModule addModule(@NotNull final String name, @NotNull ModuleType moduleType) { - final JpsElementCollectionImpl collection = myContainer.getChild(JpsModuleRole.MODULE_COLLECTION_ROLE); + final JpsElementCollection collection = myContainer.getChild(JpsModuleRole.MODULE_COLLECTION_ROLE); return collection.addChild(new JpsModuleImpl

(moduleType, name, moduleType.createDefaultProperties())); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java index 473520fd7c34..433038828247 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java @@ -2,8 +2,8 @@ package org.jetbrains.jps.model.library.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties; -import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryCollection; import org.jetbrains.jps.model.library.JpsLibraryType; @@ -15,9 +15,9 @@ import java.util.List; * @author nik */ public class JpsLibraryCollectionImpl implements JpsLibraryCollection { - private final JpsElementCollectionImpl myCollection; + private final JpsElementCollection myCollection; - public JpsLibraryCollectionImpl(JpsElementCollectionImpl collection) { + public JpsLibraryCollectionImpl(JpsElementCollection collection) { myCollection = collection; } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java index 02b224eca7b1..a409435a75c6 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java @@ -4,8 +4,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsTypedLibrary; @@ -47,7 +47,7 @@ public class JpsSdkReferenceImpl

extends JpsNamedElementRe } @Nullable - protected JpsElementCollectionImpl getCollection(@NotNull JpsCompositeElement parent) { + protected JpsElementCollection getCollection(@NotNull JpsCompositeElement parent) { return parent.getContainer().getChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE); } } 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 1346467b912c..8b164fff8af3 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 @@ -113,7 +113,7 @@ public class JpsModuleImpl

extends JpsNamedCompositeElemen @Override public void removeSourceRoot(@NotNull String url, @NotNull JpsModuleSourceRootType rootType) { - final JpsElementCollectionImpl roots = myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE); + final JpsElementCollection roots = myContainer.getChild(JpsModuleSourceRootRole.ROOT_COLLECTION_ROLE); for (JpsModuleSourceRoot root : roots.getElements()) { if (root.getRootType().equals(rootType) && root.getUrl().equals(url)) { roots.removeChild(root); diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java index b6dd3cdce310..d285a7116d39 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsLibraryTest.java @@ -1,12 +1,22 @@ package org.jetbrains.jps.model; +import com.intellij.util.containers.ContainerUtilRt; import org.jetbrains.jps.model.java.JpsJavaLibraryType; +import org.jetbrains.jps.model.java.JpsJavaSdkType; import org.jetbrains.jps.model.library.*; /** * @author nik */ public class JpsLibraryTest extends JpsModelTestCase { + public void testAddLibrary() { + JpsLibrary a = myProject.addLibrary("a", JpsJavaLibraryType.INSTANCE); + JpsLibraryCollection collection = myProject.getLibraryCollection(); + assertSameElements(collection.getLibraries(), a); + assertSameElements(ContainerUtilRt.newArrayList(collection.getLibraries(JpsJavaLibraryType.INSTANCE)), a); + assertEmpty(ContainerUtilRt.newArrayList(collection.getLibraries(JpsJavaSdkType.INSTANCE))); + } + public void testAddRoot() { final JpsLibrary library = myProject.addLibrary("a", JpsJavaLibraryType.INSTANCE); library.addRoot("file://my-url", JpsOrderRootType.COMPILED);