From 044c141a60c8b97184b965b4acbb85ba49a03a93 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Wed, 25 Nov 2009 20:14:55 +0300 Subject: [PATCH] stable elements for any type --- .../com/intellij/util/xml/impl/DomManagerImpl.java | 13 +++++++++++-- .../util/xml/impl/StableInvocationHandler.java | 11 +++++++---- .../src/com/intellij/util/xml/DomManager.java | 7 +++---- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java index 70f6a5711831..82fab83bb460 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java @@ -12,6 +12,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupManager; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Factory; import com.intellij.openapi.util.Key; @@ -320,7 +321,7 @@ public final class DomManagerImpl extends DomManager { } final InvocationHandler handler = AdvancedProxy.getInvocationHandler(proxy); if (handler instanceof StableInvocationHandler) { - final DomElement element = ((StableInvocationHandler)handler).getWrappedElement(); + final DomElement element = ((StableInvocationHandler)handler).getWrappedElement(); return element == null ? null : getDomInvocationHandler(element); } if (handler instanceof DomInvocationHandler) { @@ -493,9 +494,17 @@ public final class DomManagerImpl extends DomManager { } public final T createStableValue(final Factory provider) { + return createStableValue(provider, new Condition() { + public boolean value(T t) { + return t.isValid(); + } + }); + } + + public final T createStableValue(final Factory provider, final Condition validator) { final T initial = provider.create(); assert initial != null; - final StableInvocationHandler handler = new StableInvocationHandler(initial, provider); + final StableInvocationHandler handler = new StableInvocationHandler(initial, provider, validator); final Set intf = new HashSet(); intf.addAll(Arrays.asList(initial.getClass().getInterfaces())); diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/StableInvocationHandler.java b/xml/dom-impl/src/com/intellij/util/xml/impl/StableInvocationHandler.java index 48a5ce1cc8c4..82f802f16ee4 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/StableInvocationHandler.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/StableInvocationHandler.java @@ -16,6 +16,7 @@ package com.intellij.util.xml.impl; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Factory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; @@ -33,16 +34,18 @@ import java.util.Set; /** * @author peter */ -class StableInvocationHandler implements InvocationHandler, StableElement { +class StableInvocationHandler implements InvocationHandler, StableElement { private T myOldValue; private T myCachedValue; private final Set myClasses; private final Factory myProvider; + private final Condition myValidator; - public StableInvocationHandler(final T initial, final Factory provider) { + public StableInvocationHandler(final T initial, final Factory provider, Condition validator) { myProvider = provider; myCachedValue = initial; myOldValue = initial; + myValidator = validator; final Class superClass = initial.getClass().getSuperclass(); final Set classes = new HashSet(); classes.addAll(Arrays.asList(initial.getClass().getInterfaces())); @@ -125,7 +128,7 @@ class StableInvocationHandler implements InvocationHandler } } - public final DomElement getWrappedElement() { + public final T getWrappedElement() { if (isNotValid(myCachedValue)) { myCachedValue = myProvider.create(); } @@ -137,7 +140,7 @@ class StableInvocationHandler implements InvocationHandler } private boolean isNotValid(final T t) { - if (t == null || !t.isValid()) return true; + if (t == null || !myValidator.value(t)) return true; for (final Class aClass : myClasses) { if (!aClass.isInstance(t)) return true; } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java b/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java index 01a54cd28e52..df0a415e5490 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java @@ -19,10 +19,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Factory; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.ModificationTracker; -import com.intellij.openapi.util.NotNullLazyKey; +import com.intellij.openapi.util.*; import com.intellij.psi.PsiReferenceFactory; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; @@ -121,6 +118,8 @@ public abstract class DomManager implements ModificationTracker { */ public abstract T createStableValue(Factory provider); + public abstract T createStableValue(final Factory provider, final Condition validator); + /** * Registers a new {@link com.intellij.util.xml.DomFileDescription} within the manager. The description parameter describes some DOM * parameters and restrictions to the particular XML files, that need DOM support. Should be called on