/*******************************************************************************
* Copyright (c) 2012 The PDT Extension Group (https://github.com/pdt-eg)
* 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
******************************************************************************/
package org.pdtextensions.repos;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.pdtextensions.repos.api.IRepositoryProvider;
import org.pdtextensions.repos.api.IRepositoryProviderFactory;
import org.pdtextensions.repos.internal.wrapper.GlobalRepositoryProvider;
public class PEXReposPlugin implements BundleActivator {
public static final String PLUGIN_ID = "org.pdtextensions.repos";
private static PEXReposPlugin plugin;
private static BundleContext context;
/**
* The factories
*/
private static List<IRepositoryProviderFactory> FACTORIES;
private static GlobalRepositoryProvider GLOBAL_PROVIDER;
private static int nextId = 0;
static BundleContext getContext() {
return context;
}
public static PEXReposPlugin getDefault() {
return plugin;
}
/**
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext bundleContext) throws Exception {
PEXReposPlugin.context = bundleContext;
plugin = this;
init();
}
/**
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
FACTORIES = null;
plugin = null;
GLOBAL_PROVIDER = null;
PEXReposPlugin.context = null;
}
private static void init() {
if (FACTORIES == null) {
FACTORIES = new ArrayList<IRepositoryProviderFactory>();
final IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.pdtextensions.repos.factories");
for (final IConfigurationElement element : point.getConfigurationElements()) {
try {
FACTORIES.add((IRepositoryProviderFactory) element.createExecutableExtension("class"));
} catch (CoreException e) {
// TODO logging
}
}
GLOBAL_PROVIDER = new GlobalRepositoryProvider();
}
}
/**
* Returns a generic provider that is aware of accessing all other repositories.
* @return the generic provider to access all other repositories.
*/
public static IRepositoryProvider getProvider() {
init();
return GLOBAL_PROVIDER;
}
/**
* Returns all known providers.
* @return iterable for all known repository providers.
*/
public static Iterable<IRepositoryProvider> getProviders() {
init();
return GLOBAL_PROVIDER.getProviders();
}
/**
* Creates a new temporary provider
* @param type repository implementation type; equals the extension type name
* @param uri the uri to access the repository (may contain options; see the documentation of the repository implementation)
* @return the repository provider
* @throws CoreException thrown on errors
*/
public static IRepositoryProvider createProvider(String type, String uri) throws CoreException {
init();
for (final IRepositoryProviderFactory factory : FACTORIES) {
if (type.equals(factory.getType())) {
nextId++;
return factory.createTemporary(uri, "temp-" + nextId);
}
}
throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, "Cannot create repository; type not found."));
}
/**
* Registers a repository provider.
* @param provider the provider to be registered.
*/
public static void registerProvider(IRepositoryProvider provider) {
init();
GLOBAL_PROVIDER.registerProvider(provider);
}
/**
* Unregisters the repository provider.
* @param provider the provider to be unregistered.
*/
public static void unregisterProvider(IRepositoryProvider provider) {
init();
GLOBAL_PROVIDER.unregisterProvider(provider);
}
/**
* Returns the provider factories being able to create repositories of a specific type.
* @return The provider factory list
*/
public static Iterable<IRepositoryProviderFactory> getFactories() {
init();
return Collections.unmodifiableList(FACTORIES);
}
/**
* Mask search Strings, for example given to {@see IRepositoryProvider#findModule(String, String, String)} to represent a regex
* @param searchString search string (must not be null)
* @return the regex string
*/
public static String maskSearchStringToRegexp(String searchString) {
return searchString.toLowerCase()
.replace("\\", "\\\\")
.replace(".", "\\.")
.replace("[", "\\[")
.replace("]", "\\]")
.replace("^", "\\^")
.replace("$", "\\$")
.replace("|", "\\|")
.replace("?", "\\?")
.replace("+", "\\+")
.replace("(", "\\(")
.replace(")", "\\)")
// allowed wildcards
.replace("*", ".*");
}
public static boolean debug() {
final String debugOption = Platform.getDebugOption("org.pdtextensions.repos/debug"); //$NON-NLS-1$
return "true".equalsIgnoreCase(debugOption);
}
}