blob: 40155131fcab3c0b0fac2fd1d7a3a80f131ef7d6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Red Hat and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.common.componentcore.internal.flat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
/**
* A class to load and keep track of all IFlattenParticipantProviders,
* and also to assist in locating IFlattenParticipants of a specific ID.
*/
public class FlattenParticipantModel {
private static FlattenParticipantModel model;
public static FlattenParticipantModel getDefault() {
if( model == null )
model = new FlattenParticipantModel();
return model;
}
private ArrayList<FlattenParticipantProviderWrapper> providers;
public FlattenParticipantModel() {
}
public IFlattenParticipant getParticipant(String id) {
return getParticipant(id, null);
}
public IFlattenParticipant getParticipant(String id, Properties properties) {
IFlattenParticipantProvider[] providers = getProviders();
IFlattenParticipant result = null;
for( int i = 0; i < providers.length; i++ ) {
result = providers[i].findParticipant(id, properties);
if( result != null )
return result;
}
return null;
}
protected IFlattenParticipantProvider[] getProviders() {
if( providers == null )
loadProviders();
return providers.toArray(new IFlattenParticipantProvider[providers.size()]);
}
protected void loadProviders() {
ArrayList<FlattenParticipantProviderWrapper> tmp = new ArrayList<FlattenParticipantProviderWrapper>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] cf = registry.getConfigurationElementsFor(ModulecorePlugin.PLUGIN_ID, "flattenParticipantProvider"); //$NON-NLS-1$
String id = null;
for( int j = 0; j < cf.length; j++ ) {
tmp.add(getWrapper(cf[j]));
}
// Sort
Collections.sort(tmp, new Comparator<FlattenParticipantProviderWrapper>() {
public int compare(FlattenParticipantProviderWrapper o1,
FlattenParticipantProviderWrapper o2) {
if( o1 == null && o2 == null )
return 0;
if( o1 == null )
return 1;
if( o2 == null )
return -1;
return o2.getWeight() - o1.getWeight();
}
});
providers = tmp;
}
private FlattenParticipantProviderWrapper getWrapper(IConfigurationElement element) {
return new FlattenParticipantProviderWrapper(element);
}
private static class FlattenParticipantProviderWrapper implements IFlattenParticipantProvider {
private IConfigurationElement cf;
private int weight;
private IFlattenParticipantProvider delegate;
public FlattenParticipantProviderWrapper(IConfigurationElement element) {
this.cf = element;
System.out.println(element.getAttribute("class"));
String s = element.getAttribute("weight");
try {
weight = Integer.parseInt(s);
} catch(NumberFormatException nfe ) {
// TODO trace / log? Maybe not necessary. Use default weight
weight = 0; // default weight
}
}
public int getWeight() {
return weight;
}
public IFlattenParticipant findParticipant(String id, Properties props) {
if( delegate == null )
loadDelegate();
return delegate == null ? null : delegate.findParticipant(id, props);
}
private void loadDelegate() {
try {
delegate = (IFlattenParticipantProvider) cf.createExecutableExtension("class");
} catch(CoreException ce ) {
// TODO where to do the logging?
}
}
}
}