/**
* Copyright (c) 2010, 2012 Darmstadt University of Technology.
* 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:
* Sebastian Proksch - initial API and implementation
*/
package org.eclipse.recommenders.internal.apidocs.rcp;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.eclipse.recommenders.internal.apidocs.rcp.l10n.LogMessages.ERROR_FAILED_TO_INSTANTIATE_PROVIDER;
import static org.eclipse.recommenders.utils.Logs.log;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.recommenders.apidocs.rcp.ApidocProvider;
import org.eclipse.recommenders.apidocs.rcp.ApidocProviderDescription;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;
import com.google.inject.BindingAnnotation;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
public class ApidocsRcpModule extends AbstractModule {
private static final String EXT_ID_PROVIDER = "org.eclipse.recommenders.apidocs.rcp.providers"; //$NON-NLS-1$
@Override
protected void configure() {
bind(ApidocsPreferences.class).in(Scopes.SINGLETON);
}
@Provides
@Singleton
@Extdoc
IPreferenceStore providePreferenceStore() {
return ApidocsRcpPlugin.getDefault().getPreferenceStore();
}
@Provides
@Singleton
List<ApidocProvider> provideProviders() {
return instantiateProvidersFromRegistry();
}
private static List<ApidocProvider> instantiateProvidersFromRegistry() {
final IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(
EXT_ID_PROVIDER);
final List<ApidocProvider> providers = Lists.newLinkedList();
for (final IConfigurationElement element : elements) {
final Optional<ApidocProvider> opt = createProvider(element);
if (opt.isPresent()) {
providers.add(opt.get());
}
}
Collections.sort(providers, new Comparator<ApidocProvider>() {
@Override
public int compare(ApidocProvider o1, ApidocProvider o2) {
String n1 = o1.getDescription().getName();
String n2 = o2.getDescription().getName();
if (n1.equals("Javadoc")) { //$NON-NLS-1$
return -1;
} else if (n2.equals("Javadoc")) { //$NON-NLS-1$
return 1;
} else {
return n1.compareTo(n2);
}
}
});
return providers;
}
static Optional<ApidocProvider> createProvider(final IConfigurationElement element) {
final String pluginId = element.getContributor().getName();
try {
final String imagePath = element.getAttribute("image"); //$NON-NLS-1$
final String name = element.getAttribute("name"); //$NON-NLS-1$
final Image image = AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, imagePath).createImage();
final ApidocProvider provider = (ApidocProvider) element.createExecutableExtension("class"); //$NON-NLS-1$
final ApidocProviderDescription description = new ApidocProviderDescription(name, image);
provider.setDescription(description);
return Optional.of(provider);
} catch (final Exception e) {
log(ERROR_FAILED_TO_INSTANTIATE_PROVIDER, e, pluginId, element.getAttribute("class")); //$NON-NLS-1$
return Optional.absent();
}
}
@BindingAnnotation
@Target({ METHOD, PARAMETER })
@Retention(RUNTIME)
public static @interface Extdoc {
}
}