From d53ce571fc2977bcca2d714a7d19a00b42249780 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sun, 4 Mar 2018 02:12:52 -0500 Subject: Consoles --- .../META-INF/MANIFEST.MF | 5 +- .../execution/GenerationTaskExecutor.xtend | 32 +++- .../application/execution/ScriptConsole.xtend | 176 ++++++++++++++------- .../model/statistics/StatisticSections2CSV.xtend | 4 +- 4 files changed, 147 insertions(+), 70 deletions(-) diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/META-INF/MANIFEST.MF b/Application/hu.bme.mit.inf.dslreasoner.application/META-INF/MANIFEST.MF index d0ce91c4..b2b0b963 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/META-INF/MANIFEST.MF +++ b/Application/hu.bme.mit.inf.dslreasoner.application/META-INF/MANIFEST.MF @@ -30,7 +30,10 @@ Require-Bundle: org.eclipse.xtext, org.eclipse.emf.codegen;bundle-version="2.11.0", org.eclipse.viatra.query.tooling.core;bundle-version="2.0.0", hu.bme.mit.inf.dslreasoner.visualisation;bundle-version="1.0.0", - org.eclipse.core.runtime;bundle-version="3.12.0" + org.eclipse.core.runtime;bundle-version="3.12.0", + org.eclipse.ui.console;bundle-version="3.6.201", + org.eclipse.jface;bundle-version="3.12.2", + org.eclipse.ui;bundle-version="3.108.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: hu.bme.mit.inf.dslreasoner.application, hu.bme.mit.inf.dslreasoner.application.applicationConfiguration, diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend index 9ffd33c5..05d4e0c0 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend @@ -16,12 +16,14 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml -import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualisation; +import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualisation import hu.bme.mit.inf.dslreasoner.workspace.ProjectWorkspace import java.util.Optional -import org.eclipse.emf.common.util.URI import org.eclipse.core.runtime.IProgressMonitor -import hu.bme.mit.inf.dslreasoner.logic.model.builder.SolverProgressMonitor +import org.eclipse.emf.common.util.URI +import java.util.LinkedHashMap +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript +import hu.bme.mit.inf.dslreasoner.logic.model.statistics.StatisticSections2CSV class GenerationTaskExecutor { val metamodelLoader = new MetamodelLoader @@ -29,6 +31,7 @@ class GenerationTaskExecutor { val queryLoader = new QueryLoader val solverLoader = new SolverLoader val scopeLoader = new ScopeLoader + val statisticsUtil = new StatisticSections2CSV val metamodelValidator = new MetamodelValidator val queryAndMetamodelValidator = new QueryAndMetamodelValidator @@ -57,7 +60,7 @@ class GenerationTaskExecutor { val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) // 2. create console - val console = new ScriptConsole(true,true, + val console = new ScriptConsole(false,true,false, if(messageFile!==null) URI.createURI(messageFile.path) else null, if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null @@ -98,6 +101,7 @@ class GenerationTaskExecutor { // 4. translate all description to a logic problem monitor.subTask('''Translating all resources to logic''') + var domain2LogicTransformationTime = System.nanoTime val Ecore2Logic ecore2Logic = new Ecore2Logic val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic) val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) @@ -118,6 +122,7 @@ class GenerationTaskExecutor { new Viatra2LogicConfiguration ).output } + domain2LogicTransformationTime = System.nanoTime-domain2LogicTransformationTime if(documentationLevel.atLeastNormal) { reasonerWorkspace.writeModel(problem,"generation.logicproblem") } @@ -161,7 +166,7 @@ class GenerationTaskExecutor { solverLoader.setRunIndex(solverConfig,configurationMap,run,console) solverConfig.progressMonitor = new EclipseProgressMonitor(monitor) val reasonerWorkspaceForRun = if(runs > 1) { - reasonerWorkspace.subWorkspace('''run«run»''',"") => [init] + reasonerWorkspace.subWorkspace('''run«run»''',"") => [initAndClear] } else { reasonerWorkspace } @@ -171,6 +176,8 @@ class GenerationTaskExecutor { console.writeMessage(solution.soutionDescription.toString) // 8. Solution processing + + // 8.1 Visualisation if(solution instanceof ModelResult) { val interpretations = solver.getInterpretations(solution) val outputWorkspaceForRun = if(runs > 1) { @@ -180,7 +187,7 @@ class GenerationTaskExecutor { } for(interpretationIndex : 0..0» «run»/«runs»«ENDIF»: Visualising solution «interpretationIndex»/«interpretations.size»''') + monitor.subTask('''Solving problem«IF runs>0» «run»/«runs»«ENDIF»: Visualising solution «interpretationIndex+1»/«interpretations.size»''') val interpretation = interpretations.get(interpretationIndex) val model = logic2Ecore.transformInterpretation(interpretation,modelGeneration.trace) outputWorkspaceForRun.writeModel(model,'''model«IF runs>1»_«run»«ENDIF»_«interpretationIndex+1».xmi''') @@ -202,7 +209,20 @@ class GenerationTaskExecutor { monitor.worked(solverConfig.solutionScope.numberOfRequiredSolution*100) } + // 8.2 Statistics + val statistics = new LinkedHashMap + statistics.put("Task",(task.eContainer as ConfigurationScript).commands.indexOf(task)+1) + statistics.put("Run",run) + statistics.put("Result",solution.class.simpleName) + statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000) + statistics.put("Logic to solver transformation time",solution.statistics.transformationTime) + statistics.put("Solver time",solution.statistics.solverTime) + for(entry: solution.statistics.entries) { + statistics.put(entry.name,statisticsUtil.readValue(entry)) + } + console.addStatistics(statistics) } + console.flushStatistics console.writeMessage("Model generation finished") } catch(Exception e) { console.writeError('''Error occured: «e.message»''') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend index 2dc329a0..4bf58c67 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend @@ -1,24 +1,38 @@ package hu.bme.mit.inf.dslreasoner.application.execution -import java.io.File -import java.io.PrintWriter +import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace +import hu.bme.mit.inf.dslreasoner.workspace.ProjectWorkspace +import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace +import java.util.LinkedHashMap import java.util.LinkedHashSet import java.util.LinkedList import java.util.Map import org.eclipse.emf.common.util.URI -import java.io.Closeable -import java.io.IOException -import java.util.LinkedHashMap -import java.util.HashMap +import org.eclipse.ui.IWorkbench +import org.eclipse.ui.IWorkbenchPage +import org.eclipse.ui.IWorkbenchWindow +import org.eclipse.ui.PlatformUI +import org.eclipse.ui.console.ConsolePlugin +import org.eclipse.ui.console.IConsoleConstants +import org.eclipse.ui.console.IConsoleView +import org.eclipse.ui.console.MessageConsole +import java.util.List -class ScriptConsole implements Closeable { +//import org.eclipse.ui.console.MessageConsole + +class ScriptConsole { + /** + * Console is identified with the name of this class. + */ + val final consoleID = ScriptConsole.name val boolean printToConsole - val boolean cleanFiles - - val File messageConsoleFile - val File errorConsoleFile - val File statisticsConsoleFile - val Map file2Writer = new HashMap + val MessageConsole runtimeConsole; + val ReasonerWorkspace messageWorkspace; + val String messageFileName; + val ReasonerWorkspace errorWorkspace; + val String errorFileName; + val ReasonerWorkspace statisticsWorkspace; + val String statisticsFileName; val statisticsHeaderBuffer = new LinkedHashSet val statisticsDataBuffer = new LinkedList> @@ -28,29 +42,58 @@ class ScriptConsole implements Closeable { public new( boolean printToConsole, + boolean printToRuntimeConsole, boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, URI statisticsConsoleURI) { + val List errorMessagesDuringInitialisation = new LinkedList + + this.messageWorkspace = prepareWorkspace(messageConsoleURI,errorMessagesDuringInitialisation) + this.messageFileName = prepareFileName(messageConsoleURI) + this.errorWorkspace = prepareWorkspace(errorConsoleURI,errorMessagesDuringInitialisation) + this.errorFileName = prepareFileName(errorConsoleURI) + this.statisticsWorkspace = prepareWorkspace(statisticsConsoleURI,errorMessagesDuringInitialisation) + this.statisticsFileName = prepareFileName(statisticsConsoleURI) + this.printToConsole = printToConsole - this.cleanFiles = cleanFiles - this.messageConsoleFile = messageConsoleURI.prepareFile - this.errorConsoleFile = errorConsoleURI.prepareFile - this.statisticsConsoleFile = statisticsConsoleURI.prepareFile + this.runtimeConsole = if(printToRuntimeConsole) { prepareRuntimeConsole } else { null } + + errorMessagesDuringInitialisation.forEach[ + this.writeError('''Error during console initialisation: "«it»"''') + ] } public def writeMessage(String message) { - messageConsoleFile.writeToFile(message) + if(messageWorkspace!=null) { + messageWorkspace.writeText(messageFileName,message); + } + if(printToConsole) { + println(message) + } + if(runtimeConsole!==null) { + this.writeToRuntimeConsole(message) + } } public def writeError(String message) { - errorConsoleFile.writeToFile(message) + if(errorWorkspace!=null) { + errorWorkspace.writeText(errorFileName,message); + } + if(printToConsole) { + println(message) + } + if(runtimeConsole!==null) { + this.writeToRuntimeConsole(message) + } } public def writeStatistics(LinkedHashMap statistics) { - val message = ''' + if(statisticsWorkspace!==null) { + val message = ''' «FOR key : statistics.keySet SEPARATOR delimier»«key»«ENDFOR» «FOR value : statistics.values SEPARATOR delimier»«value»«ENDFOR»''' - statisticsConsoleFile.writeToFile(message) + statisticsWorkspace.writeText(statisticsFileName,message); + } } public def addStatistics(LinkedHashMap statistics) { for(key : statistics.keySet) { @@ -59,61 +102,72 @@ class ScriptConsole implements Closeable { this.statisticsDataBuffer.add(statistics) } public def flushStatistics() { - val message = ''' + if(statisticsWorkspace!==null) { + val message = ''' «FOR key : statisticsHeaderBuffer SEPARATOR delimier»«key»«ENDFOR» «FOR line : statisticsDataBuffer » «FOR key : statisticsHeaderBuffer»«IF line.containsKey(key)»«empty»«ELSE»«line.get(key)»«ENDIF»«ENDFOR» «ENDFOR» ''' - statisticsConsoleFile.writeToFile(message) + statisticsWorkspace.writeText(statisticsFileName,message); + } } - /** - * Writes a line of text to a file and the console. Initializes a writer to the file for at the first message. - */ - private def writeToFile(File file, String text) { - if(file != null) { - val writer = if(this.file2Writer.containsKey(file)) { - this.file2Writer.get(file) - } else { - if(!file.exists) { - file.createNewFile + + private def prepareWorkspace(URI uri, List errors) { + if (uri === null) { + return null + } else { + try{ + val folderURI = uri.trimSegments(1) + if(folderURI.isFile) { + return new FileSystemWorkspace(folderURI.toString,"")=>[init] + } else if(folderURI.isPlatformResource) { + return new ProjectWorkspace(folderURI.toString,"")=>[init] + } else { + throw new UnsupportedOperationException('''Unsupported file usi: "«uri»"!''') } - val writer = new PrintWriter(file, "UTF-8"); - this.file2Writer.put(file,writer) - writer + } catch(Exception e) { + errors += e.message + return null } - writer.println(text) } - if(printToConsole) { - println(text) + } + private def prepareFileName(URI uri) { + if(uri!==null) { + return uri.lastSegment + } else { + null } } - private def prepareFile(URI uri) { - if (uri === null) { - return null + private def MessageConsole prepareRuntimeConsole() { + val plugin = ConsolePlugin.getDefault(); + val conMan = plugin.getConsoleManager(); + val existingConsoles = conMan.getConsoles(); + val existingConsolesWithID = existingConsoles.filter[it.name.equals(consoleID)] + if(existingConsolesWithID.empty) { + val MessageConsole res = new MessageConsole(consoleID,null) + conMan.addConsoles(#[res]); + return res } else { - if(uri.isFile) { - val fileString = uri.toFileString - val file = new File(fileString) - if (this.cleanFiles && file.exists) { - file.delete - } - return file - } else if(uri.isPlatformResource) { - val platformString = uri.toPlatformString(true) - val file = new File(platformString) - if (this.cleanFiles && file.exists) { - file.delete - } - return file - } else { - throw new UnsupportedOperationException('''Unksupported file usi: "«uri»"!''') - } + return existingConsolesWithID.head as MessageConsole } } - override close() throws IOException { - this.file2Writer.values.forEach[close] + private def writeToRuntimeConsole(CharSequence message) { + // 1. reveal the console view +// val IWorkbench wb = PlatformUI.getWorkbench(); +// val IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); +// val IWorkbenchPage page = win.getActivePage(); +// val id = IConsoleConstants.ID_CONSOLE_VIEW; +// val view = page.showView(id) as IConsoleView; +// view.display(this.runtimeConsole); + + ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this.runtimeConsole); + + // 2. write to the console + val stream = this.runtimeConsole.newMessageStream + stream.println(message.toString) + stream.close } } \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend index 442de6d9..8e30b49c 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend @@ -84,6 +84,6 @@ class StatisticSections2CSV { values+=map } } - private def dispatch String readValue(IntStatisticEntry e) { return e.value.toString } - private def dispatch String readValue(RealStatisticEntry e){ return e.value.toString } + public def dispatch String readValue(IntStatisticEntry e) { return e.value.toString } + public def dispatch String readValue(RealStatisticEntry e){ return e.value.toString } } \ No newline at end of file -- cgit v1.2.3-54-g00ecf