diff -r 000000000000 -r 522a326673b6 sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/builder/Builder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/builder/Builder.java Thu Mar 11 19:08:43 2010 +0200 @@ -0,0 +1,282 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +package com.symbian.smt.gui.builder; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.IScopeContext; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.FileEditorInput; + +import com.symbian.smt.gui.Activator; +import com.symbian.smt.gui.ChangeManager; +import com.symbian.smt.gui.Logger; +import com.symbian.smt.gui.ManageResources; +import com.symbian.smt.gui.PersistentDataStore; +import com.symbian.smt.gui.editors.svgeditor.SVGEditor; +import com.symbian.smt.gui.views.ConsoleOutput; + +public class Builder extends IncrementalProjectBuilder { + final static String TEMP_FOLDER = ".svg_temp"; // Folder names stating with + // a . will not be displayed + // in the project navigator + + private IFolder svgTempFolder; + private IFile projectFile; + + private List markedResources; + + private void addFileToProject() { + // Adds the file to the root of the project folder + try { + // Refresh the project so that it picks up the generated SVG file + getProject().refreshLocal(IResource.DEPTH_INFINITE, null); + + // Set the file as a derived resource (indicates was built from + // source and not an original file) + projectFile.setDerived(true); + } catch (CoreException e) { + Logger.log(e.getMessage(), e); + } + } + + @SuppressWarnings("unchecked") + @Override + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) + throws CoreException { + + IProject project = getProject(); + + if (!checkSMGinstalled()) { + writeToConsoleOutput("ERROR: Unable to locate the System Model Generator"); + return null; + } + + project.touch(null); + + // First we check that project is in sync with the file system + findResourcesMarkedAsUrl(project); + + if (markedResources.size() == 0) { + if (!project.isSynchronized(IResource.DEPTH_INFINITE)) { + writeToConsoleOutput("ERROR: The project is out of sync with the file system"); + return null; + } + } else { + boolean isSynchronised = checkSyncrhonised(project); + + if (!isSynchronised) { + writeToConsoleOutput("ERROR: The project is out of sync with the file system"); + return null; + } + } + + IResourceDelta delta = getDelta(project); + ChangeManager manager = new ChangeManager(); + + manager.handleDelta(delta, project); + + if (!manager.needsBuilding(project)) { + return null; + } + + manager.reset(project); + + // We are not interested in different build types are we are only able + // to perform one type of build using the Perl SMG + + svgTempFolder = project.getFolder(TEMP_FOLDER); + + // Delete generated temp files + if (svgTempFolder.exists()) { + svgTempFolder.delete(true, null); + } + + // Build + performBuild(); + + return null; + } + + private boolean checkSyncrhonised(IResource resource) { + boolean result = true; + + if (resource instanceof IFile) { + if (markedResources.contains(resource)) { + result = true; + } else { + result = resource.isSynchronized(IResource.DEPTH_ZERO); + } + } else if (resource instanceof IContainer) { // It is either IProject or + // IFolder + IContainer container = (IContainer) resource; + + try { + IResource[] children = container.members(); + + for (IResource child : children) { + result = checkSyncrhonised(child); + + if (!result) { + break; + } + } + } catch (CoreException e) { + Logger.log(e.getMessage(), e); + result = false; + } + } + + return result; + } + + private void findResourcesMarkedAsUrl(IProject project) + throws CoreException { + IMarker[] messageMarkers = project.findMarkers(IMarker.TASK, false, + IResource.DEPTH_INFINITE); + markedResources = new ArrayList(); + + for (int i = 0; i < messageMarkers.length; i++) { + IMarker marker = messageMarkers[i]; + + if (marker.getAttribute(ManageResources.IS_URL, false)) { + markedResources.add(marker.getResource()); + } + } + } + + private void performBuild() { + // Reset the command output window + Display.getDefault().asyncExec(new Runnable() { + public void run() { + ConsoleOutput.reset(); + } + }); + + // Create a processBuilder. This will run the SMT in another thread. + SMTCommand command = new SMTCommand(getProject()); + List generatedCommand = command.generateCommand(); + + if (generatedCommand == null) { + return; + } + + SMTProcess process = new SMTProcess(); + + // Run the process + int exitCode = process.run(generatedCommand); + + if (exitCode == 0) { + IScopeContext projectScope = new ProjectScope(getProject()); + IEclipsePreferences projectNode = projectScope + .getNode(Activator.PLUGIN_ID); + PersistentDataStore projectStore = new PersistentDataStore( + projectNode); + + projectFile = getProject() + .getFile(projectStore.getOutputFilename()); + + // Add the SVG file to the project + addFileToProject(); + + // Inform the user that the model has been created + writeToConsoleOutput("Finished"); + + // Open the file in the editor + Display.getDefault().asyncExec(new Runnable() { + public void run() { + try { + IWorkbenchPage page = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getActivePage(); + + IEditorPart part = page.findEditor(new FileEditorInput( + projectFile)); + if (part != null && part instanceof SVGEditor) { + page.openEditor(new FileEditorInput(projectFile), + SVGEditor.ID); + ((SVGEditor) part).refresh(); + } else { + page.openEditor(new FileEditorInput(projectFile), + SVGEditor.ID); + } + } catch (PartInitException e) { + Logger.log(e.getMessage(), e); + } + } + }); + } else { + writeToConsoleOutput("Exit Code: " + exitCode); + + // Add the output to the Eclipse log + Display.getDefault().asyncExec(new Runnable() { + public void run() { + Exception e = new Exception(ConsoleOutput.getText()); + Logger + .log( + "Failed to successfully generate System Model diagram", + e); + } + }); + + writeToConsoleOutput("ERROR: Failed to successfully generate System Model diagram"); + } + } + + private boolean checkSMGinstalled() { + + final ResourceBundle resourceBundle = ResourceBundle.getBundle( + "location", Locale.getDefault(), this.getClass() + .getClassLoader()); + + String smgFolder = resourceBundle.getString("location"); + + File smgCommand = new File(smgFolder + File.separator + "SysModGen.pl"); + + return smgCommand.exists(); + } + + private void writeToConsoleOutput(final String string) { + // Writes a string to the console output view + + Display.getDefault().asyncExec(new Runnable() { + public void run() { + ConsoleOutput.addText(string); + } + }); + } + +}