blob: a6a514edcd8f70702bd923c4405d36902f944c86 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.define.utilities;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
import org.eclipse.osee.framework.jdk.core.type.HashCollection;
import org.eclipse.osee.framework.jdk.core.util.Strings;
import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
import org.eclipse.osee.ote.define.OteDefinePlugin;
import org.eclipse.osee.ote.define.parser.BaseOutfileParser;
import org.osgi.framework.Bundle;
/**
* @author Roberto E. Escobar
*/
public class OutfileParserExtensionManager {
private static final String OUTFILE_PARSER = "OutfileParser";
private static final String CLASS_NAME = "classname";
private static final String SUPPORTED_EXTENSIONS = "supportedExtensions";
private final Map<String, BaseOutfileParser> contributions;
private final HashCollection<String, BaseOutfileParser> extensionsToParsers;
private static OutfileParserExtensionManager instance = null;
private OutfileParserExtensionManager() {
contributions = new HashMap<String, BaseOutfileParser>();
extensionsToParsers = new HashCollection<String, BaseOutfileParser>(false, HashSet.class);
}
public static OutfileParserExtensionManager getInstance() {
if (instance == null) {
instance = new OutfileParserExtensionManager();
}
return instance;
}
public String[] getSupportedExtensions() throws OseeCoreException {
checkObjectsLoaded();
Set<String> set = extensionsToParsers.keySet();
return set.toArray(new String[set.size()]);
}
public BaseOutfileParser getOutfileParserFor(URL fileToImport) throws OseeCoreException {
checkObjectsLoaded();
BaseOutfileParser toReturn = null;
for (BaseOutfileParser parser : getOutfileParsers()) {
if (parser.isValidParser(fileToImport)) {
toReturn = parser;
break;
}
}
if (toReturn == null) {
throw new OseeStateException(String.format("Unsupported outfile type [%s] no valid outfile parser found",
fileToImport));
}
return toReturn;
}
public BaseOutfileParser getOutfileParserById(String id) throws OseeCoreException {
checkObjectsLoaded();
return contributions.get(id);
}
public Collection<BaseOutfileParser> getOutfileParsers() throws OseeCoreException {
checkObjectsLoaded();
return contributions.values();
}
private void checkObjectsLoaded() throws OseeCoreException {
if (contributions.isEmpty()) {
List<IConfigurationElement> elements =
ExtensionPoints.getExtensionElements(OteDefinePlugin.PLUGIN_ID + "." + OUTFILE_PARSER, OUTFILE_PARSER);
for (IConfigurationElement element : elements) {
IExtension extension = ((IExtension) element.getParent());
String identifier = extension.getUniqueIdentifier();
String bundleName = element.getContributor().getName();
String parserClassName = element.getAttribute(CLASS_NAME);
String supportedExtensions = element.getAttribute(SUPPORTED_EXTENSIONS);
Set<String> supportedSet = getSupportedExtensions(supportedExtensions);
BaseOutfileParser parser = (BaseOutfileParser) loadClass(bundleName, parserClassName);
if (parser != null) {
contributions.put(identifier, parser);
for (String extensionType : supportedSet) {
extensionsToParsers.put(extensionType, parser);
}
}
}
}
}
private Set<String> getSupportedExtensions(String rawExtensions) {
Set<String> toReturn = new HashSet<String>();
for (String value : rawExtensions.split(";")) {
value = value.trim();
if (Strings.isValid(value)) {
toReturn.add(value);
}
}
return toReturn;
}
private Object loadClass(String bundleName, String className) throws OseeCoreException {
Object object = null;
if (Strings.isValid(bundleName) && Strings.isValid(className)) {
try {
Bundle bundle = Platform.getBundle(bundleName);
Class<?> taskClass = bundle.loadClass(className);
try {
Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
object = getInstance.invoke(null, new Object[] {});
} catch (Exception ex) {
object = taskClass.newInstance();
}
} catch (Exception ex) {
throw new OseeCoreException(String.format("Unable to Load: [%s - %s]", bundleName, className), ex);
}
}
return object;
}
}