From 1d01ed2ee5245d6880ac01b4f78fe68b120a1cae Mon Sep 17 00:00:00 2001 From: David Inglis Date: Thu, 13 May 2004 17:45:33 +0000 Subject: [PATCH] fixed up IPathEntryStore and DefaultPathEntryStore since its extends ICExtension we don't need to pass a project and the Defaultstore can now filter the descriptor change events properly. --- ...yStore.java => DefaultPathEntryStore.java} | 49 ++++++++++--------- .../internal/core/model/PathEntryManager.java | 37 ++++++-------- core/org.eclipse.cdt.core/plugin.xml | 13 ----- .../src/org/eclipse/cdt/core/CCorePlugin.java | 22 ++------- .../cdt/core/resources/IPathEntryStore.java | 22 ++------- 5 files changed, 52 insertions(+), 91 deletions(-) rename core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/{PathEntryStore.java => DefaultPathEntryStore.java} (92%) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryStore.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DefaultPathEntryStore.java similarity index 92% rename from core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryStore.java rename to core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DefaultPathEntryStore.java index 5180dfb74d6..fcfe8525f47 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryStore.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DefaultPathEntryStore.java @@ -16,11 +16,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.eclipse.cdt.core.AbstractCExtension; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CDescriptorEvent; import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.ICDescriptorListener; +import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICModelStatus; @@ -44,7 +44,7 @@ import org.w3c.dom.NodeList; /** * PathEntryStore */ -public class PathEntryStore extends AbstractCExtension implements IPathEntryStore, ICDescriptorListener { +public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListener { static String PATH_ENTRY = "pathentry"; //$NON-NLS-1$ static String PATH_ENTRY_ID = "org.eclipse.cdt.core.pathentry"; //$NON-NLS-1$ @@ -67,28 +67,29 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0]; List listeners; + IProject fProject; /** * */ - public PathEntryStore() { - super(); + public DefaultPathEntryStore(IProject project) { + fProject = project; listeners = Collections.synchronizedList(new ArrayList()); // Register the Core Model on the Descriptor // Manager, it needs to know about changes. CCorePlugin.getDefault().getCDescriptorManager().addDescriptorListener(this); } - public IPathEntry[] getRawPathEntries(IProject project) throws CoreException { + public IPathEntry[] getRawPathEntries() throws CoreException { ArrayList pathEntries = new ArrayList(); - ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project); + ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(fProject); Element element = cdesc.getProjectData(PATH_ENTRY_ID); NodeList list = element.getChildNodes(); for (int i = 0; i < list.getLength(); i++) { Node childNode = list.item(i); if (childNode.getNodeType() == Node.ELEMENT_NODE) { if (childNode.getNodeName().equals(PATH_ENTRY)) { - pathEntries.add(decodePathEntry(project, (Element) childNode)); + pathEntries.add(decodePathEntry(fProject, (Element) childNode)); } } } @@ -96,11 +97,11 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor return (IPathEntry[]) pathEntries.toArray(NO_PATHENTRIES); } - public void setRawPathEntries(IProject project, IPathEntry[] newRawEntries) throws CoreException { - if (Arrays.equals(newRawEntries, getRawPathEntries(project))) { + public void setRawPathEntries(IPathEntry[] newRawEntries) throws CoreException { + if (Arrays.equals(newRawEntries, getRawPathEntries())) { return; } - ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project); + ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(fProject); Element rootElement = descriptor.getProjectData(PATH_ENTRY_ID); // Clear out all current children Node child = rootElement.getFirstChild(); @@ -112,7 +113,7 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor if (newRawEntries != null && newRawEntries.length > 0) { // Serialize the include paths Document doc = rootElement.getOwnerDocument(); - encodePathEntries(project.getFullPath(), doc, rootElement, newRawEntries); + encodePathEntries(fProject.getFullPath(), doc, rootElement, newRawEntries); } descriptor.saveProjectData(); } @@ -239,7 +240,7 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor // translate the project prefix. IPath xmlPath = entries[i].getPath(); if (xmlPath == null) { - xmlPath = new Path(""); + xmlPath = new Path(""); //$NON-NLS-1$ } if (kind != IPathEntry.CDT_CONTAINER) { // translate to project relative from absolute (unless a device path) @@ -346,10 +347,9 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor public void descriptorChanged(CDescriptorEvent event) { if (event.getType() == CDescriptorEvent.CDTPROJECT_CHANGED) { ICDescriptor cdesc = event.getDescriptor(); - if (cdesc != null) { - IProject project = cdesc.getProject(); + if (cdesc != null && cdesc.getProject() == fProject){ // Call the listeners. - fireContentChangedEvent(project); + fireContentChangedEvent(fProject); } } } @@ -368,10 +368,7 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor listeners.remove(listener); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.resources.IPathEntryStore#fireContentChangedEvent(IProject) - */ - public void fireContentChangedEvent(IProject project) { + private void fireContentChangedEvent(IProject project) { PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(this, project, PathEntryStoreChangedEvent.CONTENT_CHANGED); IPathEntryStoreListener[] observers = new IPathEntryStoreListener[listeners.size()]; listeners.toArray(observers); @@ -383,13 +380,21 @@ public class PathEntryStore extends AbstractCExtension implements IPathEntryStor /* (non-Javadoc) * @see org.eclipse.cdt.core.resources.IPathEntryStore#fireClosedChangedEvent(IProject) */ - public void fireClosedEvent(IProject project) { - PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(this, project, PathEntryStoreChangedEvent.STORE_CLOSED); + public void close() { + PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(this, fProject, PathEntryStoreChangedEvent.STORE_CLOSED); IPathEntryStoreListener[] observers = new IPathEntryStoreListener[listeners.size()]; listeners.toArray(observers); for (int i = 0; i < observers.length; i++) { observers[i].pathEntryStoreChanged(evt); - } + } + CCorePlugin.getDefault().getCDescriptorManager().removeDescriptorListener(this); } + public IProject getProject() { + return fProject; + } + + public ICExtensionReference getExtensionReference() { + return null; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java index 816d5bc3f20..ba1c163424e 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java @@ -288,8 +288,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange } IPathEntry[] pathEntries; try { - IPathEntryStore store = getPathEntryStore(project); - pathEntries = store.getRawPathEntries(project); + IPathEntryStore store = getPathEntryStore(project, true); + pathEntries = store.getRawPathEntries(); } catch (CoreException e) { throw new CModelException(e); } @@ -528,8 +528,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange public void saveRawPathEntries(ICProject cproject, IPathEntry[] newRawEntries) throws CModelException { try { IProject project = cproject.getProject(); - IPathEntryStore store = getPathEntryStore(project); - store.setRawPathEntries(project, newRawEntries); + IPathEntryStore store = getPathEntryStore(project, true); + store.setRawPathEntries(newRawEntries); } catch (CoreException e) { throw new CModelException(e); } @@ -681,9 +681,9 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return containerIDs; } - private synchronized IPathEntryStore getPathEntryStore(IProject project) throws CoreException { + private synchronized IPathEntryStore getPathEntryStore(IProject project, boolean create) throws CoreException { IPathEntryStore store = (IPathEntryStore)storeMap.get(project); - if (store == null) { + if (store == null && create == true) { store = CCorePlugin.getDefault().getPathEntryStore(project); storeMap.put(project, store); store.addPathEntryStoreListener(this); @@ -691,8 +691,11 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange return store; } - private synchronized Object removePathEntryStore(IProject project) { - return storeMap.remove(project); + private synchronized void removePathEntryStore(IProject project) { + IPathEntryStore store = (IPathEntryStore)storeMap.remove(project); + if (store!= null) { + store.removePathEntryStoreListener(this); + } } /* (non-Javadoc) @@ -708,17 +711,9 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange CModelManager manager = CModelManager.getDefault(); ICProject cproject = manager.create(project); - try { - IPathEntryStore store = getPathEntryStore(project); - if (store != null) { - if (event.hasClosed()) { - removePathEntryStore(project); - store.removePathEntryStoreListener(this); - containerRemove(cproject); - } - } - } catch (CoreException e) { - CCorePlugin.log(e); + if (event.hasClosed()) { + removePathEntryStore(project); + containerRemove(cproject); } if (project.isAccessible()) { try { @@ -766,9 +761,9 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange IProject project = cproject.getProject(); IPathEntryStore store = null; try { - store = getPathEntryStore(project); + store = getPathEntryStore(project, false); if (store != null) { - store.fireClosedEvent(project); + store.close(); } } catch (CoreException e) { throw new CModelException(e); diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml index 1163befcf9a..bcfb98cd29c 100644 --- a/core/org.eclipse.cdt.core/plugin.xml +++ b/core/org.eclipse.cdt.core/plugin.xml @@ -97,19 +97,6 @@ - - - - - - - - - diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java index 33b2467710a..c689ee94503 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java @@ -31,6 +31,7 @@ import org.eclipse.cdt.internal.core.CDTLogWriter; import org.eclipse.cdt.internal.core.CDescriptorManager; import org.eclipse.cdt.internal.core.model.BufferManager; import org.eclipse.cdt.internal.core.model.CModelManager; +import org.eclipse.cdt.internal.core.model.DefaultPathEntryStore; import org.eclipse.cdt.internal.core.model.DeltaProcessor; import org.eclipse.cdt.internal.core.model.IBufferFactory; import org.eclipse.cdt.internal.core.model.Util; @@ -650,28 +651,13 @@ public class CCorePlugin extends Plugin { } } if (store == null) { - store = getDefaultPathEntryStore(); + store = getDefaultPathEntryStore(project); } return store; } - public IPathEntryStore getDefaultPathEntryStore() throws CoreException { - IPathEntryStore store = null; - IExtensionPoint extensionPoint = getDescriptor().getExtensionPoint(PATHENTRY_STORE_ID); - IExtension extension = extensionPoint.getExtension(DEFAULT_PATHENTRY_STORE_ID); - if (extension != null) { - IConfigurationElement element[] = extension.getConfigurationElements(); - for (int i = 0; i < element.length; i++) { - if (element[i].getName().equalsIgnoreCase("cextension")) { //$NON-NLS-1$ - store = (IPathEntryStore) element[i].createExecutableExtension("run"); //$NON-NLS-1$ - break; - } - } - } else { - IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, CCorePlugin.getResourceString("CCorePlugin.exception.noBinaryFormat"), null); //$NON-NLS-1$ - throw new CoreException(s); - } - return store; + public IPathEntryStore getDefaultPathEntryStore(IProject project) throws CoreException { + return new DefaultPathEntryStore(project); } /** diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IPathEntryStore.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IPathEntryStore.java index 98a7186e646..a1767a54773 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IPathEntryStore.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IPathEntryStore.java @@ -11,14 +11,14 @@ package org.eclipse.cdt.core.resources; +import org.eclipse.cdt.core.ICExtension; import org.eclipse.cdt.core.model.IPathEntry; -import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; /** * IPathEntryStore */ -public interface IPathEntryStore { +public interface IPathEntryStore extends ICExtension { /** * Returns the path entries save on the project. @@ -26,7 +26,7 @@ public interface IPathEntryStore { * @return * @throws CoreException */ - IPathEntry[] getRawPathEntries(IProject project) throws CoreException; + IPathEntry[] getRawPathEntries() throws CoreException; /** * Save the entries on the project. @@ -37,7 +37,7 @@ public interface IPathEntryStore { * @param entries * @throws CoreException */ - void setRawPathEntries(IProject project, IPathEntry[] entries) throws CoreException; + void setRawPathEntries(IPathEntry[] entries) throws CoreException; /** * Add a listener to the store. @@ -53,18 +53,6 @@ public interface IPathEntryStore { */ void removePathEntryStoreListener(IPathEntryStoreListener listener); - /** - * Fire a CONTENT_CHANGED event to the listeners. - * - * @param project - */ - void fireContentChangedEvent(IProject project); - - /** - * Fire a CLOSE_STORE event to the listeners. - * - * @param project - */ - void fireClosedEvent(IProject project); + void close(); }