/*******************************************************************************
* Copyright (c) 2009, 2010 Progress Software Corporation.
* 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
******************************************************************************/
// Copyright (c) 2009 Progress Software Corporation.
package org.fusesource.tools.message.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.fusesource.tools.message.MessageConstants;
import org.fusesource.tools.message.extensions.IMessageType;
import org.fusesource.tools.message.extensions.IMessageTypeUI;
public class MessageExtensionsMgr {
// IMessageTypeUI Extension Point Constants
public static final String EXTENSION_CLASS = "class";
public static final String EXTENSION_ID = "id";
public static final String EXTENSION_PROVIDERID = "providerid";
public static final String MESSAGE_TYPE = "type";
public static final String MESSAGE_SUPPORTED_FILE_EXTENSION = "supportedFileExtension";
private static MessageExtensionsMgr instance;
private static List<IMessageTypeUI> messageTypeUIExtns = Collections.emptyList();
private static List<IMessageType> messageTypeExtns = Collections.emptyList();
public static MessageExtensionsMgr getInstance() {
if (instance == null) {
instance = new MessageExtensionsMgr();
}
return instance;
}
private MessageExtensionsMgr() {
loadMessageTypeExtensions();
loadMessageTypeUIExtensions();
}
/**
* Returns IMessageType contribution for a message type and provider
*
* @param type
* @return
*/
public IMessageType getMessageTypeExtension(String type, String providerId) {
IMessageType msgTypeContributor = findMessageTypeContributor(type, providerId);
// Check if there are any default contributions for the message type.
if (msgTypeContributor == null) {
msgTypeContributor = findMessageTypeContributor(type, MessageConstants.DEFAULT_PROVIDER);
}
return msgTypeContributor;
}
/**
* Returns IMessageTypeUI contribution for a message type and provider
*
* @param type
* @return
*/
public IMessageTypeUI getMessageTypeUIExtension(String type, String providerID) {
IMessageTypeUI msgTypeUIContributor = findMessageTypeUIContributor(type, providerID);
// Check if there are any default contributions for the message type.
if (msgTypeUIContributor == null) {
msgTypeUIContributor = findMessageTypeUIContributor(type, MessageConstants.DEFAULT_PROVIDER);
}
return msgTypeUIContributor;
}
/**
* Returns IMessageType contribution based on a received message and provider
*
* @param message
* @param providerId
* @return
*/
public IMessageType getMessageTypeExtension(Object message, String providerId) {
if (message == null) {
return null;
}
IMessageType messageTypeCon = findMessageTypeContributor(message, providerId);
if (messageTypeCon == null) {
messageTypeCon = findMessageTypeContributor(message, MessageConstants.DEFAULT_PROVIDER);
}
;
return messageTypeCon;
}
/**
* Returns IMessageTypeUI contribution based on a received message and provider
*
* @param message
* @param providerId
* @return
*/
public IMessageTypeUI getMessageTypeUIExtension(Object message, String providerId) {
if (message == null) {
return null;
}
IMessageTypeUI messageTypeCon = findMessageTypeUIContributor(message, providerId);
if (messageTypeCon == null) {
messageTypeCon = findMessageTypeUIContributor(message, MessageConstants.DEFAULT_PROVIDER);
}
return messageTypeCon;
}
/**
* gives you the list of IMessageTypeUI plug-in extensions
*
* @return List<IMessageTypeUI>
*/
public List<IMessageTypeUI> getMessageTypeUIExtensions() {
return messageTypeUIExtns;
}
/**
* gives you the list of IMessageType plug-in extensions
*
* @return List<IMessageType>
*/
public List<IMessageType> getMessageTypeExtensions() {
return messageTypeExtns;
}
private void loadMessageTypeUIExtensions() {
messageTypeUIExtns = new ArrayList<IMessageTypeUI>();
IConfigurationElement[] extensions = getConfigElements(IMessageTypeUI.MESSAGE_TYPE_UI_EXT_PT);
for (IConfigurationElement extnData : extensions) {
try {
IMessageTypeUI participant = (IMessageTypeUI) extnData.createExecutableExtension(EXTENSION_CLASS);
participant.setProviderId(extnData.getAttribute(EXTENSION_PROVIDERID));
participant.setType(extnData.getAttribute(MESSAGE_TYPE));
messageTypeUIExtns.add(participant);
} catch (CoreException e) {
e.printStackTrace();
}
}
}
private void loadMessageTypeExtensions() {
messageTypeExtns = new ArrayList<IMessageType>();
IConfigurationElement[] extensions = getConfigElements(IMessageType.MESSAGE_TYPE_EXT_PT);
for (IConfigurationElement extnData : extensions) {
try {
IMessageType participant = (IMessageType) extnData.createExecutableExtension(EXTENSION_CLASS);
participant.setProviderId(extnData.getAttribute(EXTENSION_PROVIDERID));
participant.setType(extnData.getAttribute(MESSAGE_TYPE));
participant.setSupportedFileExtension(extnData.getAttribute(MESSAGE_SUPPORTED_FILE_EXTENSION));
messageTypeExtns.add(participant);
} catch (CoreException e) {
e.printStackTrace();
}
}
}
private IConfigurationElement[] getConfigElements(String id) {
IExtensionPoint xp = Platform.getExtensionRegistry().getExtensionPoint(id);
if (xp == null) {
return new IConfigurationElement[0];
}
return xp.getConfigurationElements();
}
private IMessageType findMessageTypeContributor(String type, String providerId) {
for (IMessageType messageType : getMessageTypeExtensions()) {
if (messageType.getType().equals(type) && messageType.getProviderId().equals(providerId)) {
return messageType;
}
}
return null;
}
private IMessageTypeUI findMessageTypeUIContributor(String type, String providerID) {
for (IMessageTypeUI messageTypeUI : getMessageTypeUIExtensions()) {
if (messageTypeUI.getType().equals(type) && messageTypeUI.getProviderId().equalsIgnoreCase(providerID)) {
return messageTypeUI;
}
}
return null;
}
private IMessageType findMessageTypeContributor(Object message, String providerId) {
List<IMessageType> messageTypeExtensions = getMessageTypeExtensions();
for (IMessageType messageType : messageTypeExtensions) {
String id = messageType.getProviderId().trim();
if (messageType.canHandle(message) && id.equals(providerId)) {
return messageType;
}
}
return null;
}
private IMessageTypeUI findMessageTypeUIContributor(Object message, String providerId) {
List<IMessageTypeUI> messageTypeExtensions = getMessageTypeUIExtensions();
for (IMessageTypeUI messageTypeUI : messageTypeExtensions) {
if (messageTypeUI.canHandle(message) && messageTypeUI.getProviderId().equals(providerId)) {
return messageTypeUI;
}
}
return null;
}
}