/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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. * */ package gov.redhawk.diagram; import gov.redhawk.diagram.editor.URIEditorInputProxy; import gov.redhawk.sca.efs.ScaFileSystemPlugin; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import mil.jpeojtrs.sca.util.ScaResourceFactoryUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.emf.common.ui.URIEditorInput; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gmf.runtime.diagram.core.services.ViewService; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.ui.IEditorInput; /** * @since 3.0 */ public final class DiagramUtil { private DiagramUtil() { } /** * */ public static void initializeDiagramResource(final IDiagramUtilHelper options, final URI diagramURI, final Resource sadResource) throws IOException, CoreException { if (diagramURI.isPlatform()) { final IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(diagramURI.toPlatformString(true))); file.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor()); if (!file.exists()) { final IWorkspaceRunnable operation = new IWorkspaceRunnable() { @Override public void run(final IProgressMonitor monitor) throws CoreException { final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try { DiagramUtil.populateDiagram(options, diagramURI, sadResource, buffer); } catch (final IOException e) { // PASS } file.create(new ByteArrayInputStream(buffer.toByteArray()), true, monitor); } }; final ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRuleFactory().createRule(file); ResourcesPlugin.getWorkspace().run(operation, rule, 0, null); } } else { DiagramUtil.populateDiagram(options, diagramURI, sadResource, null); } } private static void populateDiagram(final IDiagramUtilHelper options, final URI diagramURI, final Resource resource, final OutputStream buffer) throws IOException { // Create a resource set // final ResourceSet resourceSet = ScaResourceFactoryUtil.createResourceSet(); // Create a resource for this file. // final Resource diagramResource = resourceSet.createResource(diagramURI); final String diagramName = diagramURI.lastSegment(); final EObject obj = options.getRootDiagramObject(resource); final Diagram diagram = ViewService.createDiagram(obj, options.getModelId(), options.getDiagramPreferencesHint()); if (diagram != null) { diagram.setName(diagramName); diagram.setElement(obj); diagramResource.getContents().add(diagram); if (buffer != null) { diagramResource.save(buffer, options.getSaveOptions()); } else { diagramResource.save(options.getSaveOptions()); } } } public static IEditorInput getDiagramWrappedInput(final URI diagramURI, final TransactionalEditingDomain editingDomaing) { return new URIEditorInputProxy(new URIEditorInput(diagramURI), editingDomaing); } public static URI getDiagramResourceURI(final IDiagramUtilHelper options, final Resource resource) throws IOException { if (resource != null) { final URI uri = resource.getURI(); if (uri.isPlatformResource()) { final IFile file = options.getResource(resource); return DiagramUtil.getRelativeDiagramResourceURI(options, file); } else { return DiagramUtil.getTemporaryDiagramResourceURI(options, uri); } } return null; } /** * Initialize sad diagram. * * @param b * @throws IOException */ private static URI getTemporaryDiagramResourceURI(final IDiagramUtilHelper options, final URI uri) throws IOException { final String name = uri.lastSegment(); String tmpName = "rh_" + name.substring(0, name.length() - options.getSemanticFileExtension().length()); File tempDir = ScaFileSystemPlugin.getDefault().getTempDirectory(); final File tempFile = File.createTempFile(tmpName, options.getDiagramFileExtension(), tempDir); tempFile.deleteOnExit(); final URI retVal = URI.createURI(tempFile.toURI().toString()); return retVal; } /** * Initialize sad diagram. * * @param b */ private static URI getRelativeDiagramResourceURI(final IDiagramUtilHelper options, final IFile file) { final IFile diagramFile = file.getParent() .getFile( new Path(file.getName().substring(0, file.getName().length() - options.getSemanticFileExtension().length()) + options.getDiagramFileExtension())); final URI uri = URI.createPlatformResourceURI(diagramFile.getFullPath().toString(), true); return uri; } /** * * @param resource * @return * @since 4.0 */ public static boolean isDiagramLocalSandbox(final Resource resource) { return "LocalSca.sad.xml".equals(resource.getURI().lastSegment()); } }