1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 21:05:37 +02:00

Cosmetics.

This commit is contained in:
Sergey Prigogin 2011-03-06 23:14:04 +00:00
parent 335422ecee
commit 75b90b2612

View file

@ -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);
} }