blob: bdc2d77e92674f785f854c1e4529cd7349418288 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.persistence;
import java.util.HashMap;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.epf.persistence.PersistencePlugin;
import org.eclipse.epf.services.Services;
import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
import org.osgi.framework.Bundle;
/**
* @author Phong Nguyen Le
* @since 1.0
*/
public class PersistenceService {
public static boolean testMode = MultiResourceEObject.testMode;
private static final boolean DEBUG = PersistencePlugin.getDefault().isDebugging();
public static final PersistenceService INSTANCE = new PersistenceService();
private static HashMap<String, FactoryDef> typeToFactoryDefMap;
private PersistenceService() {
}
/**
* Creates a new ResourceSet for the given persistence type
*
* @param type
* @return
*/
public ILibraryResourceSet createResourceSet(String type) {
ILibraryResourceSetFactory factory = getFactory(type);
if(factory != null) {
return factory.createLibraryResourceSet();
}
else {
throw new IllegalArgumentException("Unknown type: " + type); //$NON-NLS-1$
}
}
private static class FactoryDef {
Bundle bundle;
String type;
String className;
int version;
ILibraryResourceSetFactory instance;
/**
* @param bundle
* @param type
* @param className
* @param instance
*/
private FactoryDef(Bundle bundle, String type, String className, int version) {
super();
this.bundle = bundle;
this.type = type;
this.className = className;
this.version = version;
}
}
public static final ILibraryResourceSetFactory getFactory(String persistenceType) {
if (typeToFactoryDefMap == null) {
typeToFactoryDefMap = new HashMap<String, FactoryDef>();
// Process the "org.eclipse.epf.library.persistence.migrators"
// extension point
// contributors.
IExtensionRegistry extensionRegistry = Platform
.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry
.getExtensionPoint(
"org.eclipse.epf.library.persistence", "resourceSetFactories"); //$NON-NLS-1$ //$NON-NLS-2$
String epfStr = "org.eclipse.epf";
if (extensionPoint != null) {
IExtension[] extensions = extensionPoint.getExtensions();
for (int i = 0; i < extensions.length; i++) {
IExtension extension = extensions[i];
String pluginId = extension.getNamespaceIdentifier();
if (testMode) {
if (pluginId.indexOf(epfStr) >= 0) {
continue;
}
} else {
if (pluginId.indexOf(epfStr) < 0) {
continue;
}
}
Bundle bundle = Platform.getBundle(pluginId);
IConfigurationElement[] configElements = extension
.getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
IConfigurationElement configElement = configElements[j];
try {
String className = configElement
.getAttribute("class"); //$NON-NLS-1$
String type = configElement
.getAttribute("type"); //$NON-NLS-1$
if (className != null
&& className.trim().length() > 0
&& type != null
&& type.trim().length() > 0) {
int version = Services.parseVersion(configElement.getAttribute("version")); //$NON-NLS-1$
FactoryDef factoryDef = typeToFactoryDefMap.get(type);
if(factoryDef == null || factoryDef.version < version) {
typeToFactoryDefMap.put(type, new FactoryDef(bundle,
type, className, version));
}
}
} catch (Exception e) {
CommonPlugin.INSTANCE.log(e);
}
}
}
}
}
FactoryDef factory = (FactoryDef) typeToFactoryDefMap.get(persistenceType);
if (factory != null) {
if (factory.instance == null) {
try {
ILibraryResourceSetFactory resourceSetFactory = (ILibraryResourceSetFactory) factory.bundle.loadClass(
factory.className).newInstance();
if(persistenceType.equals(resourceSetFactory.getPersistenceType())) {
factory.instance = resourceSetFactory;
}
else {
PersistencePlugin.getDefault().getLogger().logError(factory.className +
" is registered with the wrong persistence type '" + persistenceType + //$NON-NLS-1$
"'. The correct type must be '" + resourceSetFactory.getPersistenceType() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
} catch (Exception e) {
PersistencePlugin.getDefault().getLogger().logError(e);
if(DEBUG) {
e.printStackTrace();
}
}
}
return factory.instance;
}
return null;
}
}