/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.tiglviewer.execution; import java.io.File; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.Platform; import org.osgi.framework.Bundle; import org.osgi.framework.BundleException; import de.rcenvironment.core.component.api.ComponentException; import de.rcenvironment.core.component.datamanagement.api.ComponentDataManagementService; import de.rcenvironment.core.component.execution.api.ComponentContext; import de.rcenvironment.core.component.model.api.LocalExecutionOnly; import de.rcenvironment.core.component.model.spi.DefaultComponent; import de.rcenvironment.core.datamodel.api.TypedDatum; import de.rcenvironment.core.datamodel.types.api.FileReferenceTD; import de.rcenvironment.core.utils.common.TempFileServiceAccess; /** * TiGLViewer RCE component. * * @author Markus Kunde * @author Jan Flink */ @LocalExecutionOnly public class TiglViewerComponent extends DefaultComponent { private static final Log LOG = LogFactory.getLog(TiglViewerComponent.class); private static TiglViewerView view; private ComponentContext componentContext; private ComponentDataManagementService dataManagementService; private File tempFile = null; private boolean firstTime = true; @Override public void setComponentContext(ComponentContext componentContext) { this.componentContext = componentContext; } @Override public void start() throws ComponentException { dataManagementService = componentContext.getService(ComponentDataManagementService.class); // Start TiGLViewer runtime view bundle if GUI is available Bundle guiBundle = Platform.getBundle("de.rcenvironment.components.tiglviewer.gui"); try { if (guiBundle != null && guiBundle.getState() != Bundle.ACTIVE) { LOG.debug("Starting bundle: " + guiBundle); guiBundle.start(); } } catch (BundleException e) { LOG.error("Failed to start bundle: " + guiBundle, e); } } @Override public void processInputs() throws ComponentException { TypedDatum td = componentContext.readInput("TiGL Viewer File"); if (td instanceof FileReferenceTD) { FileReferenceTD inputFile = (FileReferenceTD) td; if (firstTime) { // firstTime logic cannot be done in prepare() because only on this stage filename for temp file is available. // TiGLViewer is aware of incoming filename. try { // since the filename doesn't matter here, we create a random file name tempFile = TempFileServiceAccess.getInstance().createTempFileFromPattern("*.xml"); } catch (IOException e) { throw new ComponentException("Failed to create temporary geometry file required by TiGL Viewer", e); } try { dataManagementService.copyReferenceToLocalFile(inputFile.getFileReference(), tempFile, componentContext.getDefaultStorageNodeId()); } catch (IOException e) { throw new ComponentException("Failed to load geometry file into temporary file used by TiGL Viewer", e); } if (view != null) { view.showView(tempFile); } else { throw new ComponentException("Failed to show geometry in TiGL Viewer - most likely," + " because the TiGL Viewer is not supported on your operating system"); } firstTime = false; } else { try { dataManagementService.copyReferenceToLocalFile(inputFile.getFileReference(), tempFile, componentContext.getDefaultStorageNodeId()); } catch (IOException e) { throw new ComponentException("Failed to update geometry in temporary file used by TiGL Viewer", e); } } componentContext.writeOutput("TiGL Viewer File", td); } } /** * Injects the TiGL Viewer runtime view. * * @param newView The runtime view. */ public static synchronized void setRuntimeView(TiglViewerView newView) { if (view != null) { LogFactory.getLog(TiglViewerComponent.class).warn("Tried to set TiGL Viewer Runtime View (" + newView + ")" + " when one is already configured: " + view); } view = newView; } }