mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 04:45:38 +02:00
Cosmetics.
This commit is contained in:
parent
335422ecee
commit
75b90b2612
1 changed files with 64 additions and 61 deletions
|
@ -6,8 +6,8 @@
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Andrew Ferguson (Symbian) - Initial implementation
|
* Andrew Ferguson (Symbian) - Initial implementation
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.index.provider;
|
package org.eclipse.cdt.internal.core.index.provider;
|
||||||
|
|
||||||
|
@ -50,25 +50,26 @@ import org.osgi.framework.Version;
|
||||||
* The IndexProviderManager is responsible for maintaining the set of index
|
* The IndexProviderManager is responsible for maintaining the set of index
|
||||||
* fragments contributed via the CIndex extension point.
|
* fragments contributed via the CIndex extension point.
|
||||||
* <p>
|
* <p>
|
||||||
* It is an internal class, and is public only for testing purposes.
|
* For bug 196338, the role of this class was extended. It now has responsibility to look
|
||||||
* @since 4.0
|
* at the pool of fragments available depending on their IDs, and select the most appropriate.
|
||||||
*/
|
* The following rules are applied:
|
||||||
/*
|
* <ul>
|
||||||
* For bug 196338, the role of this class was extended. It now has responsibility to
|
* <li>If a fragment is not compatible, don't use it.</li>
|
||||||
* look at the pool of fragments available depending on their IDs, and select the most appropriate.
|
* <li>If multiple fragments are compatible, pick the latest.</li>
|
||||||
* The following rules are applied
|
* </ul>
|
||||||
* (i) If its not compatible, don't use it
|
|
||||||
* (ii) If multiple are compatible, pick the latest
|
|
||||||
*
|
*
|
||||||
* A warning is logged if a fragment is contributed which is incompatible, and for which there is
|
* A warning is logged if a fragment is contributed which is incompatible, and for which there is
|
||||||
* no compatible equivalent.
|
* no compatible equivalent.
|
||||||
|
*
|
||||||
|
* It is an internal class, and is public only for testing purposes.
|
||||||
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public final class IndexProviderManager implements IElementChangedListener {
|
public final class IndexProviderManager implements IElementChangedListener {
|
||||||
private static final String ELEMENT_RO_PDOMPROVIDER= "ReadOnlyPDOMProvider"; //$NON-NLS-1$
|
private static final String ELEMENT_RO_PDOMPROVIDER= "ReadOnlyPDOMProvider"; //$NON-NLS-1$
|
||||||
private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
|
private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
|
||||||
|
|
||||||
private IIndexFragmentProvider[] allProviders;
|
private IIndexFragmentProvider[] allProviders;
|
||||||
private Map<ProvisionMapKey,Boolean> provisionMap;
|
private Map<ProvisionMapKey, Boolean> provisionMap;
|
||||||
private Set<String> compatibleFragmentUnavailable;
|
private Set<String> compatibleFragmentUnavailable;
|
||||||
private VersionRange pdomVersionRange;
|
private VersionRange pdomVersionRange;
|
||||||
|
|
||||||
|
@ -101,21 +102,21 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
IExtensionRegistry registry = Platform.getExtensionRegistry();
|
IExtensionRegistry registry = Platform.getExtensionRegistry();
|
||||||
IExtensionPoint indexProviders = registry.getExtensionPoint(CCorePlugin.INDEX_UNIQ_ID);
|
IExtensionPoint indexProviders = registry.getExtensionPoint(CCorePlugin.INDEX_UNIQ_ID);
|
||||||
IExtension[] extensions = indexProviders.getExtensions();
|
IExtension[] extensions = indexProviders.getExtensions();
|
||||||
for(int i=0; i<extensions.length; i++) {
|
for (int i= 0; i < extensions.length; i++) {
|
||||||
IExtension extension = extensions[i];
|
IExtension extension = extensions[i];
|
||||||
try {
|
try {
|
||||||
IConfigurationElement[] ce = extension.getConfigurationElements();
|
IConfigurationElement[] ce = extension.getConfigurationElements();
|
||||||
for(int j=0; j<ce.length; j++) {
|
for (int j=0; j<ce.length; j++) {
|
||||||
if(ce[j].getName().equals(ELEMENT_RO_PDOMPROVIDER)) {
|
if (ce[j].getName().equals(ELEMENT_RO_PDOMPROVIDER)) {
|
||||||
IIndexProvider provider = (IIndexProvider) ce[j].createExecutableExtension(ATTRIBUTE_CLASS);
|
IIndexProvider provider = (IIndexProvider) ce[j].createExecutableExtension(ATTRIBUTE_CLASS);
|
||||||
|
|
||||||
if(provider instanceof IReadOnlyPDOMProvider) {
|
if (provider instanceof IReadOnlyPDOMProvider) {
|
||||||
provider = new ReadOnlyPDOMProviderBridge((IReadOnlyPDOMProvider)provider);
|
provider = new ReadOnlyPDOMProviderBridge((IReadOnlyPDOMProvider) provider);
|
||||||
providers.add(provider);
|
providers.add(provider);
|
||||||
} else {
|
} else {
|
||||||
CCorePlugin.log(MessageFormat.format(
|
CCorePlugin.log(MessageFormat.format(
|
||||||
Messages.IndexProviderManager_0,
|
Messages.IndexProviderManager_0,
|
||||||
new Object[] {extension.getContributor().getName()}
|
new Object[] { extension.getContributor().getName() }
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,11 +142,11 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
Map<String, IIndexFragment> id2fragment = new HashMap<String, IIndexFragment>();
|
Map<String, IIndexFragment> id2fragment = new HashMap<String, IIndexFragment>();
|
||||||
|
|
||||||
IProject project= config.getProjectDescription().getProject();
|
IProject project= config.getProjectDescription().getProject();
|
||||||
for(int i=0; i<allProviders.length; i++) {
|
for (int i= 0; i < allProviders.length; i++) {
|
||||||
try {
|
try {
|
||||||
if(providesForProject(allProviders[i], project)) {
|
if (providesForProject(allProviders[i], project)) {
|
||||||
IIndexFragment[] fragments= allProviders[i].getIndexFragments(config);
|
IIndexFragment[] fragments= allProviders[i].getIndexFragments(config);
|
||||||
for(int j=0; j<fragments.length; j++) {
|
for (int j= 0; j < fragments.length; j++) {
|
||||||
try {
|
try {
|
||||||
processCandidate(id2fragment, fragments[j]);
|
processCandidate(id2fragment, fragments[j]);
|
||||||
} catch(InterruptedException ie) {
|
} catch(InterruptedException ie) {
|
||||||
|
@ -162,15 +163,16 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
|
|
||||||
// Make log entries for any fragments which have no compatible equivalents
|
// Make log entries for any fragments which have no compatible equivalents
|
||||||
List<IIndexFragment> preresult= new ArrayList<IIndexFragment>();
|
List<IIndexFragment> preresult= new ArrayList<IIndexFragment>();
|
||||||
for(Map.Entry<String, IIndexFragment> entry : id2fragment.entrySet()) {
|
for (Map.Entry<String, IIndexFragment> entry : id2fragment.entrySet()) {
|
||||||
if(entry.getValue()==null) {
|
if (entry.getValue() == null) {
|
||||||
String key= entry.getKey();
|
String key= entry.getKey();
|
||||||
if(!compatibleFragmentUnavailable.contains(key)) {
|
if (!compatibleFragmentUnavailable.contains(key)) {
|
||||||
String msg= MessageFormat.format(
|
String msg= MessageFormat.format(
|
||||||
Messages.IndexProviderManager_NoCompatibleFragmentsAvailable,
|
Messages.IndexProviderManager_NoCompatibleFragmentsAvailable,
|
||||||
new Object[]{key}
|
new Object[]{key}
|
||||||
);
|
);
|
||||||
IStatus status= new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, IStatus.WARNING, msg, null);
|
IStatus status= new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID,
|
||||||
|
IStatus.WARNING, msg, null);
|
||||||
CCorePlugin.log(status);
|
CCorePlugin.log(status);
|
||||||
compatibleFragmentUnavailable.add(key);
|
compatibleFragmentUnavailable.add(key);
|
||||||
}
|
}
|
||||||
|
@ -190,7 +192,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
* TODO - at the point we support alternate IIndexFragment implementations, this method will need
|
* TODO - at the point we support alternate IIndexFragment implementations, this method will need
|
||||||
* to be altered to lookup version ranges for the contributed format via an extension point.
|
* to be altered to lookup version ranges for the contributed format via an extension point.
|
||||||
*/
|
*/
|
||||||
if(!PDOM.FRAGMENT_PROPERTY_VALUE_FORMAT_ID.equals(formatID)) {
|
if (!PDOM.FRAGMENT_PROPERTY_VALUE_FORMAT_ID.equals(formatID)) {
|
||||||
throw new IllegalArgumentException("Non-PDOM formats are currently unsupported"); //$NON-NLS-1$
|
throw new IllegalArgumentException("Non-PDOM formats are currently unsupported"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
return pdomVersionRange;
|
return pdomVersionRange;
|
||||||
|
@ -203,7 +205,8 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
* @param id2fragment
|
* @param id2fragment
|
||||||
* @param candidate
|
* @param candidate
|
||||||
*/
|
*/
|
||||||
private void processCandidate(Map<String, IIndexFragment> id2fragment, IIndexFragment candidate) throws InterruptedException, CoreException {
|
private void processCandidate(Map<String, IIndexFragment> id2fragment, IIndexFragment candidate)
|
||||||
|
throws InterruptedException, CoreException {
|
||||||
String cid= null, csver= null, cformatID= null;
|
String cid= null, csver= null, cformatID= null;
|
||||||
candidate.acquireReadLock();
|
candidate.acquireReadLock();
|
||||||
try {
|
try {
|
||||||
|
@ -213,13 +216,13 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
} finally {
|
} finally {
|
||||||
candidate.releaseReadLock();
|
candidate.releaseReadLock();
|
||||||
}
|
}
|
||||||
assert cid!=null && csver!=null && cformatID!=null;
|
assert cid != null && csver != null && cformatID != null;
|
||||||
|
|
||||||
Version cver= Version.parseVersion(csver); // illegal argument exception
|
Version cver= Version.parseVersion(csver); // illegal argument exception
|
||||||
IIndexFragment existing= id2fragment.get(cid);
|
IIndexFragment existing= id2fragment.get(cid);
|
||||||
|
|
||||||
if(getCurrentlySupportedVersionRangeForFormat(cformatID).isIncluded(cver)) {
|
if (getCurrentlySupportedVersionRangeForFormat(cformatID).isIncluded(cver)) {
|
||||||
if(existing != null) {
|
if (existing != null) {
|
||||||
String esver= null, eformatID= null;
|
String esver= null, eformatID= null;
|
||||||
existing.acquireReadLock();
|
existing.acquireReadLock();
|
||||||
try {
|
try {
|
||||||
|
@ -229,9 +232,9 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
existing.releaseReadLock();
|
existing.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(eformatID.equals(cformatID)) {
|
if (eformatID.equals(cformatID)) {
|
||||||
Version ever= Version.parseVersion(esver); // illegal argument exception
|
Version ever= Version.parseVersion(esver); // illegal argument exception
|
||||||
if(ever.compareTo(cver) < 0) {
|
if (ever.compareTo(cver) < 0) {
|
||||||
id2fragment.put(cid, candidate);
|
id2fragment.put(cid, candidate);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -245,7 +248,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
id2fragment.put(cid, candidate);
|
id2fragment.put(cid, candidate);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(existing==null) {
|
if (existing == null) {
|
||||||
id2fragment.put(cid, null); // signifies candidate is unusable
|
id2fragment.put(cid, null); // signifies candidate is unusable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,7 +259,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
* @param provider
|
* @param provider
|
||||||
*/
|
*/
|
||||||
public void addIndexProvider(IIndexProvider provider) {
|
public void addIndexProvider(IIndexProvider provider) {
|
||||||
if(!(provider instanceof IIndexFragmentProvider)) {
|
if (!(provider instanceof IIndexFragmentProvider)) {
|
||||||
/* This engineering compromise can be resolved when we address whether
|
/* This engineering compromise can be resolved when we address whether
|
||||||
* IIndexFragment can be made public. The extension point only accepts
|
* IIndexFragment can be made public. The extension point only accepts
|
||||||
* instances of IOfflinePDOMIndexProvider so this should never happen (tm)
|
* instances of IOfflinePDOMIndexProvider so this should never happen (tm)
|
||||||
|
@ -265,7 +268,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IIndexFragmentProvider[] newAllProviders = new IIndexFragmentProvider[allProviders.length+1];
|
IIndexFragmentProvider[] newAllProviders = new IIndexFragmentProvider[allProviders.length + 1];
|
||||||
System.arraycopy(allProviders, 0, newAllProviders, 0, allProviders.length);
|
System.arraycopy(allProviders, 0, newAllProviders, 0, allProviders.length);
|
||||||
newAllProviders[allProviders.length] = (IIndexFragmentProvider) provider;
|
newAllProviders[allProviders.length] = (IIndexFragmentProvider) provider;
|
||||||
allProviders = newAllProviders;
|
allProviders = newAllProviders;
|
||||||
|
@ -278,9 +281,9 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
*/
|
*/
|
||||||
public void removeIndexProvider(IIndexProvider provider) {
|
public void removeIndexProvider(IIndexProvider provider) {
|
||||||
ArrayUtil.remove(allProviders, provider);
|
ArrayUtil.remove(allProviders, provider);
|
||||||
if(allProviders[allProviders.length-1]==null) {
|
if (allProviders[allProviders.length - 1] == null) {
|
||||||
IIndexFragmentProvider[] newAllProviders = new IIndexFragmentProvider[allProviders.length-1];
|
IIndexFragmentProvider[] newAllProviders = new IIndexFragmentProvider[allProviders.length - 1];
|
||||||
System.arraycopy(allProviders, 0, newAllProviders, 0, allProviders.length-1);
|
System.arraycopy(allProviders, 0, newAllProviders, 0, allProviders.length - 1);
|
||||||
allProviders= newAllProviders;
|
allProviders= newAllProviders;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -288,12 +291,12 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
private boolean providesForProject(IIndexProvider provider, IProject project) {
|
private boolean providesForProject(IIndexProvider provider, IProject project) {
|
||||||
ProvisionMapKey key= new ProvisionMapKey(provider, project);
|
ProvisionMapKey key= new ProvisionMapKey(provider, project);
|
||||||
|
|
||||||
if(!provisionMap.containsKey(key)) {
|
if (!provisionMap.containsKey(key)) {
|
||||||
try {
|
try {
|
||||||
ICProject cproject= CoreModel.getDefault().create(project);
|
ICProject cproject= CoreModel.getDefault().create(project);
|
||||||
provisionMap.put(key, new Boolean(provider.providesFor(cproject)));
|
provisionMap.put(key, new Boolean(provider.providesFor(cproject)));
|
||||||
} catch(CoreException ce) {
|
} catch(CoreException e) {
|
||||||
CCorePlugin.log(ce);
|
CCorePlugin.log(e);
|
||||||
provisionMap.put(key, Boolean.FALSE);
|
provisionMap.put(key, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,13 +328,13 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
switch (delta.getKind()) {
|
switch (delta.getKind()) {
|
||||||
case ICElementDelta.REMOVED:
|
case ICElementDelta.REMOVED:
|
||||||
List<ProvisionMapKey> toRemove = new ArrayList<ProvisionMapKey>();
|
List<ProvisionMapKey> toRemove = new ArrayList<ProvisionMapKey>();
|
||||||
for(Iterator<ProvisionMapKey> i = provisionMap.keySet().iterator(); i.hasNext(); ) {
|
for (Iterator<ProvisionMapKey> i = provisionMap.keySet().iterator(); i.hasNext(); ) {
|
||||||
ProvisionMapKey key = i.next();
|
ProvisionMapKey key = i.next();
|
||||||
if(key.getProject().equals(cproject.getProject())) {
|
if (key.getProject().equals(cproject.getProject())) {
|
||||||
toRemove.add(key);
|
toRemove.add(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(ProvisionMapKey key : toRemove) {
|
for (ProvisionMapKey key : toRemove) {
|
||||||
provisionMap.remove(key);
|
provisionMap.remove(key);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -350,7 +353,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if(obj instanceof ProvisionMapKey) {
|
if (obj instanceof ProvisionMapKey) {
|
||||||
ProvisionMapKey other= (ProvisionMapKey) obj;
|
ProvisionMapKey other= (ProvisionMapKey) obj;
|
||||||
return other.project.equals(project) && other.provider.equals(provider);
|
return other.project.equals(project) && other.provider.equals(provider);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue