getElements();
@NotNull
- E addChild(@NotNull JpsElementFactoryWithParameter factory, @NotNull P param);
+ E addChild(@NotNull JpsElementParameterizedCreator factory, @NotNull P param);
@NotNull
- E addChild(@NotNull JpsElementFactory factory);
+ E addChild(@NotNull JpsElementCreator creator);
E addChild(E element);
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java
index 969b3534fc53..225599f32b0e 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementContainer.java
@@ -10,11 +10,11 @@ public interface JpsElementContainer {
T getChild(@NotNull JpsElementKind kind);
@NotNull
- &JpsElementFactory>
+ &JpsElementCreator>
T setChild(@NotNull K kind);
@NotNull
- &JpsElementFactoryWithParameter>
+ &JpsElementParameterizedCreator>
T setChild(@NotNull K kind, @NotNull P param);
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java
new file mode 100644
index 000000000000..614d6ea8c3c5
--- /dev/null
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementCreator.java
@@ -0,0 +1,11 @@
+package org.jetbrains.jps.model;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author nik
+ */
+public interface JpsElementCreator {
+ @NotNull
+ E create();
+}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java
index b06da51b9455..1e25c2197573 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java
@@ -1,12 +1,23 @@
package org.jetbrains.jps.model;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.library.JpsLibraryReference;
+import org.jetbrains.jps.model.module.JpsModuleReference;
+import org.jetbrains.jps.service.JpsServiceManager;
/**
* @author nik
*/
-public interface JpsElementFactory {
+public abstract class JpsElementFactory {
+ public static JpsElementFactory getInstance() {
+ return JpsServiceManager.getInstance().getService(JpsElementFactory.class);
+ }
@NotNull
- E create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent);
+ public abstract JpsModuleReference createModuleReference(@NotNull String moduleName);
+
+ @NotNull
+ public abstract JpsLibraryReference createLibraryReference(@NotNull String libraryName,
+ @NotNull JpsElementReference extends JpsCompositeElement> parentReference);
+
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java
deleted file mode 100644
index 13e9103789f6..000000000000
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactoryWithParameter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.jetbrains.jps.model;
-
-import org.jetbrains.annotations.NotNull;
-
-/**
- * @author nik
- */
-public interface JpsElementFactoryWithParameter {
- @NotNull
- E create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent, @NotNull P param);
-}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java
index 4e47a07bfc5a..dc3076e0c37d 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementKind.java
@@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull;
* @author nik
*/
public class JpsElementKind {
-
public void fireElementAdded(@NotNull JpsEventDispatcher dispatcher, @NotNull E element) {
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java
new file mode 100644
index 000000000000..df601c703c4c
--- /dev/null
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementParameterizedCreator.java
@@ -0,0 +1,11 @@
+package org.jetbrains.jps.model;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author nik
+ */
+public interface JpsElementParameterizedCreator {
+ @NotNull
+ E create(@NotNull P param);
+}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java
index f09bbc71ace3..ff28b4a7e29c 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementReference.java
@@ -1,5 +1,6 @@
package org.jetbrains.jps.model;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -8,4 +9,6 @@ import org.jetbrains.annotations.Nullable;
public interface JpsElementReference extends JpsElement {
@Nullable
T resolve();
+
+ JpsElementReference asExternal(@NotNull JpsModel model);
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java b/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java
index 09780fa1861f..8387e7614f9c 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsModel.java
@@ -15,5 +15,7 @@ public interface JpsModel {
@NotNull
JpsModel createModifiableModel(@NotNull JpsEventDispatcher eventDispatcher);
+ void registerExternalReference(@NotNull JpsElementReference> reference);
+
void commit();
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java b/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java
index 4df008cce68c..765ae7c194d1 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/JpsReferenceableElement.java
@@ -7,5 +7,5 @@ import org.jetbrains.annotations.NotNull;
*/
public interface JpsReferenceableElement {
@NotNull
- JpsElementReference createReference(JpsParentElement parent);
+ JpsElementReference createReference();
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java
index 45293113ecfe..1d79c0bcc107 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java
@@ -2,7 +2,6 @@ package org.jetbrains.jps.model.library;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsNamedElement;
-import org.jetbrains.jps.model.JpsParentElement;
import org.jetbrains.jps.model.JpsReferenceableElement;
import java.util.List;
@@ -22,5 +21,5 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement {
@NotNull
String getLibraryName();
+
+ @Override
+ JpsLibraryReference asExternal(@NotNull JpsModel model);
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java
index 4954e81f6e5b..b4e08a983b28 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsDependenciesList.java
@@ -3,6 +3,7 @@ package org.jetbrains.jps.model.module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.library.JpsLibrary;
+import org.jetbrains.jps.model.library.JpsLibraryReference;
import org.jetbrains.jps.model.library.JpsSdkType;
import java.util.List;
@@ -14,9 +15,15 @@ public interface JpsDependenciesList extends JpsElement {
@NotNull
JpsModuleDependency addModuleDependency(@NotNull JpsModule module);
+ @NotNull
+ JpsModuleDependency addModuleDependency(@NotNull JpsModuleReference moduleReference);
+
@NotNull
JpsLibraryDependency addLibraryDependency(@NotNull JpsLibrary libraryElement);
+ @NotNull
+ JpsLibraryDependency addLibraryDependency(@NotNull JpsLibraryReference libraryReference);
+
void addModuleSourceDependency();
void addSdkDependency(@NotNull JpsSdkType> sdkType);
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 4226ad8f7850..fdc54705c502 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
@@ -2,6 +2,8 @@ package org.jetbrains.jps.model.module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.*;
+import org.jetbrains.jps.model.library.JpsLibrary;
+import org.jetbrains.jps.model.library.JpsLibraryType;
import java.util.List;
@@ -35,7 +37,10 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement type, @NotNull String name);
void delete();
diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java
index 90a35bf07ec3..0449ef46868d 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModuleReference.java
@@ -2,6 +2,7 @@ package org.jetbrains.jps.model.module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElementReference;
+import org.jetbrains.jps.model.JpsModel;
/**
* @author nik
@@ -9,4 +10,7 @@ import org.jetbrains.jps.model.JpsElementReference;
public interface JpsModuleReference extends JpsElementReference {
@NotNull
String getModuleName();
+
+ @Override
+ JpsModuleReference asExternal(@NotNull JpsModel model);
}
diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java
index cf0a081869a9..d4ebfda7a167 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsSdkReferencesTable.java
@@ -3,7 +3,6 @@ package org.jetbrains.jps.model.module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsCompositeElement;
-import org.jetbrains.jps.model.library.JpsLibrary;
import org.jetbrains.jps.model.library.JpsLibraryReference;
import org.jetbrains.jps.model.library.JpsSdkType;
@@ -14,5 +13,5 @@ public interface JpsSdkReferencesTable extends JpsCompositeElement {
@Nullable
JpsLibraryReference getSdkReference(@NotNull JpsSdkType> type);
- void setSdkReference(@NotNull JpsSdkType> type, @NotNull JpsLibrary sdk);
+ void setSdkReference(@NotNull JpsSdkType> type, @NotNull JpsLibraryReference sdkReference);
}
diff --git a/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java b/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java
new file mode 100644
index 000000000000..d24524ca3664
--- /dev/null
+++ b/jps/model-api/src/org/jetbrains/jps/service/JpsServiceManager.java
@@ -0,0 +1,21 @@
+package org.jetbrains.jps.service;
+
+import java.util.ServiceLoader;
+
+/**
+ * @author nik
+ */
+public abstract class JpsServiceManager {
+ public static JpsServiceManager getInstance() {
+ return InstanceHolder.INSTANCE;
+ }
+
+ public abstract T getService(Class serviceClass);
+
+ private static class InstanceHolder {
+ private static final JpsServiceManager INSTANCE;
+ static {
+ INSTANCE = ServiceLoader.load(JpsServiceManager.class).iterator().next();
+ }
+ }
+}
diff --git a/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory
new file mode 100644
index 000000000000..2053df115032
--- /dev/null
+++ b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.model.JpsElementFactory
@@ -0,0 +1 @@
+org.jetbrains.jps.model.impl.JpsElementFactoryImpl
\ No newline at end of file
diff --git a/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager
new file mode 100644
index 000000000000..6e703605a384
--- /dev/null
+++ b/jps/model-impl/src/META-INF/services/org.jetbrains.jps.service.JpsServiceManager
@@ -0,0 +1 @@
+org.jetbrains.jps.service.impl.JpsServiceManagerImpl
\ No newline at end of file
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java
index c1b38364d791..70c6558560ad 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsCompositeElementBase.java
@@ -8,19 +8,13 @@ import org.jetbrains.jps.model.*;
*/
public abstract class JpsCompositeElementBase> extends JpsElementBase implements JpsCompositeElement {
protected final JpsElementContainerImpl myContainer;
- protected final JpsModel myModel;
- protected JpsCompositeElementBase(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
- myModel = model;
- myContainer = new JpsElementContainerImpl(model, eventDispatcher, this);
+ protected JpsCompositeElementBase() {
+ myContainer = new JpsElementContainerImpl(this);
}
- protected JpsCompositeElementBase(JpsCompositeElementBase original, JpsModel model, JpsEventDispatcher dispatcher,
- JpsParentElement parent) {
- super(original, dispatcher, parent);
- myModel = model;
- myContainer = new JpsElementContainerImpl(original.myContainer, model, dispatcher, this);
+ protected JpsCompositeElementBase(JpsCompositeElementBase original) {
+ myContainer = new JpsElementContainerImpl(original.myContainer, this);
}
public void applyChanges(@NotNull Self element) {
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java
index 12c982d8f708..dd53713729d0 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementBase.java
@@ -1,27 +1,52 @@
package org.jetbrains.jps.model.impl;
+import com.intellij.openapi.diagnostic.Logger;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.*;
/**
* @author nik
*/
public abstract class JpsElementBase> implements JpsElement, JpsElement.BulkModificationSupport {
- private JpsEventDispatcher myEventDispatcher;
- protected JpsParentElement myParent;
+ private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.model.impl.JpsElementBase");
+ protected JpsElementBase myParent;
- protected JpsElementBase(JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- myEventDispatcher = eventDispatcher;
+ protected JpsElementBase() {
+ }
+
+ public void setParent(@Nullable JpsElementBase> parent) {
+ if (myParent != null && parent != null) {
+ LOG.error("Parent for " + this + " is already set");
+ }
myParent = parent;
}
- public JpsElementBase(JpsElementBase original, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- myEventDispatcher = eventDispatcher;
- myParent = parent;
+ protected void fireElementChanged() {
+ final JpsEventDispatcher eventDispatcher = getEventDispatcher();
+ if (eventDispatcher != null) {
+ eventDispatcher.fireElementChanged(this);
+ }
}
+ protected static void setParent(@NotNull JpsElement element, @Nullable JpsElementBase> parent) {
+ ((JpsElementBase>)element).setParent(parent);
+ }
+
+ @Nullable
protected JpsEventDispatcher getEventDispatcher() {
- return myEventDispatcher;
+ if (myParent != null) {
+ return myParent.getEventDispatcher();
+ }
+ return null;
+ }
+
+ @Nullable
+ protected JpsModel getModel() {
+ if (myParent != null) {
+ return myParent.getModel();
+ }
+ return null;
}
@NotNull
@@ -31,11 +56,11 @@ public abstract class JpsElementBase> implemen
}
@NotNull
- public abstract Self createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent);
+ public abstract Self createCopy();
public abstract void applyChanges(@NotNull Self modified);
- public JpsParentElement getParent() {
+ public JpsElementBase getParent() {
return myParent;
}
}
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 3afa780758c9..bd950d6ea6af 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
@@ -11,30 +11,23 @@ import java.util.*;
*/
public class JpsElementCollectionImpl extends JpsElementBase> implements JpsElementCollection {
private final List myElements;
- private final JpsModel myModel;
private final Map myCopyToOriginal;
private final JpsElementKind myKind;
- public JpsElementCollectionImpl(JpsElementKind kind, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
+ public JpsElementCollectionImpl(JpsElementKind kind) {
myKind = kind;
- myModel = model;
myElements = new SmartList();
myCopyToOriginal = null;
}
- public JpsElementCollectionImpl(JpsElementCollectionImpl original,
- JpsModel model,
- JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- super(original, eventDispatcher, parent);
+ public JpsElementCollectionImpl(JpsElementCollectionImpl original) {
myKind = original.myKind;
- myModel = model;
myElements = new SmartList();
myCopyToOriginal = new HashMap();
for (E e : original.myElements) {
//noinspection unchecked
- final E copy = (E)e.getBulkModificationSupport().createCopy(model, eventDispatcher, parent);
+ final E copy = (E)e.getBulkModificationSupport().createCopy();
+ setParent(copy, this);
myElements.add(copy);
myCopyToOriginal.put(copy, e);
}
@@ -47,20 +40,24 @@ public class JpsElementCollectionImpl extends JpsElementBa
@NotNull
@Override
- public E addChild(@NotNull JpsElementFactoryWithParameter factory, @NotNull P param) {
- return addChild(factory.create(myModel, getEventDispatcher(), myParent, param));
+ public E addChild(@NotNull JpsElementParameterizedCreator factory, @NotNull P param) {
+ return addChild(factory.create(param));
}
@NotNull
@Override
- public E addChild(@NotNull JpsElementFactory factory) {
- return addChild(factory.create(myModel, getEventDispatcher(), myParent));
+ public E addChild(@NotNull JpsElementCreator creator) {
+ return addChild(creator.create());
}
@Override
public E addChild(E element) {
myElements.add(element);
- getEventDispatcher().fireElementAdded(element, myKind);
+ setParent(element, this);
+ final JpsEventDispatcher eventDispatcher = getEventDispatcher();
+ if (eventDispatcher != null) {
+ eventDispatcher.fireElementAdded(element, myKind);
+ }
return element;
}
@@ -68,16 +65,18 @@ public class JpsElementCollectionImpl extends JpsElementBa
public void removeChild(@NotNull E element) {
final boolean removed = myElements.remove(element);
if (removed) {
- getEventDispatcher().fireElementRemoved(element, myKind);
+ final JpsEventDispatcher eventDispatcher = getEventDispatcher();
+ if (eventDispatcher != null) {
+ eventDispatcher.fireElementRemoved(element, myKind);
+ }
+ setParent(element, null);
}
}
@NotNull
@Override
- public JpsElementCollectionImpl createCopy(@NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- return new JpsElementCollectionImpl(this, model, eventDispatcher, parent);
+ public JpsElementCollectionImpl createCopy() {
+ return new JpsElementCollectionImpl(this);
}
public void applyChanges(@NotNull JpsElementCollectionImpl modified) {
@@ -93,7 +92,7 @@ public class JpsElementCollectionImpl extends JpsElementBa
}
else {
//noinspection unchecked
- final E copy = (E)element.getBulkModificationSupport().createCopy(myModel, getEventDispatcher(), myParent);
+ final E copy = (E)element.getBulkModificationSupport().createCopy();
toAdd.add(copy);
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java
index 89ec021e072c..aae141b3b861 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementCollectionKind.java
@@ -7,7 +7,7 @@ import org.jetbrains.jps.model.*;
* @author nik
*/
public class JpsElementCollectionKind extends JpsElementKind>
- implements JpsElementFactory> {
+ implements JpsElementCreator> {
private final JpsElementKind myElementKind;
public JpsElementCollectionKind(JpsElementKind elementKind) {
@@ -16,9 +16,7 @@ public class JpsElementCollectionKind extends JpsElementKi
@NotNull
@Override
- public JpsElementCollectionImpl create(@NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- return new JpsElementCollectionImpl(myElementKind, model, eventDispatcher, parent);
+ public JpsElementCollectionImpl create() {
+ return new JpsElementCollectionImpl(myElementKind);
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java
index a231add0dd96..2a77a6896844 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementContainerImpl.java
@@ -1,6 +1,7 @@
package org.jetbrains.jps.model.impl;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.*;
import java.util.HashMap;
@@ -11,25 +12,19 @@ import java.util.Map;
*/
public class JpsElementContainerImpl implements JpsElementContainer {
private final Map, JpsElement> myElements = new HashMap, JpsElement>();
- private final @NotNull JpsModel myModel;
- private final @NotNull JpsEventDispatcher myEventDispatcher;
- private final @NotNull JpsParentElement myParent;
+ private final @NotNull JpsCompositeElementBase> myParent;
- public JpsElementContainerImpl(@NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- myModel = model;
- myEventDispatcher = eventDispatcher;
+ public JpsElementContainerImpl(@NotNull JpsCompositeElementBase> parent) {
myParent = parent;
}
- public JpsElementContainerImpl(@NotNull JpsElementContainerImpl original, @NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- myModel = model;
- myEventDispatcher = eventDispatcher;
+ public JpsElementContainerImpl(@NotNull JpsElementContainerImpl original, @NotNull JpsCompositeElementBase> parent) {
myParent = parent;
for (Map.Entry, JpsElement> entry : original.myElements.entrySet()) {
final JpsElementKind kind = entry.getKey();
- myElements.put(kind, entry.getValue().getBulkModificationSupport().createCopy(myModel, myEventDispatcher, myParent));
+ final JpsElement copy = entry.getValue().getBulkModificationSupport().createCopy();
+ JpsElementBase.setParent(copy, myParent);
+ myElements.put(kind, copy);
}
}
@@ -41,23 +36,27 @@ public class JpsElementContainerImpl implements JpsElementContainer {
@NotNull
@Override
- public & JpsElementFactoryWithParameter> T setChild(@NotNull K kind,
+ public & JpsElementParameterizedCreator> T setChild(@NotNull K kind,
@NotNull P param) {
- final T child = kind.create(myModel, myEventDispatcher, myParent, param);
+ final T child = kind.create(param);
return setChild(kind, child);
}
@NotNull
@Override
- public & JpsElementFactory> T setChild(@NotNull K kind) {
- final T child = kind.create(myModel, myEventDispatcher, myParent);
+ public & JpsElementCreator> T setChild(@NotNull K kind) {
+ final T child = kind.create();
return setChild(kind, child);
}
@Override
public T setChild(JpsElementKind kind, T child) {
myElements.put(kind, child);
- myEventDispatcher.fireElementAdded(child, kind);
+ JpsElementBase.setParent(child, myParent);
+ final JpsEventDispatcher eventDispatcher = getEventDispatcher();
+ if (eventDispatcher != null) {
+ eventDispatcher.fireElementAdded(child, kind);
+ }
return child;
}
@@ -65,7 +64,11 @@ public class JpsElementContainerImpl implements JpsElementContainer {
public void removeChild(@NotNull JpsElementKind kind) {
//noinspection unchecked
final T removed = (T)myElements.remove(kind);
- myEventDispatcher.fireElementRemoved(removed, kind);
+ final JpsEventDispatcher eventDispatcher = getEventDispatcher();
+ if (eventDispatcher != null) {
+ eventDispatcher.fireElementRemoved(removed, kind);
+ }
+ JpsElementBase.setParent(removed, null);
}
public void applyChanges(@NotNull JpsElementContainerImpl modified) {
@@ -92,7 +95,12 @@ public class JpsElementContainerImpl implements JpsElementContainer {
}
else {
//noinspection unchecked
- setChild(kind, (T)modifiedChild.getBulkModificationSupport().createCopy(myModel, myEventDispatcher, myParent));
+ setChild(kind, (T)modifiedChild.getBulkModificationSupport().createCopy());
}
}
+
+ @Nullable
+ private JpsEventDispatcher getEventDispatcher() {
+ return myParent.getEventDispatcher();
+ }
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java
new file mode 100644
index 000000000000..70492b460fe7
--- /dev/null
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java
@@ -0,0 +1,26 @@
+package org.jetbrains.jps.model.impl;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.*;
+import org.jetbrains.jps.model.library.JpsLibraryReference;
+import org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl;
+import org.jetbrains.jps.model.module.JpsModuleReference;
+import org.jetbrains.jps.model.module.impl.JpsModuleReferenceImpl;
+
+/**
+ * @author nik
+ */
+public class JpsElementFactoryImpl extends JpsElementFactory {
+ @NotNull
+ @Override
+ public JpsModuleReference createModuleReference(@NotNull String moduleName) {
+ return new JpsModuleReferenceImpl(moduleName);
+ }
+
+ @NotNull
+ @Override
+ public JpsLibraryReference createLibraryReference(@NotNull String libraryName,
+ @NotNull JpsElementReference extends JpsCompositeElement> parentReference) {
+ return new JpsLibraryReferenceImpl(libraryName, parentReference);
+ }
+}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java
new file mode 100644
index 000000000000..3b6a86b9ade1
--- /dev/null
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementReferenceBase.java
@@ -0,0 +1,17 @@
+package org.jetbrains.jps.model.impl;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.JpsElement;
+import org.jetbrains.jps.model.JpsElementReference;
+import org.jetbrains.jps.model.JpsModel;
+
+/**
+ * @author nik
+ */
+public abstract class JpsElementReferenceBase, T extends JpsElement> extends JpsElementBase implements JpsElementReference {
+ @Override
+ public JpsElementReference asExternal(@NotNull JpsModel model) {
+ model.registerExternalReference(this);
+ return this;
+ }
+}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java
index 4e245d5dcf98..17f61a22047e 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalElementReference.java
@@ -6,25 +6,17 @@ import org.jetbrains.jps.model.*;
/**
* @author nik
*/
-public class JpsGlobalElementReference extends JpsElementBase implements JpsElementReference {
- private final JpsModel myModel;
-
- public JpsGlobalElementReference(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
- myModel = model;
- }
-
+public class JpsGlobalElementReference extends JpsElementReferenceBase {
@Override
public JpsGlobal resolve() {
- return myModel.getGlobal();
+ final JpsModel model = getModel();
+ return model != null ? model.getGlobal() : null;
}
@NotNull
@Override
- public JpsGlobalElementReference createCopy(@NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- return new JpsGlobalElementReference(model, eventDispatcher, parent);
+ public JpsGlobalElementReference createCopy() {
+ return new JpsGlobalElementReference();
}
@Override
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java
index b6cbe9e08d04..c5bb2c500b64 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsGlobalImpl.java
@@ -10,32 +10,26 @@ import org.jetbrains.jps.model.library.impl.JpsLibraryKind;
/**
* @author nik
*/
-public class JpsGlobalImpl extends JpsCompositeElementBase implements JpsGlobal {
+public class JpsGlobalImpl extends JpsRootElementBase implements JpsGlobal {
public JpsGlobalImpl(JpsModel model, JpsEventDispatcher eventDispatcher) {
- super(model, eventDispatcher, null);
+ super(model, eventDispatcher);
myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND);
}
public JpsGlobalImpl(JpsGlobalImpl original, JpsModel model, JpsEventDispatcher eventDispatcher) {
- super(original, model, eventDispatcher, null);
- }
-
- @NotNull
- @Override
- public JpsGlobalImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JpsGlobalImpl(this, model, eventDispatcher);
+ super(original, model, eventDispatcher);
}
@NotNull
@Override
public JpsLibrary addLibrary(@NotNull JpsLibraryType libraryType, @NotNull final String name) {
final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND);
- return collection.addChild(new JpsLibraryImpl(name, libraryType, myModel, getEventDispatcher(), collection));
+ return collection.addChild(new JpsLibraryImpl(name, libraryType));
}
@NotNull
@Override
- public JpsElementReference createReference(JpsParentElement parent) {
- return new JpsGlobalElementReference(myModel, getEventDispatcher(), parent);
+ public JpsElementReference createReference() {
+ return new JpsGlobalElementReference();
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java
index ae6b7f4d1f8c..60e55362a367 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsModelImpl.java
@@ -1,6 +1,7 @@
package org.jetbrains.jps.model.impl;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.JpsElementReference;
import org.jetbrains.jps.model.JpsEventDispatcher;
import org.jetbrains.jps.model.JpsModel;
@@ -11,14 +12,17 @@ public class JpsModelImpl implements JpsModel {
private JpsProjectImpl myProject;
private JpsGlobalImpl myGlobal;
private JpsModelImpl myOriginalModel;
+ private final JpsEventDispatcher myEventDispatcher;
public JpsModelImpl(JpsEventDispatcher eventDispatcher) {
+ myEventDispatcher = eventDispatcher;
myProject = new JpsProjectImpl(this, eventDispatcher);
myGlobal = new JpsGlobalImpl(this, eventDispatcher);
}
private JpsModelImpl(JpsModelImpl original, JpsEventDispatcher eventDispatcher) {
myOriginalModel = original;
+ myEventDispatcher = eventDispatcher;
myProject = new JpsProjectImpl(original.myProject, this, eventDispatcher);
myGlobal = new JpsGlobalImpl(original.myGlobal, this, eventDispatcher);
}
@@ -39,6 +43,11 @@ public class JpsModelImpl implements JpsModel {
return new JpsModelImpl(this, eventDispatcher);
}
+ @Override
+ public void registerExternalReference(@NotNull JpsElementReference> reference) {
+ myProject.addExternalReference(reference);
+ }
+
@Override
public void commit() {
myOriginalModel.applyChanges(this);
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java
index e05473c5fab1..b5a163ad2fa0 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedCompositeElementBase.java
@@ -11,17 +11,13 @@ public abstract class JpsNamedCompositeElementBase original,
- JpsModel model,
- JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(original, model, eventDispatcher, parent);
+ protected JpsNamedCompositeElementBase(JpsNamedCompositeElementBase original) {
+ super(original);
myName = original.myName;
}
@@ -41,7 +37,10 @@ public abstract class JpsNamedCompositeElementBase myCollectionKind;
protected final String myElementName;
- protected JpsNamedElementReferenceBase(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, @NotNull JpsElementCollectionKind extends T> kind, @NotNull String elementName,
- @NotNull JpsElementReference extends JpsCompositeElement> parentReference, JpsParentElement parent) {
- super(model, eventDispatcher, parent);
+ protected JpsNamedElementReferenceBase(@NotNull JpsElementCollectionKind extends T> kind,
+ @NotNull String elementName,
+ @NotNull JpsElementReference extends JpsCompositeElement> parentReference) {
+ super();
myCollectionKind = kind;
myElementName = elementName;
myContainer.setChild(PARENT_REFERENCE_KIND, parentReference);
}
- protected JpsNamedElementReferenceBase(JpsNamedElementReferenceBase original,
- JpsModel model, JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- super(original, model, eventDispatcher, parent);
+ protected JpsNamedElementReferenceBase(JpsNamedElementReferenceBase original) {
+ super(original);
myCollectionKind = original.myCollectionKind;
myElementName = original.myElementName;
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java
index 1206aca4f6f7..814aeb446fa0 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectElementReference.java
@@ -6,25 +6,17 @@ import org.jetbrains.jps.model.*;
/**
* @author nik
*/
-public class JpsProjectElementReference extends JpsElementBase implements JpsElementReference {
- private final JpsModel myModel;
-
- public JpsProjectElementReference(JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
- myModel = model;
- }
-
+public class JpsProjectElementReference extends JpsElementReferenceBase {
@Override
public JpsProject resolve() {
- return myModel.getProject();
+ final JpsModel model = getModel();
+ return model != null ? model.getProject() : null;
}
@NotNull
@Override
- public JpsProjectElementReference createCopy(@NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher,
- JpsParentElement parent) {
- return new JpsProjectElementReference(model, eventDispatcher, parent);
+ public JpsProjectElementReference createCopy() {
+ return new JpsProjectElementReference();
}
@Override
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 006be0cfa53e..3720c0ba1190 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
@@ -16,29 +16,36 @@ import java.util.List;
/**
* @author nik
*/
-public class JpsProjectImpl extends JpsCompositeElementBase implements JpsProject {
+public class JpsProjectImpl extends JpsRootElementBase implements JpsProject {
+ private static final JpsElementCollectionKind> EXTERNAL_REFERENCES_COLLECTION_KIND = new JpsElementCollectionKind>(new JpsElementKind>());
+
public JpsProjectImpl(JpsModel model, JpsEventDispatcher eventDispatcher) {
- super(model, eventDispatcher, null);
+ super(model, eventDispatcher);
myContainer.setChild(JpsModuleKind.MODULE_COLLECTION_KIND);
myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND);
+ myContainer.setChild(EXTERNAL_REFERENCES_COLLECTION_KIND);
}
public JpsProjectImpl(JpsProjectImpl original, JpsModel model, JpsEventDispatcher eventDispatcher) {
- super(original, model, eventDispatcher, null);
+ super(original, model, eventDispatcher);
+ }
+
+ public void addExternalReference(@NotNull JpsElementReference> reference) {
+ myContainer.getChild(EXTERNAL_REFERENCES_COLLECTION_KIND).addChild(reference);
}
@NotNull
@Override
public JpsModule addModule(@NotNull JpsModuleType> moduleType, @NotNull final String name) {
final JpsElementCollectionImpl collection = myContainer.getChild(JpsModuleKind.MODULE_COLLECTION_KIND);
- return collection.addChild(new JpsModuleImpl(myModel, getEventDispatcher(), moduleType, name, collection));
+ return collection.addChild(new JpsModuleImpl(moduleType, name));
}
@NotNull
@Override
public JpsLibrary addLibrary(@NotNull JpsLibraryType> libraryType, @NotNull final String name) {
final JpsElementCollectionImpl collection = myContainer.getChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND);
- return collection.addChild(new JpsLibraryImpl(name, libraryType, myModel, getEventDispatcher(), collection));
+ return collection.addChild(new JpsLibraryImpl(name, libraryType));
}
@NotNull
@@ -55,13 +62,7 @@ public class JpsProjectImpl extends JpsCompositeElementBase impl
@NotNull
@Override
- public JpsElementReference createReference(JpsParentElement parent) {
- return new JpsProjectElementReference(myModel, getEventDispatcher(), parent);
- }
-
- @NotNull
- @Override
- public JpsProjectImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JpsProjectImpl(this, model, eventDispatcher);
+ public JpsElementReference createReference() {
+ return new JpsProjectElementReference();
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java
new file mode 100644
index 000000000000..884e2b3dd569
--- /dev/null
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsRootElementBase.java
@@ -0,0 +1,41 @@
+package org.jetbrains.jps.model.impl;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.JpsEventDispatcher;
+import org.jetbrains.jps.model.JpsModel;
+
+/**
+ * @author nik
+ */
+public abstract class JpsRootElementBase> extends JpsCompositeElementBase {
+ private final JpsModel myModel;
+ private final JpsEventDispatcher myEventDispatcher;
+
+ protected JpsRootElementBase(JpsModel model, JpsEventDispatcher eventDispatcher) {
+ super();
+ myModel = model;
+ myEventDispatcher = eventDispatcher;
+ }
+
+ protected JpsRootElementBase(JpsCompositeElementBase original, JpsModel model, JpsEventDispatcher dispatcher) {
+ super(original);
+ myModel = model;
+ myEventDispatcher = dispatcher;
+ }
+
+ @Override
+ protected JpsEventDispatcher getEventDispatcher() {
+ return myEventDispatcher;
+ }
+
+ @Override
+ protected JpsModel getModel() {
+ return myModel;
+ }
+
+ @NotNull
+ @Override
+ public E createCopy() {
+ throw new UnsupportedOperationException("'createCopy' not implemented in " + getClass().getName());
+ }
+}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java
index d09808d00015..7e6c1e6fcdc3 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsTypedDataImpl.java
@@ -11,15 +11,12 @@ public class JpsTypedDataImpl> extends JpsElementBas
private final T myType;
private JpsElementProperties myProperties;
- public JpsTypedDataImpl(T type, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
+ public JpsTypedDataImpl(T type) {
myType = type;
myProperties = type.createDefaultProperties();
}
- public JpsTypedDataImpl(JpsTypedDataImpl original,
- JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(original, eventDispatcher, parent);
+ public JpsTypedDataImpl(JpsTypedDataImpl original) {
myType = original.getType();
final JpsElementType> type = original.getType();
myProperties = createCopy(type, original.myProperties);
@@ -44,8 +41,8 @@ public class JpsTypedDataImpl> extends JpsElementBas
@NotNull
@Override
- public JpsTypedDataImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JpsTypedDataImpl(this, eventDispatcher, parent);
+ public JpsTypedDataImpl createCopy() {
+ return new JpsTypedDataImpl(this);
}
@NotNull
@@ -56,7 +53,7 @@ public class JpsTypedDataImpl> extends JpsElementBas
public void setProperties(@NotNull JpsElementProperties properties) {
if (!myProperties.equals(properties)) {
myProperties = properties;
- getEventDispatcher().fireElementChanged(this);
+ fireElementChanged();
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java
index 5d1ac3ac2ee4..de73d69659f0 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsUrlListImpl.java
@@ -12,19 +12,17 @@ import java.util.List;
public class JpsUrlListImpl extends JpsElementBase implements JpsUrlList {
private List myUrls = new ArrayList();
- public JpsUrlListImpl(JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(eventDispatcher, parent);
+ public JpsUrlListImpl() {
}
- public JpsUrlListImpl(JpsUrlListImpl list, JpsEventDispatcher dispatcher, JpsParentElement parent) {
- super(list, dispatcher, parent);
+ public JpsUrlListImpl(JpsUrlListImpl list) {
myUrls.addAll(list.myUrls);
}
@NotNull
@Override
- public JpsUrlListImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JpsUrlListImpl(this, eventDispatcher, parent);
+ public JpsUrlListImpl createCopy() {
+ return new JpsUrlListImpl(this);
}
@NotNull
@@ -36,20 +34,20 @@ public class JpsUrlListImpl extends JpsElementBase implements Jp
@Override
public void addUrl(@NotNull String url) {
myUrls.add(url);
- getEventDispatcher().fireElementChanged(this);
+ fireElementChanged();
}
@Override
public void removeUrl(@NotNull String url) {
myUrls.remove(url);
- getEventDispatcher().fireElementChanged(this);
+ fireElementChanged();
}
public void applyChanges(@NotNull JpsUrlListImpl modified) {
if (!myUrls.equals(modified.myUrls)) {
myUrls.clear();
myUrls.addAll(modified.myUrls);
- getEventDispatcher().fireElementChanged(this);
+ fireElementChanged();
}
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java
index d60dd07afb8c..db16f0c05b5d 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/SimpleJpsElementImpl.java
@@ -9,13 +9,12 @@ import org.jetbrains.jps.model.*;
public class SimpleJpsElementImpl extends JpsElementBase> implements SimpleJpsElement {
private P myProperties;
- public SimpleJpsElementImpl(JpsEventDispatcher eventDispatcher, P properties, JpsParentElement parent) {
- super(eventDispatcher, parent);
+ public SimpleJpsElementImpl(P properties) {
myProperties = properties;
}
- public SimpleJpsElementImpl(SimpleJpsElementImpl
original, JpsEventDispatcher dispatcher, JpsParentElement parent) {
- super(original, dispatcher, parent);
+ public SimpleJpsElementImpl(SimpleJpsElementImpl
original) {
+ myProperties = original.myProperties;
}
@NotNull
@@ -28,14 +27,14 @@ public class SimpleJpsElementImpl
extends JpsEle
public void setProperties(@NotNull P properties) {
if (!myProperties.equals(properties)) {
myProperties = properties;
- getEventDispatcher().fireElementChanged(this);
+ fireElementChanged();
}
}
@NotNull
@Override
- public SimpleJpsElementImpl
createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new SimpleJpsElementImpl
(this, eventDispatcher, parent);
+ public SimpleJpsElementImpl
createCopy() {
+ return new SimpleJpsElementImpl
(this);
}
@Override
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java
index ff5dce87d4e1..4bf2a2b70bc5 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JavaModuleExtensionImpl.java
@@ -2,9 +2,6 @@ package org.jetbrains.jps.model.java.impl;
import com.intellij.openapi.util.Comparing;
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.JavaModuleExtension;
import org.jetbrains.jps.model.java.LanguageLevel;
@@ -17,12 +14,10 @@ public class JavaModuleExtensionImpl extends JpsElementBase implements JpsElementFactory {
+public class JavaModuleExtensionKind extends JpsElementKind implements JpsElementCreator {
private static final JavaModuleExtensionKind INSTANCE = new JavaModuleExtensionKind();
@NotNull
@Override
- public JavaModuleExtensionImpl create(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JavaModuleExtensionImpl(eventDispatcher, parent);
+ public JavaModuleExtensionImpl create() {
+ return new JavaModuleExtensionImpl();
}
@NotNull
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
index 1a241a7cb87d..3faa9324a231 100644
--- 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
@@ -1,9 +1,6 @@
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;
@@ -15,14 +12,13 @@ public class JpsJavaDependencyExtensionImpl extends JpsElementBase
- implements JpsElementFactory {
+public class JpsJavaDependencyExtensionKind extends JpsElementKind implements JpsElementCreator {
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 JpsJavaDependencyExtensionImpl create() {
+ return new JpsJavaDependencyExtensionImpl(false, JpsJavaDependencyScope.COMPILE);
}
public static JpsJavaDependencyExtension getExtension(@NotNull JpsDependencyElement element) {
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 541d81b64667..45728e409a93 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
@@ -18,15 +18,14 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase LIBRARY_ROOTS_COLLECTION = new JpsElementCollectionKind(JpsLibraryRootKind.INSTANCE);
private static final JpsTypedDataKind> TYPED_DATA_KIND = new JpsTypedDataKind>();
- public JpsLibraryImpl(@NotNull String name, @NotNull JpsLibraryType> type, @NotNull JpsModel model,
- @NotNull JpsEventDispatcher eventDispatcher, JpsElementCollection parent) {
- super(model, eventDispatcher, name, parent);
- myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type, eventDispatcher, this));
+ public JpsLibraryImpl(@NotNull String name, @NotNull JpsLibraryType> type) {
+ super(name);
+ myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl>(type));
myContainer.setChild(LIBRARY_ROOTS_COLLECTION);
}
- public JpsLibraryImpl(@NotNull JpsLibraryImpl original, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(original, model, eventDispatcher, parent);
+ private JpsLibraryImpl(@NotNull JpsLibraryImpl original) {
+ super(original);
}
@NotNull
@@ -43,7 +42,7 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase getRootsCollection() {
@@ -73,15 +72,15 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase parentReference = ((JpsReferenceableElement)getParent().getParent()).createReference(parent);
- return new JpsLibraryReferenceImpl(myModel, getEventDispatcher(), getName(), parentReference, parent);
+ final JpsElementReference parentReference = ((JpsReferenceableElement)getParent().getParent()).createReference();
+ return new JpsLibraryReferenceImpl(getName(), parentReference);
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java
index c78e4bdd8c0c..44ab7d92bec3 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryReferenceImpl.java
@@ -10,13 +10,12 @@ import org.jetbrains.jps.model.library.JpsLibraryReference;
* @author nik
*/
public class JpsLibraryReferenceImpl extends JpsNamedElementReferenceBase implements JpsLibraryReference {
- public JpsLibraryReferenceImpl(JpsModel model, JpsEventDispatcher eventDispatcher, String elementName, JpsElementReference extends JpsCompositeElement> parentReference,
- JpsParentElement parent) {
- super(model, eventDispatcher, JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference, parent);
+ public JpsLibraryReferenceImpl(String elementName, JpsElementReference extends JpsCompositeElement> parentReference) {
+ super(JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference);
}
- public JpsLibraryReferenceImpl(JpsLibraryReferenceImpl original, JpsModel model, JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- super(original, model, eventDispatcher, parent);
+ private JpsLibraryReferenceImpl(JpsLibraryReferenceImpl original) {
+ super(original);
}
@NotNull
@@ -27,9 +26,13 @@ public class JpsLibraryReferenceImpl extends JpsNamedElementReferenceBase imple
private final String myUrl;
private final JpsLibraryRootType myRootType;
- public JpsLibraryRootImpl(JpsEventDispatcher eventDispatcher, @NotNull String url, @NotNull JpsLibraryRootType rootType, @NotNull JpsParentElement parent) {
- super(eventDispatcher, parent);
+ public JpsLibraryRootImpl(@NotNull String url,
+ @NotNull JpsLibraryRootType rootType) {
myUrl = url;
myRootType = rootType;
}
- public JpsLibraryRootImpl(JpsLibraryRootImpl original, JpsEventDispatcher dispatcher, JpsParentElement parent) {
- super(original, dispatcher, parent);
+ public JpsLibraryRootImpl(JpsLibraryRootImpl original) {
myUrl = original.myUrl;
myRootType = original.myRootType;
}
@@ -41,8 +37,8 @@ public class JpsLibraryRootImpl extends JpsElementBase imple
@NotNull
@Override
- public JpsLibraryRootImpl createCopy(@NotNull JpsModel model, @NotNull JpsEventDispatcher eventDispatcher, JpsParentElement parent) {
- return new JpsLibraryRootImpl(this, eventDispatcher, parent);
+ public JpsLibraryRootImpl createCopy() {
+ return new JpsLibraryRootImpl(this);
}
public void applyChanges(@NotNull JpsLibraryRootImpl modified) {
@@ -51,6 +47,6 @@ public class JpsLibraryRootImpl extends JpsElementBase imple
@Override
@NotNull
public JpsLibrary getLibrary() {
- return (JpsLibrary)myParent;
+ return (JpsLibrary)myParent.getParent();
}
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java
index 09a6ec9fe5f1..e5c04b68cacb 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsDependenciesListImpl.java
@@ -2,12 +2,10 @@ package org.jetbrains.jps.model.module.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElementKind;
-import org.jetbrains.jps.model.JpsEventDispatcher;
-import org.jetbrains.jps.model.JpsModel;
-import org.jetbrains.jps.model.JpsParentElement;
import org.jetbrains.jps.model.impl.JpsCompositeElementBase;
import org.jetbrains.jps.model.impl.JpsElementCollectionKind;
import org.jetbrains.jps.model.library.JpsLibrary;
+import org.jetbrains.jps.model.library.JpsLibraryReference;
import org.jetbrains.jps.model.library.JpsSdkType;
import org.jetbrains.jps.model.module.*;
@@ -20,13 +18,13 @@ public class JpsDependenciesListImpl extends JpsCompositeElementBase> DEPENDENCY_ELEMENT_KIND = new JpsElementKind>();
public static final JpsElementCollectionKind