[205733] Content assist fails when editing web.xml or faces-config.xml in XML Editor
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
index fe464f2..fc04743 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
@@ -410,6 +410,28 @@
return id;
}
+ /**
+ * Registers "interest" in a document, or rather the file buffer that
+ * backs it. Intentionally used to alter the reference count of the file
+ * buffer so it is not accidentally disposed of.
+ */
+ public boolean connect(IDocument document) {
+ DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
+ if( info == null)
+ return false;
+ ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
+ IPath bufferLocation = info.buffer.getLocation();
+ boolean isOK = true;
+ try {
+ bufferManager.connect(bufferLocation, LocationKind.NORMALIZE, null);
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ isOK = false;
+ }
+ return isOK;
+ }
+
URIResolver createURIResolver(ITextFileBuffer buffer) {
IPath location = buffer.getLocation();
IFile workspaceFile = FileBuffers.getWorkspaceFileAtLocation(location);
@@ -495,6 +517,28 @@
return type;
}
+ /**
+ * Deregisters "interest" in a document, or rather the file buffer that
+ * backs it. Intentionally used to alter the reference count of the file
+ * buffer so that it knows it can safely be disposed of.
+ */
+ public boolean disconnect(IDocument document) {
+ DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
+ if( info == null)
+ return false;
+ ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
+ IPath bufferLocation = info.buffer.getLocation();
+ boolean isOK = true;
+ try {
+ bufferManager.disconnect(bufferLocation, LocationKind.NORMALIZE, null);
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ isOK = false;
+ }
+ return isOK;
+ }
+
public ITextFileBuffer getBuffer(IDocument document) {
if (document == null) {
Exception iae = new IllegalArgumentException("can not get a buffer without a document reference"); //$NON-NLS-1$
@@ -701,7 +745,7 @@
DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
return info != null;
}
-
+
public void releaseModel(IDocument document) {
if (document == null) {
Exception iae = new IllegalArgumentException("can not release a model without a document reference"); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
index 78fa1e2..d4a2c3c 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
@@ -401,9 +401,24 @@
private void _incrCount(SharedObject sharedObject, ReadEditType type) {
if (type == READ) {
sharedObject.referenceCountForRead++;
+ FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
}
else if (type == EDIT) {
sharedObject.referenceCountForEdit++;
+ FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
+ }
+ else
+ throw new IllegalArgumentException();
+ }
+
+ private void _decrCount(SharedObject sharedObject, ReadEditType type) {
+ if (type == READ) {
+ sharedObject.referenceCountForRead--;
+ FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
+ }
+ else if (type == EDIT) {
+ sharedObject.referenceCountForEdit--;
+ FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
}
else
throw new IllegalArgumentException();
@@ -412,9 +427,11 @@
private void _initCount(SharedObject sharedObject, ReadEditType type) {
if (type == READ) {
sharedObject.referenceCountForRead = 1;
+ FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
}
else if (type == EDIT) {
sharedObject.referenceCountForEdit = 1;
+ FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
}
else
throw new IllegalArgumentException();
@@ -918,7 +935,7 @@
// if shared object is in our cache, then simply increment its ref
// count,
// and return the object.
- sharedObject.referenceCountForEdit++;
+ _incrCount(sharedObject, EDIT);
result = sharedObject.theSharedModel;
trace("got existing model for Edit: ", id); //$NON-NLS-1$
trace(" incremented referenceCountForEdit ", id, sharedObject.referenceCountForEdit); //$NON-NLS-1$
@@ -971,7 +988,7 @@
// if shared object is in our cache, then simply increment its ref
// count,
// and return the object.
- sharedObject.referenceCountForRead++;
+ _incrCount(sharedObject, READ);
result = sharedObject.theSharedModel;
}
return result;
@@ -1393,7 +1410,7 @@
if (sharedObject != null) {
- sharedObject.referenceCountForEdit--;
+ _decrCount(sharedObject, EDIT);
if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
discardModel(id, sharedObject);
}
@@ -1489,7 +1506,7 @@
}
if (sharedObject != null) {
- sharedObject.referenceCountForRead--;
+ _decrCount(sharedObject, READ);
if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
discardModel(id, sharedObject);
}