/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.integration;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import de.rcenvironment.core.component.api.DistributedComponentKnowledgeService;
import de.rcenvironment.core.component.integration.IntegrationHistoryDataItem;
import de.rcenvironment.core.component.integration.ToolIntegrationConstants;
import de.rcenvironment.core.component.model.api.ComponentInstallation;
import de.rcenvironment.core.datamodel.api.TypedDatumSerializer;
import de.rcenvironment.core.datamodel.api.TypedDatumService;
import de.rcenvironment.core.gui.datamanagement.browser.spi.CommonHistoryDataItemSubtreeBuilderUtils;
import de.rcenvironment.core.gui.datamanagement.browser.spi.ComponentHistoryDataItemSubtreeBuilder;
import de.rcenvironment.core.gui.datamanagement.browser.spi.DMBrowserNode;
import de.rcenvironment.core.gui.datamanagement.browser.spi.DMBrowserNodeConstants;
import de.rcenvironment.core.gui.datamanagement.browser.spi.DMBrowserNodeType;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
/**
* Implementation of {@link ComponentHistoryDataItemSubtreeBuilder} for the Script component.
*
* @author Sascha Zur
*/
public class IntegrationHistoryDataItemSubtreeBuilder implements ComponentHistoryDataItemSubtreeBuilder {
private static Image defaultIconImage;
private final Map<String, Image> componentIconImageCache = new HashMap<>();
@Override
public String[] getSupportedHistoryDataItemIdentifier() {
return new String[] { ToolIntegrationConstants.STANDARD_COMPONENT_ID_PREFIX.replace(".", "\\.") + ".*" };
}
@Override
public Serializable deserializeHistoryDataItem(ObjectInputStream ois) throws IOException, ClassNotFoundException {
return (Serializable) ois.readObject();
}
@Override
public void buildInitialHistoryDataItemSubtree(Serializable historyDataItem, DMBrowserNode parent) {
ServiceRegistryAccess registryAccess = ServiceRegistry.createAccessFor(this);
TypedDatumSerializer serializer = registryAccess.getService(TypedDatumService.class).getSerializer();
if (historyDataItem instanceof String) {
IntegrationHistoryDataItem historyData;
try {
historyData = IntegrationHistoryDataItem.fromString((String) historyDataItem, serializer, "");
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
CommonHistoryDataItemSubtreeBuilderUtils.buildCommonHistoryDataItemSubtrees(historyData, parent);
if (historyData.getWorkingDirectory() != null) {
for (DMBrowserNode node : parent.getChildren()) {
if (node.getTitle().equals(DMBrowserNodeConstants.NODE_NAME_EXECUTION_LOG)) {
DMBrowserNode.addNewLeafNode("Working directory: " + historyData.getWorkingDirectory(),
DMBrowserNodeType.InformationText, node);
}
}
}
}
}
@Override
public Image getComponentIcon(String identifier) {
if (!componentIconImageCache.containsKey(identifier)) {
byte[] icon = null;
ServiceRegistryAccess serviceRegistryAccess = ServiceRegistry.createAccessFor(this);
DistributedComponentKnowledgeService componentKnowledgeService = serviceRegistryAccess
.getService(DistributedComponentKnowledgeService.class);
Collection<ComponentInstallation> installations = componentKnowledgeService.getCurrentComponentKnowledge()
.getAllInstallations();
for (ComponentInstallation installation : installations) {
if (installation.getInstallationId().startsWith(identifier)) {
icon = installation.getComponentRevision().getComponentInterface().getIcon16();
break;
}
}
if (icon != null) {
componentIconImageCache.put(identifier, ImageDescriptor.createFromImage(new Image(Display.getCurrent(),
new ByteArrayInputStream(icon))).createImage());
}
}
if (componentIconImageCache.containsKey(identifier)) {
return componentIconImageCache.get(identifier);
} else {
if (defaultIconImage == null) {
InputStream inputStream = null;
try {
inputStream = IntegrationHistoryDataItemSubtreeBuilder.class.getResourceAsStream("/resources/icons/tool16.png");
defaultIconImage = ImageDescriptor.createFromImage(new Image(Display.getCurrent(), inputStream)).createImage();
} finally {
IOUtils.closeQuietly(inputStream);
}
}
return defaultIconImage;
}
}
}