blob: b5551d0d8b481fa1e7871afa45fe8023d1b3b214 [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 Mia-Software.
*
* 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:
* Grégoire Dupé (Mia-Software) - Bug 334000 Simple catalog manager
* Nicolas Guyomar (Mia-Software) - Bug 334000 Simple catalog manager
* Nicolas Guyomar (Mia-Software) - Bug 334529 - ICatalogManager should be exposed in org.eclipse.modisco.facet.common.core
* Nicolas Guyomar (Mia-Software) - Bug 338811 - A model registration method in the interface ICatalogSetManager
* Grégoire Dupé (Mia-Software) - Bug 338811 - A model registration method in the interface ICatalogSetManager
* Emmanuelle Rouillé (Mia-Software) - Bug 352618 - To be able to use non derived facet structural features and save them values.
* Grégoire Dupé (Mia-Software) - Bug 362084 - Get the instance of a catalog manager
* Grégoire Dupé (Mia-Software) - Bug 362087 - [Deprecated] org.eclipse.modisco.facet.util.emf.core.ICatalogSetManager
* Grégoire Dupé (Mia-Software) - Bug 477657 - The catalog manager should be able to manage workspace model
*/
package org.eclipse.modisco.facet.util.emf.core.internal.catalog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
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.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.modisco.facet.util.core.Logger;
import org.eclipse.modisco.facet.util.emf.catalog.CatalogFactory;
import org.eclipse.modisco.facet.util.emf.catalog.CatalogSet;
import org.eclipse.modisco.facet.util.emf.core.ICatalogManager;
import org.eclipse.modisco.facet.util.emf.core.ICatalogSetManager2;
import org.eclipse.modisco.facet.util.emf.core.exception.InvalidFacetSetException;
import org.eclipse.modisco.facet.util.emf.core.internal.Activator;
import org.eclipse.modisco.facet.util.pde.core.internal.exported.PluginUtils;
import org.osgi.framework.Bundle;
@Deprecated
public class CatalogSetManager implements ICatalogSetManager2, Adapter {
private static final String CATALOG_MGR_EXTENSION_POINT_ID = "org.eclipse.modisco.facet.util.emf.core.catalogmanager"; //$NON-NLS-1$
private static final String MODEL_DECLARATION_EXTENSION_POINT_ID = "org.eclipse.modisco.facet.util.emf.core.modeldeclaration"; //$NON-NLS-1$
private static final String CLASS = "class"; //$NON-NLS-1$
private static final String FILE = "file"; //$NON-NLS-1$
/**
* The singleton instance of this {@link CatalogSetManager}.
*/
public static final CatalogSetManager INSTANCE = new CatalogSetManager();
private final Map<Resource, Bundle> resourceToBundleMap = new HashMap<Resource, Bundle>();
private final ResourceSet resourceSet;
private final List<ICatalogManager> catalogManagers = new ArrayList<ICatalogManager>();
private final CatalogSet catalogSet;
public CatalogSetManager() {
this.resourceSet = new ResourceSetImpl();
this.catalogSet = CatalogFactory.eINSTANCE.createCatalogSet();
initRegisteredEntries();
}
public CatalogSetManager(final ResourceSet resourceSet) {
this.resourceSet = resourceSet;
this.catalogSet = CatalogFactory.eINSTANCE.createCatalogSet();
initRegisteredEntries();
}
private void initRegisteredEntries() {
final IExtensionRegistry registry = Platform.getExtensionRegistry();
final IExtensionPoint extPointCatalogMgr = registry
.getExtensionPoint(CatalogSetManager.CATALOG_MGR_EXTENSION_POINT_ID);
if (extPointCatalogMgr != null) {
for (IExtension ext : extPointCatalogMgr.getExtensions()) {
for (IConfigurationElement configElt : ext
.getConfigurationElements()) {
ICatalogManager catalogMgr;
try {
catalogMgr = (ICatalogManager) configElt
.createExecutableExtension(CatalogSetManager.CLASS);
this.catalogManagers.add(catalogMgr);
catalogMgr.setCatalogSet(this.catalogSet);
} catch (CoreException e) {
Logger.logError(e, Activator.getDefault());
}
}
}
}
IExtensionPoint modelDeclarationExtPoint = registry
.getExtensionPoint(CatalogSetManager.MODEL_DECLARATION_EXTENSION_POINT_ID);
if (modelDeclarationExtPoint != null) {
for (IExtension ext : modelDeclarationExtPoint.getExtensions()) {
for (IConfigurationElement configElt : ext
.getConfigurationElements()) {
String filePath = configElt
.getAttribute(CatalogSetManager.FILE);
if (filePath != null) {
String pluginName = ext.getNamespaceIdentifier();
Bundle bundle = Platform.getBundle(pluginName);
URI uri = URI.createPlatformPluginURI(pluginName + "/" //$NON-NLS-1$
+ filePath, false);
try {
final Resource resource = this.resourceSet
.getResource(uri, true);
this.resourceToBundleMap.put(resource, bundle);
for (EObject root : resource.getContents()) {
for (ICatalogManager catalogMgr : this.catalogManagers) {
if (catalogMgr.canBeManaged(root)) {
catalogMgr.manage(root);
}
}
}
} catch (Exception e) {
Logger.logError(e, Activator.getDefault());
}
}
}
}
}
}
public CatalogSet getCatalogSet() {
return this.catalogSet;
}
/**
* @author Nicolas Guyomar
* Modified by Emmanuelle Rouillé
*/
public Bundle getBundleByResource(final Resource eResource) {
if (eResource == null) {
throw new IllegalArgumentException("The resource cannot be null"); //$NON-NLS-1$
}
if (eResource.getURI().scheme().equals("platform") && eResource.getURI().segment(0).equals("plugin")) { //$NON-NLS-1$//$NON-NLS-2$
return Platform.getBundle(eResource.getURI().segment(1));
}
return this.resourceToBundleMap.get(eResource);
}
public void registerModelDeclaration(final IFile file) throws InvalidFacetSetException {
PluginUtils.register(file, CatalogSetManager.MODEL_DECLARATION_EXTENSION_POINT_ID,
"modeldeclaration"); //$NON-NLS-1$
}
public <T> List<T> getCatalogManagerByType(final Class<? extends T> catalogManagerClass) {
List<T> result = new ArrayList<T>();
for (ICatalogManager catalogManager : this.catalogManagers) {
if (catalogManagerClass.isInstance(catalogManager)) {
@SuppressWarnings("unchecked")
/*
* @SuppressWarnings("unchecked"): gdupe> Checked by the call of
* 'isInstance' in the if statement
*/
final T catalogManager2 = (T) catalogManager;
result.add(catalogManager2);
}
}
return result;
}
public void notifyChanged(final Notification notification) {
// Nothing to do
}
public Notifier getTarget() {
return this.resourceSet;
}
public void setTarget(final Notifier newTarget) {
// Nothing to do
}
public boolean isAdapterForType(final Object type) {
return type == ICatalogSetManager2.class;
}
}