package com.isencia.passerelle.editor.common.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ptolemy.kernel.util.Attribute;
import ptolemy.kernel.util.IllegalActionException;
import ptolemy.kernel.util.Locatable;
import ptolemy.kernel.util.Location;
import ptolemy.kernel.util.NameDuplicationException;
import ptolemy.kernel.util.NamedObj;
import com.isencia.passerelle.editor.common.activator.Activator;
import com.isencia.passerelle.editor.common.utils.EditorUtils;
import com.isencia.passerelle.model.Flow;
import com.isencia.passerelle.project.repository.api.MetaData;
import com.isencia.passerelle.project.repository.api.RepositoryService;
public class PaletteBuilder implements Serializable {
private static final long serialVersionUID = 5998773152255762310L;
private static Logger logger = LoggerFactory.getLogger(PaletteBuilder.class);
public static final String UTILITIES = "com.isencia.passerelle.actor.actorgroup.utilities";
public static final String SUBMODELS = "com.isencia.passerelle.actor.actorgroup.submodels";
List<PaletteGroup> paletteGroups;
List<PaletteGroup> editablePaletteGroups;
private Map<String, String> actorBundleMap = new HashMap<String, String>();
public String getBuildId(String className) {
return actorBundleMap.get(className);
}
private boolean rerender = false;
public boolean isRerender() {
return rerender;
}
public void setRerender(boolean rerender) {
this.rerender = rerender;
}
public List<PaletteGroup> getPaletteGroups() {
return paletteGroups;
}
public List<PaletteGroup> getRootPaletteGroups() {
List<PaletteGroup> groups = new ArrayList<PaletteGroup>();
for (PaletteGroup group : paletteGroups) {
if (group.getParent() == null) {
groups.add(group);
}
}
return groups;
}
public List<PaletteGroup> getEditablePaletteGroups() {
if (editablePaletteGroups == null) {
editablePaletteGroups = new ArrayList<PaletteGroup>();
for (PaletteGroup group : paletteGroups) {
if (!UTILITIES.equals(group.getId()) && !SUBMODELS.equals(group.getId()) && group.getParent() == null && group.isAuthorized()) {
editablePaletteGroups.add(group);
}
}
}
return editablePaletteGroups;
}
public PaletteBuilder() {
super();
paletteGroups = createCategories();
}
protected Map<String, PaletteGroup> groups;
protected Map<String, PaletteItemDefinition> paletteItemMap;
public PaletteItemDefinition getPaletteItem(String clazz) {
return paletteItemMap.get(clazz);
}
public PaletteGroup getPaletteGroup(String id) {
return groups.get(id);
}
public PaletteItemDefinition getPaletteItem(String groupName, String id) {
if (groupName == null) {
for (Map.Entry<String, PaletteGroup> entry : groups.entrySet()) {
PaletteGroup group = entry.getValue();
PaletteItemDefinition def = group.getPaletteItem(id);
if (def != null) {
return def;
}
}
}
PaletteGroup group = groups.get(groupName);
if (group == null) {
return null;
}
return group.getPaletteItem(id);
}
/**
* An ImageDescriptor is often returned.
* @param clazzName
* @return
*/
public Object getIcon(String clazzName) {
if (Flow.class.getName().equals(clazzName)) {
if (submodelDefinition != null) {
return submodelDefinition.getIcon();
}
}
PaletteItemDefinition itemDefinition = getPaletteItem(clazzName);
if (itemDefinition != null) {
return itemDefinition.getIcon();
}
return newDefaultIdeIcon();
}
protected Object newDefaultIdeIcon() {
return null;
}
public String getType(String clazzName) {
PaletteItemDefinition itemDefinition = getPaletteItem(clazzName);
if (itemDefinition != null) {
return itemDefinition.getName();
}
Class clazz = EditorUtils.loadClass(clazzName);
if (clazz != null) {
return clazz.getSimpleName();
}
return clazzName;
}
protected PaletteItemDefinition submodelDefinition = null;
protected PaletteGroup submodels = null;
public List<PaletteGroup> createCategories() {
List<PaletteGroup> actorGroups = new ArrayList<PaletteGroup>();
Object folderIcon = newDefaultFolderIcon();
groups = new HashMap<String, PaletteGroup>();
paletteItemMap = new HashMap<String, PaletteItemDefinition>();
try {
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("com.isencia.passerelle.engine.actorGroups");
if (config != null) {
for (IConfigurationElement configurationElement : config) {
String idAttribute = configurationElement.getAttribute("id");
// if (visibleTreeNodes == null
// || visibleTreeNodes.contains(idAttribute)) {
String nameAttribute = configurationElement.getAttribute("name");
String parentAttribute = configurationElement.getAttribute("parent");
String priorityAttribute = configurationElement.getAttribute("priority");
String expandedAttribute = configurationElement.getAttribute("open");
String iconAttribute = configurationElement.getAttribute("icon");
String iconLocationAttribute = configurationElement.getAttribute("iconClass");
String featureAttribute = configurationElement.getAttribute("features");
final String bundleId = configurationElement.getDeclaringExtension().getContributor().getName();
Object icon = null;
try {
icon = createIcon(folderIcon, iconLocationAttribute, iconAttribute, bundleId);
} catch (NoClassDefFoundError e) {
icon = createIcon(null, iconLocationAttribute, iconAttribute, bundleId);
}
PaletteGroup e = new PaletteGroup(idAttribute, nameAttribute, parentAttribute);
if (priorityAttribute != null) {
try {
e.setPriority(Integer.parseInt(priorityAttribute));
} catch (Exception e2) {
logger.error("Item with id " + idAttribute + " has a priority which is not a valid Integer " + priorityAttribute);
}
}
if (e.getParent() == null && !StringUtils.isEmpty(featureAttribute)) {
e.setAuthorized(false);
try {
String[] features = featureAttribute.split(",");
for (String feature : features) {
if (checkPermission(feature)) {
e.setAuthorized(true);
break;
}
}
} catch (Exception exp) {
e.setAuthorized(true);
}
}
if (expandedAttribute != null) {
try {
e.setExpanded(Boolean.valueOf(expandedAttribute));
} catch (Exception e2) {
}
}
e.setIcon(icon);
actorGroups.add(e);
groups.put(e.getId(), e);
}
}
// }
for (PaletteGroup group : groups.values()) {
group.init(this);
}
Collections.sort(actorGroups);
} catch (Exception e) {
e.printStackTrace();
}
submodels = getSubModelGroup();
// Find all Actors and add them to the corresponding container
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("com.isencia.passerelle.engine.actors");
if (config != null) {
for (IConfigurationElement configurationElement : config) {
String groupAttribute = configurationElement.getAttribute("group");
String[] parents = groupAttribute.split(",");
for (String parent : parents) {
PaletteGroup group = groups.get(parent);
if (group != null) {
String nameAttribute = configurationElement.getAttribute("name");
String colorAttribute = configurationElement.getAttribute("color");
String idAttribute = configurationElement.getAttribute("id");
String iconAttribute = configurationElement.getAttribute("icon");
String priorityAttribute = configurationElement.getAttribute("priority");
String iconLocationAttribute = configurationElement.getAttribute("iconClass");
final String bundleId = configurationElement.getDeclaringExtension().getContributor().getName();
Object icon = createIcon(null, iconLocationAttribute, iconAttribute, bundleId);
if (group != null && submodels != null && submodels.getId().equals(group.getId())) {
submodelDefinition = new PaletteItemDefinition(icon, null, idAttribute, nameAttribute, colorAttribute, Flow.class, null, 0);
} else {
final Class<?> clazz = loadClass(configurationElement, bundleId);
if (clazz != null && group != null) {
int priority = 0;
if (priorityAttribute != null) {
try {
priority = Integer.parseInt(priorityAttribute);
} catch (Exception e) {
}
}
PaletteItemDefinition item = new PaletteItemDefinition(icon, group, idAttribute, nameAttribute, colorAttribute, clazz, bundleId, priority);
item.setHelpUrl(generateHelpUrl(item));
actorBundleMap.put(clazz.getName(), bundleId);
paletteItemMap.put(item.getClazz().getName(), item);
}
}
}
}
}
}
try {
RepositoryService repositoryService = Activator.getDefault().getRepositoryService();
for (MetaData metaData : repositoryService.getAllSubmodelMetaData()) {
PaletteGroup group = getPaletteGroup(actorGroups, groups, metaData.getPath(), submodels);
SubModelPaletteItemDefinition item = addSubModel(submodelDefinition, group, metaData.getCode());
if (group != null) {
group.addPaletteItem(item);
}
}
} catch (Exception e) {
// logError(e);
}
return actorGroups;
}
protected String generateHelpUrl(PaletteItemDefinition item) {
return null;
}
public String getHelpUrl(String clazzName) {
PaletteItemDefinition itemDefinition = getPaletteItem(clazzName);
if (itemDefinition != null) {
return itemDefinition.getHelpUrl();
}
return null;
}
public PaletteGroup getPaletteGroup(List<PaletteGroup> groups, Map<String, PaletteGroup> groupMap, String path, PaletteGroup parent) {
if (path == null) {
return parent;
}
String id = parent.getId() + "/" + path;
if (groupMap.containsKey(id)) {
return groupMap.get(id);
}
PaletteGroup paletteGroup = new PaletteGroup(id, path, parent.getId());
paletteGroup.setParent(parent);
groupMap.put(id, paletteGroup);
groups.add(paletteGroup);
parent.addChild(paletteGroup);
return paletteGroup;
}
public PaletteGroup getSubModelGroup() {
return groups.get(SUBMODELS);
}
protected Object newDefaultFolderIcon() {
return null;
}
protected boolean checkPermission(String feature) {
return true;
}
public SubModelPaletteItemDefinition addSubModel(PaletteItemDefinition sd, PaletteGroup gr, String name) {
PaletteGroup group = gr;
PaletteItemDefinition submodelDef = sd;
if (submodelDef == null) {
submodelDef = submodelDefinition;
}
if (group == null) {
group = submodels;
}
SubModelPaletteItemDefinition item = new SubModelPaletteItemDefinition(submodelDef != null ? submodelDef.getIcon() : null, group, name, name,
submodelDef != null ? submodelDef.getColor() : null);
return item;
}
/**
* @param iconClazzAttribute
* @param iconAttribute
* @param bundleId
* @return
*/
protected Object createIcon(Object defaultIcon, String iconClazzAttribute, String iconAttribute, final String bundleId) {
return defaultIcon;
}
public Class<?> loadClass(final IConfigurationElement configurationElement, final String bundleId) {
String className = configurationElement.getAttribute("class");
return EditorUtils.loadClass(className);
}
protected Class loadClassFromBundleId(final String bundleId, String iconClazz) throws ClassNotFoundException {
Bundle bundle = Platform.getBundle(bundleId);
Class dummy = bundle.loadClass(iconClazz);
return dummy;
}
@SuppressWarnings("unchecked")
public static void setLocation(NamedObj model, double[] location) {
if (model instanceof Locatable) {
try {
((Locatable) model).setLocation(location);
NamedObj cont = model.getContainer();
cont.attributeChanged((Attribute) model);
} catch (IllegalActionException e) {
}
}
List<Attribute> attributes = model.attributeList(Locatable.class);
if (attributes == null) {
return;
}
if (attributes.size() > 0) {
Locatable locationAttribute = (Locatable) attributes.get(0);
try {
locationAttribute.setLocation(location);
model.attributeChanged(attributes.get(0));
} catch (IllegalActionException e) {
}
} else {
try {
new Location(model, "_location").setLocation(location);
} catch (IllegalActionException e) {
} catch (NameDuplicationException e) {
}
}
}
public static boolean isSubModelGroup(PaletteGroup group) {
return group != null && group.getName().equals(SUBMODELS);
}
public void logError(Exception e) {
}
}