/*******************************************************************************
* Copyright (c) 2009 Conselleria de Infraestructuras y Transporte, Generalitat
* de la Comunitat Valenciana . 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: Francisco Javier Cano Muñoz (Prodevelop) – Initial implementation
*
******************************************************************************/
package org.eclipse.papyrus.uml.diagram.common.providers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.papyrus.uml.diagram.common.util.ExtensionPointParser;
import org.eclipse.papyrus.uml.diagram.common.util.MDTUtil;
import org.eclipse.ui.IEditorPart;
/**
* A registry that stores IMOSKittEditorFactories as defined in the
* 'es.cv.gvcase.mdt.common.moskittEditorFactories' extension point. <br>
* It can provide IEditorParts for Diagrams, EObjects or editor identifiers.
*
* @author <a href="mailto:fjcano@prodevelop.es>Francisco Javier Cano Muñoz</a>
*
*/
public class MOSKittEditorFactoryRegistry {
// // Singleton
private static final MOSKittEditorFactoryRegistry INSTANCE = new MOSKittEditorFactoryRegistry();
private MOSKittEditorFactoryRegistry() {
}
// @unused
public static final MOSKittEditorFactoryRegistry getInstance() {
return INSTANCE;
}
// // Maps
private static Map<String, IMOSKittEditorFactory> mapEditorID2Factory = null;
private static Map<String, IMOSKittEditorFactory> mapEClass2Factory = null;
private static Map<String, IMOSKittEditorFactory> mapModel2Factory = null;
protected static Map<String, IMOSKittEditorFactory> getMapEditorID2Factory() {
if(mapEditorID2Factory == null) {
mapEditorID2Factory = new HashMap<String, IMOSKittEditorFactory>();
}
return mapEditorID2Factory;
}
protected static Map<String, IMOSKittEditorFactory> getMapEClass2Factory() {
if(mapEClass2Factory == null) {
mapEClass2Factory = new HashMap<String, IMOSKittEditorFactory>();
}
return mapEClass2Factory;
}
protected static Map<String, IMOSKittEditorFactory> getMapModel2Factory() {
if(mapModel2Factory == null) {
mapModel2Factory = new HashMap<String, IMOSKittEditorFactory>();
}
return mapModel2Factory;
}
// // getter methods
// @unused
public IEditorPart getEditorFor(Object object) {
if(object == null) {
return null;
}
// check Diagram
Diagram diagram = (Diagram)Platform.getAdapterManager().getAdapter(object, Diagram.class);
if(diagram != null) {
return getEditorForDiagram(diagram);
}
// check EObject's EClass
EObject eObject = (EObject)Platform.getAdapterManager().getAdapter(object, EObject.class);
if(eObject != null) {
return getEditorForEObject(eObject);
}
// check editorID
String editorID = (String)Platform.getAdapterManager().getAdapter(object, String.class);
if(editorID != null) {
return getEditorForEditorID(editorID);
}
// no editor fot object
return null;
}
public IEditorPart getEditorForEditorID(String editorID) {
if(editorID == null) {
return null;
}
readExtensionPoint();
if(getMapEditorID2Factory().containsKey(editorID)) {
IMOSKittEditorFactory factory = getMapEditorID2Factory().get(editorID);
if(factory != null) {
return factory.createEditorFor(editorID);
}
}
return null;
}
public IEditorPart getEditorForEObject(EObject eObject) {
if(eObject == null) {
return null;
}
readExtensionPoint();
Class eObjectClass = eObject.getClass();
// check for every EClass registered if any of them is a superclass of
// the given object.
for(String eClass : getMapEClass2Factory().keySet()) {
if(MDTUtil.isOfType(eObjectClass, eClass)) {
IMOSKittEditorFactory factory = getMapEClass2Factory().get(eClass);
if(factory != null) {
return factory.createEditorFor(eObject);
}
}
}
return null;
}
public IEditorPart getEditorForDiagram(Diagram diagram) {
if(diagram == null || diagram.getType() == null) {
return null;
}
readExtensionPoint();
if(getMapModel2Factory().containsKey(diagram.getType())) {
IMOSKittEditorFactory factory = getMapModel2Factory().get(diagram.getType());
if(factory != null) {
return factory.createEditorFor(diagram);
}
}
return null;
}
// // read extension Point
private static final String ExtensionPointID = "org.eclipse.papyrus.uml.diagram.common.moskittEditorFactory";
protected void readExtensionPoint() {
ExtensionPointParser parser = new ExtensionPointParser(ExtensionPointID, new Class[]{ MOSKittEditorFactory.class });
MOSKittEditorFactory factory = null;
List<MOSKittEditorFactory> factories = new ArrayList<MOSKittEditorFactory>();
// parse extension point
for(Object object : parser.parseExtensionPoint()) {
factory = (MOSKittEditorFactory)Platform.getAdapterManager().getAdapter(object, MOSKittEditorFactory.class);
if(factory != null) {
factories.add(factory);
}
}
// store all factories in the mappings
for(MOSKittEditorFactory editorFactoryElement : factories) {
IMOSKittEditorFactory editorFactory = null;
if(editorFactoryElement.factory != null) {
editorFactory = (IMOSKittEditorFactory)Platform.getAdapterManager().getAdapter(editorFactoryElement.factory, IMOSKittEditorFactory.class);
if(editorFactory != null) {
if(editorFactoryElement.diagramType != null) {
getMapModel2Factory().put(editorFactoryElement.diagramType, editorFactory);
}
if(editorFactoryElement.eClass != null) {
getMapEClass2Factory().put(editorFactoryElement.eClass, editorFactory);
}
if(editorFactoryElement.editorID != null) {
getMapEditorID2Factory().put(editorFactoryElement.editorID, editorFactory);
}
}
}
}
}
}