/*****************************************************************************
* Copyright (c) 2010 Atos Origin.
*
*
* 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:
* Mathieu Velten (Atos Origin) mathieu.velten@atosorigin.com - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.views.documentation;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.papyrus.views.documentation.eannotation.EAnnotationDocumentationManager;
public abstract class DocumentationManagerRegistry implements IDocumentationChangedListener {
// extension point ID
private static final String MODELDOCUMENTATION_EXTENSION_ID = "org.eclipse.papyrus.views.documentation.documentationManager"; //$NON-NLS-1$
private static final String MODELNSURI_ID = "modelNsURI"; //$NON-NLS-1$
private static final String PRIORITY_ID = "priority"; //$NON-NLS-1$
private static final String MODELDOCUMENTATIONCLASS_ID = "managerClass"; //$NON-NLS-1$
// Lowest is default
private static final Integer DEFAULT_PRIORITY = 0;
private Map<String, PriorityQueue<IDocumentationManager>> nsURIDocumentationManagerMap = new HashMap<String, PriorityQueue<IDocumentationManager>>();
private Map<IDocumentationManager, Integer> documentationManagerPriorityMap = new HashMap<IDocumentationManager, Integer>();
private IDocumentationManager eAnnotationDocumentationManager;
public DocumentationManagerRegistry() {
eAnnotationDocumentationManager = EAnnotationDocumentationManager.getInstance();
eAnnotationDocumentationManager.registerDocumentationChangedListener(this);
initializeMap();
}
protected IDocumentationManager getDocumentationManager(String nsURI) {
IDocumentationManager documentationManager = null;
PriorityQueue<IDocumentationManager> documentationManagers = nsURIDocumentationManagerMap.get(nsURI);
if(documentationManagers != null) {
documentationManager = documentationManagers.peek();
}
if(documentationManager == null) {
return eAnnotationDocumentationManager;
}
return documentationManager;
}
private void initializeMap() {
// Reading data from plugins
IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor(MODELDOCUMENTATION_EXTENSION_ID);
for(int i = 0; i < configElements.length; i++) {
initializeOne(configElements[i]);
}
}
private void initializeOne(IConfigurationElement iConfigurationElement) {
try {
String modelNsURI = iConfigurationElement.getAttribute(MODELNSURI_ID);
IDocumentationManager documentationManager = (IDocumentationManager)createExtension(iConfigurationElement, MODELDOCUMENTATIONCLASS_ID);
documentationManager.registerDocumentationChangedListener(this);
String priority = iConfigurationElement.getAttribute(PRIORITY_ID);
documentationManagerPriorityMap.put(documentationManager, convertPriorityToInteger(priority));
PriorityQueue<IDocumentationManager> documentationManagers = nsURIDocumentationManagerMap.get(modelNsURI);
if(documentationManagers == null) {
documentationManagers = new PriorityQueue<IDocumentationManager>(10, new Comparator<IDocumentationManager>() {
public int compare(IDocumentationManager o1, IDocumentationManager o2) {
Integer p1 = documentationManagerPriorityMap.get(o1);
if(p1 == null) {
p1 = DEFAULT_PRIORITY;
}
Integer p2 = documentationManagerPriorityMap.get(o2);
if(p2 == null) {
p2 = DEFAULT_PRIORITY;
}
return p2 - p1;
}
});
nsURIDocumentationManagerMap.put(modelNsURI, documentationManagers);
}
documentationManagers.add(documentationManager);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static Integer convertPriorityToInteger(String priorityString) {
if(priorityString == null) {
return DEFAULT_PRIORITY;
}
if(priorityString.equalsIgnoreCase("Lowest")) { //$NON-NLS-1$
return 0;
}
if(priorityString.equalsIgnoreCase("Low")) { //$NON-NLS-1$
return 1;
}
if(priorityString.equalsIgnoreCase("Medium")) { //$NON-NLS-1$
return 2;
}
if(priorityString.equalsIgnoreCase("High")) { //$NON-NLS-1$
return 3;
}
if(priorityString.equalsIgnoreCase("Highest")) { //$NON-NLS-1$
return 4;
}
return DEFAULT_PRIORITY;
}
/**
* Load an instance of a class
*
* @param element
* the extension point
* @param classAttribute
* the name of the class to load
* @return the loaded Class
* @throws Exception
* if the class is not loaded
*/
private static Object createExtension(final IConfigurationElement element, final String classAttribute) throws Exception {
return element.createExecutableExtension(classAttribute);
}
}