Compare commits
179 Commits
tx_end_tim
...
2.16.1
Author | SHA1 | Date | |
---|---|---|---|
3a931d59d5 | |||
e53764cd7b | |||
3f7bdc7e28 | |||
8d94b517c1 | |||
d5e50a06b2 | |||
fda4c64ac7 | |||
8dcfc061cb | |||
79a5343cde | |||
c9c6db8e4c | |||
e629bdc5bc | |||
8522627081 | |||
d7f6d9b879 | |||
8f48abf0ae | |||
fbec708522 | |||
5c59fb0676 | |||
2a9c5ff6a5 | |||
9fe7a83dfa | |||
eb4e2301c1 | |||
a6aa9859ea | |||
1866ae17a9 | |||
6987985e36 | |||
f81f84d60e | |||
fd8e2ea751 | |||
2d11e39653 | |||
ab419a743f | |||
fc64fa781a | |||
c474ca33d8 | |||
8119c1a4f3 | |||
5f84194145 | |||
7dbcffe95d | |||
20934a9f47 | |||
24890f9bbb | |||
bd0629301b | |||
71da420d86 | |||
f9be6758e2 | |||
93a8c067fc | |||
5a372d0f90 | |||
806000c4cc | |||
539e5de813 | |||
c32d46cdc0 | |||
5736279e8d | |||
e3f4dc6616 | |||
a64e06ff7a | |||
a42b786835 | |||
e76000d87b | |||
60ead71029 | |||
4c48fda5ad | |||
6a591f2dbc | |||
86c30ad948 | |||
0ae055b486 | |||
efcd4f5ab8 | |||
232d2d4275 | |||
44f96e5383 | |||
44812310b0 | |||
6ef91bb5e7 | |||
aa459b0ea6 | |||
a2adf66618 | |||
3405e90df9 | |||
9a59947e67 | |||
9384d3278c | |||
1af3171b2e | |||
03fd9e154b | |||
3572f683e3 | |||
524ffb189c | |||
7fac6c8f74 | |||
037c645075 | |||
2f9bd29dc8 | |||
92662c546a | |||
efa6544623 | |||
52cf9daeec | |||
4a315722b1 | |||
a52efd1a12 | |||
535df30ada | |||
bad34dd1d1 | |||
5ac7f05f57 | |||
8353b59a27 | |||
2c6ca6c376 | |||
f4b03cb0e6 | |||
c7858997c0 | |||
bd99ab3992 | |||
66f365d38d | |||
59987f262d | |||
452a28362e | |||
d6805f383b | |||
076611eec7 | |||
e0fa55e2c0 | |||
9ea1994228 | |||
36f628c365 | |||
ff87e72510 | |||
aef1e29a53 | |||
1ebf9ba382 | |||
929408d08c | |||
f57fb93525 | |||
788065e456 | |||
22b46e0525 | |||
b75018239a | |||
598bb8eec7 | |||
869265fc13 | |||
5ad813527a | |||
73f8d3d50a | |||
da1701195d | |||
9b6334509e | |||
ac4acc34a4 | |||
b6963f38d6 | |||
182a036ade | |||
97f2182290 | |||
1986a8c9c3 | |||
6905d96329 | |||
818f786b1d | |||
2948c1bd33 | |||
78faab404c | |||
64b10970a8 | |||
6ab8fd232e | |||
f337a94112 | |||
0135631a3e | |||
d0e1e8801f | |||
d1b3a91979 | |||
45c1396e0e | |||
b7301733f0 | |||
5df91dbaa8 | |||
68918689e7 | |||
c41dd646da | |||
a077389b83 | |||
caa37375c0 | |||
3daea8ab43 | |||
c5d77af0d0 | |||
7f7fdf09f4 | |||
7aba6a2ecb | |||
012395b933 | |||
787e3accc0 | |||
b778940c83 | |||
71297c4e5a | |||
1d2395e00d | |||
b69e1886b9 | |||
d65803a4b7 | |||
0e49a68e09 | |||
7af5593fd4 | |||
25545dac51 | |||
df77af64ca | |||
e264ab2cbe | |||
8c17ed4146 | |||
4ee2e8bc68 | |||
bdcba613d5 | |||
049de0ddaf | |||
6be3f378d4 | |||
6d8aa33fc9 | |||
b37ba9f2f1 | |||
799f083a74 | |||
156abe63cd | |||
d38016a03f | |||
5604c3ee5e | |||
5adeae15a9 | |||
bca94ceb9d | |||
a42f086339 | |||
888edf32be | |||
ee5536f1b5 | |||
59859e5d90 | |||
5bae086712 | |||
16de83616a | |||
6530362b89 | |||
0372e03abb | |||
26e8ea8a51 | |||
efd042dd22 | |||
d06642d51f | |||
f27bcd7109 | |||
eaea5a4653 | |||
fa4bd0ddd5 | |||
3cbbdbee92 | |||
d674e155e1 | |||
cb3366a559 | |||
8de0e11226 | |||
b12232329b | |||
5e63972500 | |||
d53db967b3 | |||
12b08ca8c6 | |||
bb60f3a9c8 | |||
ba347a258d | |||
ac41feff6e | |||
d2cf13d64b |
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,3 +9,4 @@ SCViewer_1.png
|
||||
copyrightLog.txt
|
||||
/workspace
|
||||
?*.launch
|
||||
/.settings/
|
||||
|
@ -12,7 +12,8 @@
|
||||
<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
|
||||
<stringAttribute key="M2_USER_SETTINGS" value=""/>
|
||||
<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/AdoptOpenJDK 8 [1.8.0_232]"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/>
|
||||
</launchConfiguration>
|
||||
|
61
README.md
61
README.md
@ -18,14 +18,55 @@ The viewer has the following features
|
||||
- sqlite based
|
||||
- visualization of transaction relations
|
||||
|
||||
To build the plugins the Eclipse SDK or PDE can be used. In both cases the Groovy
|
||||
eclipse plugin (http://groovy.codehaus.org/Eclipse+Plugin or Market) has to be
|
||||
installed.
|
||||
To build the plugins the Eclipse SDK or PDE can be used.
|
||||
|
||||
Key Shortcuts
|
||||
=============
|
||||
|
||||
Legend:
|
||||
|
||||
* Left Mouse Button: LMB
|
||||
* Middle Mouse Button: MMB
|
||||
* Mouse Scroll wheel: MScrl
|
||||
* Context any means Name List, Value List or Waveform
|
||||
|
||||
| Input | Modifier | Context | Action |
|
||||
|------------|----------|----------|-----------------------------------|
|
||||
| LMB click | | any | select |
|
||||
| LMB click | Shift | Waveform | move selected marker to position |
|
||||
| LMB click | Control | Waveform | move cursor to position |
|
||||
| LMB drag | | Waveform | zoom to range |
|
||||
| MMB click | | Waveform | move selected marker to position |
|
||||
| MScrl | | any | scroll window up/down |
|
||||
| MScrl | Shift | any | scroll window left/right |
|
||||
| MScrl | Control | Waveform | zoom in/out |
|
||||
| Key left | | Waveform | scroll window to the left (slow) |
|
||||
| Key right | | Waveform | scroll window to the right (slow) |
|
||||
| Key left | Shift | Waveform | scroll window to the left (fast) |
|
||||
| Key right | Shift | Waveform | scroll window to the right (fast) |
|
||||
| Key up | | Waveform | move selection up |
|
||||
| Key down | | Waveform | move selection down |
|
||||
| Key up | Control | Waveform | move selected track up |
|
||||
| Key down | Control | Waveform | move selected track down |
|
||||
| Key + | Control | Waveform | zoom in |
|
||||
| Key - | Control | Waveform | zoom out |
|
||||
| Key Pos1 | | Waveform | jump to selected marker |
|
||||
| Key End | | Waveform | jump to cursor |
|
||||
| Key Del | | any | delete selected entries |
|
||||
| LMB click | | ZoomBar | increment/decrement 1 page |
|
||||
| LMB drag | | ZoomBar | drag both markers (pan) |
|
||||
| LMB drag | Control | ZoomBar | drag one marker (zoom) |
|
||||
| MMB drag | | ZoomBar | drag one marker (zoom) |
|
||||
| xMB dclick | | ZoomBar | pan to position |
|
||||
| MScrl | | ZoomBar | scroll window left/right |
|
||||
| MScrl | Shift | ZoomBar | scroll window left/right double speed |
|
||||
| MScrl | Control | ZoomBar | zoom in/out |
|
||||
| Key left | | ZoomBar | scroll window to the left (slow) |
|
||||
| Key right | | ZoomBar | scroll window to the right (slow) |
|
||||
| Key up | | ZoomBar | scroll window to the left (slow) |
|
||||
| Key down | | ZoomBar | scroll window to the right (slow) |
|
||||
| Key PgUp | | ZoomBar | scroll window to the left (fast) |
|
||||
| Key PgDown | | ZoomBar | scroll window to the right (fast) |
|
||||
| Key Pos1 | | ZoomBar | scroll to begin |
|
||||
| Key End | | ZoomBar | scroll to end |
|
||||
|
||||
TODO
|
||||
====
|
||||
- add more tests
|
||||
- move to feature based product to allow automatic updates
|
||||
- improve graphics
|
||||
- catch-up e3 plugin to functionality of e4 product
|
||||
- add calculated traces
|
||||
|
@ -1,2 +0,0 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding/<project>=UTF-8
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>com.minres.scviewer.e4.product_slim</name>
|
||||
<name>com.minres.scviewer.doc</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
168
doc/com.minres.scviewer.doc/pom.xml
Normal file
168
doc/com.minres.scviewer.doc/pom.xml
Normal file
@ -0,0 +1,168 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>com.minres.scviewer.doc</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<asciidoctor.maven.plugin.version>2.0.0</asciidoctor.maven.plugin.version>
|
||||
<asciidoctorj.pdf.version>1.6.2</asciidoctorj.pdf.version>
|
||||
<help.plugin.target.dir>../../plugins/com.minres.scviewer.e4.application.help</help.plugin.target.dir>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.asciidoctor</groupId>
|
||||
<artifactId>asciidoctor-maven-plugin</artifactId>
|
||||
<version>${asciidoctor.maven.plugin.version}</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.asciidoctor</groupId>
|
||||
<artifactId>asciidoctorj-pdf</artifactId>
|
||||
<version>${asciidoctorj.pdf.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<sourceDirectory>src/asciidoc</sourceDirectory>
|
||||
<sourceDocumentName>SCViewerHelp.adoc</sourceDocumentName>
|
||||
<headerFooter>true</headerFooter>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>output-html</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>process-asciidoc</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sourceHighlighter>coderay</sourceHighlighter>
|
||||
<backend>html</backend>
|
||||
<attributes>
|
||||
<toc />
|
||||
<linkcss>false</linkcss>
|
||||
</attributes>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>output-docbook</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>process-asciidoc</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<backend>docbook</backend>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>output-pdf</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>process-asciidoc</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<backend>pdf</backend>
|
||||
<sourceHighlighter>coderay</sourceHighlighter>
|
||||
<attributes>
|
||||
<icons>font</icons>
|
||||
<pagenums />
|
||||
<toc />
|
||||
<idprefix />
|
||||
<idseparator>-</idseparator>
|
||||
</attributes>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.6</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-asciidoc-resources</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>copy-resources</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>target/generated-docs/</directory>
|
||||
<includes>
|
||||
<include>SCViewerHelp.xml</include>
|
||||
<include>**/*.jpg</include>
|
||||
<include>**/*.png</include>
|
||||
<include>**/*.svg</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<outputDirectory>src/docbkx</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.agilejava.docbkx</groupId>
|
||||
<artifactId>docbkx-maven-plugin</artifactId>
|
||||
<version>2.0.17</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<!-- <phase>generate-sources</phase> -->
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>generate-eclipse</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.docbook</groupId>
|
||||
<artifactId>docbook-xml</artifactId>
|
||||
<version>4.4</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<sourceDirectory>src/docbkx</sourceDirectory>
|
||||
<targetDirectory>${help.plugin.target.dir}</targetDirectory>
|
||||
<preProcess>
|
||||
<copy todir="${help.plugin.target.dir}/images">
|
||||
<fileset dir="src/docbkx/images" />
|
||||
</copy>
|
||||
<copy todir="${help.plugin.target.dir}/css">
|
||||
<fileset dir="src/docbkx/css" />
|
||||
</copy>
|
||||
</preProcess>
|
||||
<imgSrcPath>./</imgSrcPath>
|
||||
|
||||
<useExtensions>1</useExtensions>
|
||||
<highlightSource>1</highlightSource>
|
||||
<highlightDefaultLanguage>java</highlightDefaultLanguage>
|
||||
<calloutsExtension>1</calloutsExtension>
|
||||
<paperType>A4</paperType>
|
||||
<!--<fop1Extensions>1</fop1Extensions>
|
||||
<foCustomization>${basedir}/conf/customization-fopdf.xsl</foCustomization>-->
|
||||
|
||||
<!-- This copies content (images, etc) for the HTML version -->
|
||||
<!-- Any parameters specific to HTML version go here -->
|
||||
<htmlStylesheet>css/narrow_style.css</htmlStylesheet>
|
||||
<!-- <includes>titlepage/titlepage.templates.xml</includes> -->
|
||||
<includes>SCViewerHelp.xml</includes>
|
||||
<chunkedOutput>true</chunkedOutput>
|
||||
<xincludeSupported>true</xincludeSupported>
|
||||
<!-- <foCustomization>src/test/resources/docbook-fo.xsl</foCustomization> -->
|
||||
<eclipsePluginId>com.minres.scviewer.e4.application.help</eclipsePluginId>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
25
doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc
Normal file
25
doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc
Normal file
@ -0,0 +1,25 @@
|
||||
[#_introduction]
|
||||
== Introduction
|
||||
|
||||
[#_overview]
|
||||
=== SCViewer overview
|
||||
|
||||
SCViewer is composed of a set of eclipse plugins to display VCD and transaction streams
|
||||
created by the SystemC VCD trace implementation and the SystemC Verification Library (SCV).
|
||||
For further description of the SCV please refer to
|
||||
http://www.accellera.org/activities/committees/systemc-verification.
|
||||
|
||||
|
||||
[#_features]
|
||||
=== SCViewer features
|
||||
|
||||
Features include:
|
||||
|
||||
* support of VCD files (compressed and uncompressed)
|
||||
** real numbers
|
||||
** showing vectors and real numbers as analog (step-wise & continuous)
|
||||
* various value representations of bit vectors
|
||||
* support of SCV transaction recordings in various formats
|
||||
** text log files (compressed and uncompressed)
|
||||
** sqlite based
|
||||
** visualization of transaction relations
|
55
doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc
Normal file
55
doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc
Normal file
@ -0,0 +1,55 @@
|
||||
[#_reference]
|
||||
== Reference
|
||||
|
||||
In this section you will find detailed descriptions of all GUI and menu elements of the SCViewer including their functions and keyboard shortcuts.
|
||||
|
||||
[#_keybindings]
|
||||
=== Key Shortcuts
|
||||
|
||||
Legend:
|
||||
|
||||
* Left Mouse Button: LMB
|
||||
* Middle Mouse Button: MMB
|
||||
* Mouse Scroll wheel: MScrl
|
||||
* Context any means Name List, Value List or Waveform
|
||||
|
||||
[cols="1,1,1,4",options="header"]
|
||||
|===
|
||||
| Input | Modifier | Context | Action
|
||||
| LMB click | | any | select
|
||||
| LMB click | Shift | Waveform | move selected marker to position
|
||||
| LMB click | Control | Waveform | move cursor to position
|
||||
| LMB drag | | Waveform | zoom to range
|
||||
| MMB click | | Waveform | move selected marker to position
|
||||
| MScrl | | any | scroll window up/down
|
||||
| MScrl | Shift | any | scroll window left/right
|
||||
| Key left | | Waveform | scroll window to the left (slow)
|
||||
| Key right | | Waveform | scroll window to the right (slow)
|
||||
| Key left | Shift | Waveform | scroll window to the left (fast)
|
||||
| Key right | Shift | Waveform | scroll window to the right (fast)
|
||||
| Key up | | Waveform | move selection up
|
||||
| Key down | | Waveform | move selection down
|
||||
| Key up | Control | Waveform | move selected track up
|
||||
| Key down | Control | Waveform | move selected track down
|
||||
| Key + | Control | Waveform | zoom in
|
||||
| Key - | Control | Waveform | zoom out
|
||||
| Key Pos1 | | Waveform | jump to selected marker
|
||||
| Key End | | Waveform | jump to cursor
|
||||
| Key Del | | any | delete selected entries
|
||||
| LMB click | | ZoomBar | increment/decrement 1 page
|
||||
| LMB drag | | ZoomBar | drag both markers (pan)
|
||||
| LMB drag | Control | ZoomBar | drag one marker (zoom)
|
||||
| MMB drag | | ZoomBar | drag one marker (zoom)
|
||||
| xMB dclick | | ZoomBar | pan to position
|
||||
| MScrl | | ZoomBar | scroll window left/right
|
||||
| MScrl | Shift | ZoomBar | scroll window left/right double speed
|
||||
| MScrl | Control | ZoomBar | zoom in/out
|
||||
| Key left | | ZoomBar | scroll window to the left (slow)
|
||||
| Key right | | ZoomBar | scroll window to the right (slow)
|
||||
| Key up | | ZoomBar | scroll window to the left (slow)
|
||||
| Key down | | ZoomBar | scroll window to the right (slow)
|
||||
| Key PgUp | | ZoomBar | scroll window to the left (fast)
|
||||
| Key PgDown | | ZoomBar | scroll window to the right (fast)
|
||||
| Key Pos1 | | ZoomBar | scroll to begin
|
||||
| Key End | | ZoomBar | scroll to end
|
||||
|===
|
39
doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc
Normal file
39
doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc
Normal file
@ -0,0 +1,39 @@
|
||||
[#_start]
|
||||
= SCViewer User Guide
|
||||
:title-logo-image: image:Minres_logo_docs.png[width=750, align="right"]
|
||||
:doctype: book
|
||||
:source-highlighter: coderay
|
||||
:coderay-linenums-mode: inline
|
||||
:coderay-css: class
|
||||
:listing-caption: Listing
|
||||
:icons: font
|
||||
//add table-of-contents (toc) and set its depth
|
||||
:toc:
|
||||
:toclevels: 3
|
||||
:data-uri:
|
||||
:sectnums:
|
||||
:toc-title: Contents
|
||||
:homepage: https://www.minres.com/
|
||||
:keywords:
|
||||
:title-page:
|
||||
:xrefstyle: short
|
||||
:table-caption: Table
|
||||
:figure-caption: Figure
|
||||
:appendix-caption: Appendix
|
||||
:section-refsig: Chapter
|
||||
//set directories
|
||||
:imagesdir: ./images
|
||||
:iconsdir: ./icons
|
||||
:stylesdir: ./styles
|
||||
:scriptsdir: ./js
|
||||
:pdf-themesdir: ./themes
|
||||
:pdf-theme: mnrs-doc
|
||||
:pdf-fontsdir: ./fonts
|
||||
|
||||
|
||||
// unset toc, otherwise it appears in table cells -> known bug, should be fixed in later versions!
|
||||
:toc!:
|
||||
|
||||
include::Overview.adoc[]
|
||||
|
||||
include::Reference.adoc[]
|
93
doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt
Normal file
93
doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt
Normal file
@ -0,0 +1,93 @@
|
||||
Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo.png
Normal file
BIN
doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
@ -0,0 +1,55 @@
|
||||
page:
|
||||
layout: portrait
|
||||
margin: [2.3cm, 2cm, 2cm, 2.2cm]
|
||||
size: A4
|
||||
base:
|
||||
font-color: #000000
|
||||
font-color-mnrs-grey: #6a747c
|
||||
font-color-mnrs-blue: #197788
|
||||
font-family: titillium
|
||||
font-size: 12
|
||||
line-height-length: 16
|
||||
line-height: $base-line-height-length / $base-font-size
|
||||
align: justify
|
||||
vertical-spacing: $base-line-height-length
|
||||
heading:
|
||||
font-color: $base-font-color-mnrs-grey
|
||||
font-size: $base-font-size * 1.25
|
||||
font-style: bold
|
||||
line-height: $base-line-height * 1.2
|
||||
margin-bottom: $vertical-spacing
|
||||
link:
|
||||
font-color: $base_font-color-mnrs-blue
|
||||
outline-list:
|
||||
indent: $base-font-size * 1.5
|
||||
footer:
|
||||
height: $base-line-height-length * 3.0
|
||||
font-color: $base-font-color-mnrs-grey
|
||||
font-size: $base-font-size * 0.9
|
||||
line-height: 1
|
||||
recto:
|
||||
left:
|
||||
content: '{description} v{revision}, © 2021 MINRES'
|
||||
right:
|
||||
content: '{page-number}'
|
||||
verso:
|
||||
left:
|
||||
content: $footer_recto_right_content
|
||||
right:
|
||||
content: $footer_recto_left_content
|
||||
table:
|
||||
border_color: $base-font-color
|
||||
border_width: 0.1
|
||||
title-page:
|
||||
align: right
|
||||
font-color: $base-font-color-mnrs-grey
|
||||
font-size: $base-font-size * 1.80
|
||||
font-style: bold
|
||||
font:
|
||||
fallbacks: titilliumtext22l002-webfont.ttf
|
||||
catalog:
|
||||
titillium:
|
||||
normal: titilliumtext22l002-webfont.ttf
|
||||
bold: titilliumtext22l005-webfont.ttf
|
||||
italic: TitilliumWeb-Italic.ttf
|
||||
bold_italic: TitilliumWeb-BoldItalic.ttf
|
1
doc/com.minres.scviewer.doc/src/docbkx/.gitignore
vendored
Normal file
1
doc/com.minres.scviewer.doc/src/docbkx/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/SCViewerHelp.xml
|
124
doc/com.minres.scviewer.doc/src/docbkx/css/narrow_style.css
Normal file
124
doc/com.minres.scviewer.doc/src/docbkx/css/narrow_style.css
Normal file
@ -0,0 +1,124 @@
|
||||
P.Code {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0.00pt;
|
||||
margin-top: 0.000000pt;
|
||||
margin-bottom: 0.000000pt;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 1.5em;
|
||||
font-size: 100%;
|
||||
font-weight: medium;
|
||||
font-style: Regular;
|
||||
color: #4444CC;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family: "Courier New";
|
||||
}
|
||||
H6.CaptionFigColumn {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0.000000pt;
|
||||
margin-top: 0.3em;
|
||||
margin-bottom: 1.1em;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 0.000000pt;
|
||||
font-size: 90%;
|
||||
font-weight: medium;
|
||||
font-style: Italic;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family: "Arial";
|
||||
}
|
||||
P.Note {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0pt;
|
||||
margin-top: 1.95em;
|
||||
margin-bottom: 1.95em;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 3.0em;
|
||||
font-size: 110%;
|
||||
font-weight: medium;
|
||||
font-style: Italic;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family: "Arial";
|
||||
}
|
||||
EM.UILabel {
|
||||
font-weight: Bold;
|
||||
font-style: Regular;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
}
|
||||
EM.CodeName {
|
||||
font-weight: Bold;
|
||||
font-style: Regular;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family:"Courier New";
|
||||
}
|
||||
|
||||
|
||||
|
||||
body, html { border: 0px }
|
||||
|
||||
/* following font face declarations need to be removed for DBCS */
|
||||
|
||||
body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font: message-box; color: #000000}
|
||||
pre { font-family: Courier, monospace}
|
||||
|
||||
/* end font face declarations */
|
||||
|
||||
/* following font size declarations should be OK for DBCS */
|
||||
body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font: message-box; }
|
||||
pre { font-size: 100% }
|
||||
code,samp { font-size: 100%; }
|
||||
|
||||
/* end font size declarations */
|
||||
|
||||
body { background: #FFFFFF}
|
||||
h1 { font-size: 180%; font-weight: medium; margin-top: 0.28em; margin-bottom: 0.05em; color: Highlight }
|
||||
h2 { font-size: 140%; font-weight: bold; margin-top: 0.22em; margin-bottom: 3; color: Highlight }
|
||||
h3 { font-size: 110%; font-weight: bold; margin-top: 0.18em; margin-bottom: 3 }
|
||||
h4 { font-size: 100%; font-weight: bold; margin-top: 0.2em; margin-bottom: 3; font-style: italic }
|
||||
p { margin-top: 1.0em; margin-bottom: 1.0em }
|
||||
pre { margin-left: 6; font-size: 90% }
|
||||
a:link { color: #0000FF }
|
||||
a:hover { color: #000080 }
|
||||
a:visited { text-decoration: underline }
|
||||
ul { margin-top: 0;
|
||||
margin-bottom: 1.0em;
|
||||
margin-left : 1.0em;
|
||||
padding-left: 0;
|
||||
}
|
||||
li { margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
padding-left: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
li p { margin-top: 0; margin-bottom: 0 }
|
||||
ol { margin-top: 0;
|
||||
margin-bottom: 10;
|
||||
padding-left: 0;
|
||||
margin-left: 1.4em }
|
||||
dl { margin-top: 0; margin-bottom: 10 }
|
||||
dt { margin-top: 0; margin-bottom: 0; font-weight: bold }
|
||||
dd { margin-top: 0; margin-bottom: 0 }
|
||||
strong { font-weight: bold}
|
||||
em { font-style: italic}
|
||||
var { font-style: italic}
|
||||
div.revision { border-left-style: solid; border-left-width: thin;
|
||||
border-left-color: #7B68EE; padding-left:5 }
|
||||
th { font-weight: bold }
|
||||
|
||||
.figure-contents .mediaobject img {
|
||||
width: 100%;
|
||||
heigth: auto;
|
||||
}
|
108
doc/com.minres.scviewer.doc/src/docbkx/css/style.css
Normal file
108
doc/com.minres.scviewer.doc/src/docbkx/css/style.css
Normal file
@ -0,0 +1,108 @@
|
||||
P.Code {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0.00pt;
|
||||
margin-top: 0.000000pt;
|
||||
margin-bottom: 0.000000pt;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 15pt;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
color: #4444CC;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
}
|
||||
H6.CaptionFigColumn {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0.000000pt;
|
||||
margin-top: 3.000000pt;
|
||||
margin-bottom: 11.000000pt;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 0.000000pt;
|
||||
font-size: 75%;
|
||||
font-weight: bold;
|
||||
font-style: Italic;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
}
|
||||
P.Note {
|
||||
display: block;
|
||||
text-align: left;
|
||||
text-indent: 0pt;
|
||||
margin-top: 19.500000pt;
|
||||
margin-bottom: 19.500000pt;
|
||||
margin-right: 0.000000pt;
|
||||
margin-left: 30pt;
|
||||
font-size: 110%;
|
||||
font-weight: normal;
|
||||
font-style: Italic;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
}
|
||||
EM.UILabel {
|
||||
font-weight: Bold;
|
||||
font-style: normal;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
}
|
||||
EM.CodeName {
|
||||
font-weight: Bold;
|
||||
font-style: normal;
|
||||
text-decoration: none;
|
||||
vertical-align: baseline;
|
||||
text-transform: none;
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
}
|
||||
UL.NavList {
|
||||
margin-left: 1.5em;
|
||||
padding-left: 0px;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
body, html { border: 0px }
|
||||
|
||||
|
||||
/* following font face declarations need to be removed for DBCS */
|
||||
|
||||
body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-family: Arial, Helvetica, sans-serif; color: #000000}
|
||||
pre, code { font-family: "Courier New", Courier, monospace;}
|
||||
|
||||
/* end font face declarations */
|
||||
|
||||
@media print {
|
||||
html { font-size: 12pt }
|
||||
}
|
||||
|
||||
body { font-size: 83%; background: #FFFFFF; margin-bottom: 1em }
|
||||
h1 { font-size: 180%; margin-top: 5px; margin-bottom: 1px }
|
||||
h2 { font-size: 140%; margin-top: 25px; margin-bottom: 3px }
|
||||
h3 { font-size: 110%; margin-top: 20px; margin-bottom: 3px }
|
||||
h4 { font-size: 100%; margin-top: 20px; margin-bottom: 3px; font-style: italic }
|
||||
p { margin-top: 10px; margin-bottom: 10px }
|
||||
pre { font-size: 93%; margin-left: 6; color: #4444CC }
|
||||
code { font-size: 93%; }
|
||||
table { font-size: 100% } /* needed for quirks mode */
|
||||
a:link { color: #0000FF }
|
||||
a:hover { color: #000080 }
|
||||
a:visited { text-decoration: underline }
|
||||
ul { margin-top: 10px; margin-bottom: 10px; }
|
||||
li { margin-top: 5px; margin-bottom: 5px; }
|
||||
li p { margin-top: 5px; margin-bottom: 5px; }
|
||||
ol { margin-top: 10px; margin-bottom: 10px; }
|
||||
dl { margin-top: 10px; margin-bottom: 10px; }
|
||||
dt { margin-top: 5px; margin-bottom: 5px; font-weight: bold; }
|
||||
dd { margin-top: 5px; margin-bottom: 5px; }
|
||||
strong { font-weight: bold}
|
||||
em { font-style: italic}
|
||||
var { font-style: italic}
|
||||
div.revision { border-left-style: solid; border-left-width: thin;
|
||||
border-left-color: #7B68EE; padding-left:5 }
|
||||
th { font-weight: bold }
|
1
doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore
vendored
Normal file
1
doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/*.png
|
@ -27,12 +27,12 @@ http://www.eclipse.org/legal/epl-v10.html
|
||||
</url>
|
||||
|
||||
<requires>
|
||||
<import plugin="org.codehaus.groovy" version="2.5.8" match="greaterOrEqual"/>
|
||||
<import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/>
|
||||
<import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.eclipse.osgi"/>
|
||||
<import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/>
|
||||
<import plugin="org.eclipse.core.runtime"/>
|
||||
<import feature="org.eclipse.collections.feature" version="10.4.0.v20200820-2049"/>
|
||||
</requires>
|
||||
|
||||
<plugin
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>1.1.0-SNAPSHOT</version>
|
||||
|
17
features/com.minres.scviewer.e4.help.feature/.project
Normal file
17
features/com.minres.scviewer.e4.help.feature/.project
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>com.minres.scviewer.e4.help.feature</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.pde.FeatureBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.pde.FeatureNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
@ -0,0 +1 @@
|
||||
bin.includes = feature.xml
|
207
features/com.minres.scviewer.e4.help.feature/feature.xml
Normal file
207
features/com.minres.scviewer.e4.help.feature/feature.xml
Normal file
@ -0,0 +1,207 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feature
|
||||
id="com.minres.scviewer.e4.help.feature"
|
||||
label="Feature"
|
||||
version="1.0.0.qualifier"
|
||||
provider-name="MINRES Technologies GmbH">
|
||||
|
||||
<description url="http://www.example.com/description">
|
||||
[Enter Feature Description here.]
|
||||
</description>
|
||||
|
||||
<copyright url="http://www.example.com/copyright">
|
||||
[Enter Copyright Description here.]
|
||||
</copyright>
|
||||
|
||||
<license url="http://www.example.com/license">
|
||||
[Enter License Description here.]
|
||||
</license>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.help"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.help.webapp"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.help.base"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.lucene.core"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.lucene.analyzers-common"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.lucene.analyzers-smartcn"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.core.net"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.security"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.security.linux.x86_64"
|
||||
os="linux"
|
||||
arch="x86_64"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
fragment="true"/>
|
||||
|
||||
<plugin
|
||||
id="javax.el"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="javax.servlet"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="javax.servlet.jsp"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.http.jetty"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.http.registry"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.http.servlet"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.jsp.jasper"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.jsp.jasper.registry"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.jasper.glassfish"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.http"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.io"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.security"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.server"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.servlet"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.jetty.util"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="com.minres.scviewer.e4.application.help"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.eclipse.equinox.security.win32.x86_64"
|
||||
os="win32"
|
||||
arch="x86_64"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="0.0.0"
|
||||
fragment="true"
|
||||
unpack="false"/>
|
||||
|
||||
</feature>
|
12
features/com.minres.scviewer.e4.help.feature/pom.xml
Normal file
12
features/com.minres.scviewer.e4.help.feature/pom.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>com.minres.scviewer.e4.help.feature</artifactId>
|
||||
<packaging>eclipse-feature</packaging>
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</project>
|
@ -29,6 +29,10 @@
|
||||
id="org.eclipse.emf.common"
|
||||
version="0.0.0"/>
|
||||
|
||||
<includes
|
||||
id="org.eclipse.collections.feature"
|
||||
version="0.0.0"/>
|
||||
|
||||
<requires>
|
||||
<import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/>
|
||||
<import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>1.1.0-SNAPSHOT</version>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>1.1.0-SNAPSHOT</version>
|
||||
|
@ -1,4 +0,0 @@
|
||||
activeProfiles=
|
||||
eclipse.preferences.version=1
|
||||
resolveWorkspaceProjects=true
|
||||
version=1
|
@ -1,86 +0,0 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>com.minres.scviewer.updateSite</artifactId>
|
||||
<version>2.11.0-SNAPSHOT</version>
|
||||
<packaging>eclipse-repository</packaging>
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- make sure that zipped p2 repositories have the fully qualified version -->
|
||||
<plugin>
|
||||
<groupId>org.eclipse.tycho</groupId>
|
||||
<artifactId>tycho-p2-repository-plugin</artifactId>
|
||||
<version>${tycho-version}</version>
|
||||
<configuration>
|
||||
<finalName>${project.artifactId}-${qualifiedVersion}</finalName>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>parse-version</id>
|
||||
<goals>
|
||||
<goal>parse-version</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<profiles>
|
||||
<profile>
|
||||
<!-- Activate this profile to perform the release to Bintray -->
|
||||
<id>release-composite</id>
|
||||
<activation>
|
||||
<activeByDefault>false</activeByDefault>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.carrotgarden.maven</groupId>
|
||||
<artifactId>bintray-maven-plugin</artifactId>
|
||||
<version>1.5.20191113165555</version>
|
||||
<configuration>
|
||||
<skip>false</skip>
|
||||
<!-- Bintray organization name. -->
|
||||
<subject>minres</subject>
|
||||
<!-- Bintray target repository. -->
|
||||
<repository>eclipse</repository>
|
||||
<!-- Bintray package name. -->
|
||||
<bintrayPackage>SCViewer</bintrayPackage>
|
||||
<bintrayVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}</bintrayVersion>
|
||||
<packageVcsUrl>https://git.minres.com/VP-Tools/SCViewer.git</packageVcsUrl>
|
||||
<!-- Local folder content to sync to the remote repo. -->
|
||||
<sourceFolder>${project.build.directory}/repository</sourceFolder>
|
||||
<!-- Remote folder for local content upload, relative path. -->
|
||||
<targetFolder>scviewer-${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}</targetFolder>
|
||||
|
||||
<!-- Bintray credentials in settings.xml. -->
|
||||
<serverId>bintray-minres-deploy</serverId>
|
||||
</configuration>
|
||||
<executions>
|
||||
<!-- Activate "bintray:upload" during "package" -->
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>upload</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
@ -1,4 +0,0 @@
|
||||
/json-20180813-sources.jar
|
||||
/leveldb-0.11-SNAPSHOT-sources.jar
|
||||
/bin/
|
||||
/target/
|
@ -1,7 +0,0 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
@ -1,4 +0,0 @@
|
||||
eclipse.preferences.version=1
|
||||
pluginProject.equinox=false
|
||||
pluginProject.extensions=false
|
||||
resolve.requirebundle=false
|
@ -1,5 +0,0 @@
|
||||
eclipse.preferences.version=1
|
||||
enabled=true
|
||||
path=OSGI-INF
|
||||
validationErrorLevel=error
|
||||
validationErrorLevel.missingImplicitUnbindMethod=error
|
@ -1,16 +0,0 @@
|
||||
Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: Leveldb
|
||||
Bundle-SymbolicName: com.minres.scviewer.database.leveldb
|
||||
Bundle-Version: 1.0.0.qualifier
|
||||
Bundle-Vendor: MINRES Technologies GmbH
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Import-Package: org.osgi.framework;version="1.3.0"
|
||||
Automatic-Module-Name: com.minres.scviewer.database.leveldb
|
||||
Service-Component: OSGI-INF/*.xml
|
||||
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0",
|
||||
org.eclipse.osgi.services;bundle-version="3.4.0"
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-ClassPath: leveldb-0.11-SNAPSHOT-uber.jar,
|
||||
.,
|
||||
json-20180813.jar
|
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="LevelDbLoader">
|
||||
<implementation class="com.minres.scviewer.database.leveldb.LevelDBLoader"/>
|
||||
<service>
|
||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoader"/>
|
||||
</service>
|
||||
</scr:component>
|
@ -1,7 +0,0 @@
|
||||
source.. = src/
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.,\
|
||||
OSGI-INF/,\
|
||||
leveldb-0.11-SNAPSHOT-uber.jar,\
|
||||
json-20180813.jar
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,87 +0,0 @@
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.iq80.leveldb.Options;
|
||||
import org.iq80.leveldb.impl.SeekingIterator;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.IWaveformDb;
|
||||
import com.minres.scviewer.database.IWaveformDbLoader;
|
||||
import com.minres.scviewer.database.RelationType;
|
||||
|
||||
public class LevelDBLoader implements IWaveformDbLoader {
|
||||
|
||||
static byte[] toByteArray(String value) {
|
||||
return value.getBytes(UTF_8);
|
||||
}
|
||||
|
||||
private TxDBWrapper levelDb;
|
||||
private IWaveformDb db;
|
||||
private Long maxTime=null;
|
||||
private List<RelationType> usedRelationsList = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public boolean load(IWaveformDb db, File inp) throws Exception {
|
||||
try {
|
||||
this.db=db;
|
||||
levelDb = new TxDBWrapper(new Options(), inp);
|
||||
JSONObject configVal = new JSONObject(levelDb.get("__config"));
|
||||
if(!configVal.isEmpty())
|
||||
levelDb.setTimeResolution(configVal.getLong("resolution"));
|
||||
} catch(Exception e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getMaxTime() {
|
||||
if(maxTime==null) {
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
it.seek("st~");
|
||||
Entry<String, String> val = null;
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> v = it.next();
|
||||
if(!v.getKey().startsWith("st~")) continue;
|
||||
val=v;
|
||||
}
|
||||
if(val==null)
|
||||
maxTime = 0L;
|
||||
else {
|
||||
String[] token = val.getKey().split("~");
|
||||
maxTime = Long.parseLong(token[2], 16)*levelDb.getTimeResolution();
|
||||
}
|
||||
}
|
||||
return maxTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<IWaveform> getAllWaves() {
|
||||
List<IWaveform> streams=new ArrayList<IWaveform>();
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
it.seek("s~");
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> val = it.next();
|
||||
if(!val.getKey().startsWith("s~")) break;
|
||||
TxStream stream = new TxStream(levelDb, db, new JSONObject(val.getValue()));
|
||||
stream.setRelationTypeList(usedRelationsList);
|
||||
streams.add(stream);
|
||||
}
|
||||
return streams;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<RelationType> getAllRelationTypes() {
|
||||
// return Collections.emptyList();
|
||||
return usedRelationsList;
|
||||
}
|
||||
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static org.iq80.leveldb.shaded.guava.collect.Maps.immutableEntry;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.iq80.leveldb.DBIterator;
|
||||
import org.iq80.leveldb.impl.SeekingIterator;
|
||||
|
||||
class StringDbIterator implements SeekingIterator<String, String> {
|
||||
private final DBIterator iterator;
|
||||
|
||||
StringDbIterator(DBIterator iterator) {
|
||||
this.iterator = iterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return iterator.hasNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seekToFirst() {
|
||||
iterator.seekToFirst();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seek(String targetKey) {
|
||||
iterator.seek(targetKey.getBytes(UTF_8));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Entry<String, String> peek() {
|
||||
return adapt(iterator.peekNext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Entry<String, String> next() {
|
||||
return adapt(iterator.next());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
private Entry<String, String> adapt(Entry<byte[], byte[]> next) {
|
||||
return immutableEntry(new String(next.getKey(), UTF_8), new String(next.getValue(), UTF_8));
|
||||
}
|
||||
}
|
@ -1,172 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import org.iq80.leveldb.impl.SeekingIterator;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import com.minres.scviewer.database.ITx;
|
||||
import com.minres.scviewer.database.ITxAttribute;
|
||||
import com.minres.scviewer.database.ITxEvent;
|
||||
import com.minres.scviewer.database.ITxGenerator;
|
||||
import com.minres.scviewer.database.ITxRelation;
|
||||
import com.minres.scviewer.database.ITxStream;
|
||||
|
||||
public class Tx implements ITx {
|
||||
|
||||
private TxDBWrapper levelDb;
|
||||
private TxStream trStream;
|
||||
private TxGenerator trGenerator;
|
||||
private long id;
|
||||
private long start_time=0;
|
||||
private long end_time=0;
|
||||
private int concurency_index;
|
||||
private boolean initialized=false;
|
||||
private List<ITxAttribute> attributes;
|
||||
private List<ITxRelation> incoming, outgoing;
|
||||
|
||||
public Tx(TxDBWrapper levelDb, TxStream trStream, TxGenerator trGenerator, long id) {
|
||||
this.levelDb=levelDb;
|
||||
this.trStream=trStream;
|
||||
this.trGenerator=trGenerator;
|
||||
this.id=id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITxStream<ITxEvent> getStream() {
|
||||
return trStream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITxGenerator getGenerator() {
|
||||
return trGenerator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getConcurrencyIndex() {
|
||||
if(!initialized) loadFromDb();
|
||||
return concurency_index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getBeginTime() {
|
||||
if(!initialized) loadFromDb();
|
||||
return start_time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getEndTime() {
|
||||
loadFromDb();
|
||||
return end_time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITxAttribute> getAttributes() {
|
||||
if(attributes==null) {
|
||||
loadFromDb();
|
||||
}
|
||||
return attributes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ITxRelation> getIncomingRelations() {
|
||||
if(incoming==null) {
|
||||
incoming = new ArrayList<ITxRelation>();
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
String key = "ri~"+String.format("%016x", id);
|
||||
it.seek(key);
|
||||
while(it.hasNext()) {
|
||||
String val = it.next().getKey();
|
||||
if(!val.startsWith(key)) break;;
|
||||
String[] token = val.split("~");
|
||||
long otherId = Long.parseLong(token[2], 16);
|
||||
incoming.add(createRelation(otherId, token[3], false));
|
||||
}
|
||||
|
||||
}
|
||||
return incoming;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ITxRelation> getOutgoingRelations() {
|
||||
if(outgoing==null) {
|
||||
outgoing = new ArrayList<ITxRelation>();
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
String key="ro~"+String.format("%016x", id);
|
||||
it.seek(key);
|
||||
while(it.hasNext()) {
|
||||
String val = it.next().getKey();
|
||||
if(!val.startsWith(key)) break;
|
||||
String[] token = val.split("~");
|
||||
long otherId = Long.parseLong(token[2], 16);
|
||||
outgoing.add(createRelation(otherId, token[3], true));
|
||||
}
|
||||
|
||||
}
|
||||
return outgoing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(ITx o) {
|
||||
int res = this.getBeginTime().compareTo(o.getBeginTime());
|
||||
if(res!=0)
|
||||
return res;
|
||||
else
|
||||
return this.getId().compareTo(o.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]";
|
||||
}
|
||||
|
||||
private void loadFromDb() throws JSONException {
|
||||
JSONObject dbVal = new JSONObject(levelDb.get("x~"+ String.format("%016x", id)));
|
||||
start_time=dbVal.getLong("START_TIME") * levelDb.getTimeResolution();
|
||||
end_time=dbVal.getLong("END_TIME") * levelDb.getTimeResolution();
|
||||
concurency_index=dbVal.getInt("conc");
|
||||
attributes=new ArrayList<>();
|
||||
JSONArray arr = dbVal.getJSONArray("attr");
|
||||
arr.forEach(entry -> {
|
||||
TxAttribute attr = new TxAttribute(this, (JSONObject) entry);
|
||||
attributes.add(attr);
|
||||
});
|
||||
initialized=true;
|
||||
}
|
||||
|
||||
private ITxRelation createRelation(long otherId, String name, boolean outgoing) {
|
||||
try {
|
||||
JSONObject otherTxVal = new JSONObject(levelDb.get("x~"+ String.format("%016x", otherId)));
|
||||
if(otherTxVal.isEmpty()) return null;
|
||||
JSONObject otherStreamVal = new JSONObject(levelDb.get("s~"+ String.format("%016x", otherTxVal.getLong("s"))));
|
||||
if(otherStreamVal.isEmpty()) return null;
|
||||
TxStream tgtStream = (TxStream) trStream.getDb().getStreamByName(otherStreamVal.getString("name"));
|
||||
Tx that = (Tx) tgtStream.getTransactions().get(otherId);
|
||||
return outgoing?
|
||||
new TxRelation(trStream.getRelationType(name), this, that):
|
||||
new TxRelation(trStream.getRelationType(name), that, this);
|
||||
} catch (SecurityException | IllegalArgumentException | JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import com.minres.scviewer.database.AssociationType;
|
||||
import com.minres.scviewer.database.DataType;
|
||||
import com.minres.scviewer.database.ITxAttribute;
|
||||
|
||||
public class TxAttribute implements ITxAttribute{
|
||||
|
||||
private String name;
|
||||
|
||||
private DataType dataType;
|
||||
|
||||
private AssociationType associationType;
|
||||
|
||||
private Object value;
|
||||
|
||||
public TxAttribute(Tx trTransaction, JSONObject attribute) {
|
||||
this.name=attribute.getString("name");
|
||||
this.dataType=DataType.values()[attribute.getInt("type")];
|
||||
this.associationType=AssociationType.values()[attribute.getInt("assoc")];
|
||||
this.value=attribute.get("value");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataType getDataType() {
|
||||
return dataType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AssociationType getType() {
|
||||
return associationType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.iq80.leveldb.Options;
|
||||
import org.iq80.leveldb.Range;
|
||||
import org.iq80.leveldb.ReadOptions;
|
||||
import org.iq80.leveldb.Snapshot;
|
||||
import org.iq80.leveldb.impl.DbImpl;
|
||||
import org.iq80.leveldb.impl.SeekingIterator;
|
||||
|
||||
class TxDBWrapper {
|
||||
private final Options options;
|
||||
private final ReadOptions ro = new ReadOptions();
|
||||
private final File databaseDir;
|
||||
private DbImpl db;
|
||||
private long timeResolution=1L;;
|
||||
|
||||
TxDBWrapper(Options options, File databaseDir) throws IOException {
|
||||
this.options = options.verifyChecksums(true).createIfMissing(false).errorIfExists(false).cacheSize(64*1024*1024);
|
||||
this.databaseDir = databaseDir;
|
||||
this.db = new DbImpl(options, databaseDir);
|
||||
ro.snapshot(db.getSnapshot());
|
||||
}
|
||||
|
||||
public String get(String key) {
|
||||
byte[] slice = db.get(LevelDBLoader.toByteArray(key));
|
||||
if (slice == null) {
|
||||
return null;
|
||||
}
|
||||
return new String(slice, UTF_8);
|
||||
}
|
||||
|
||||
public String get(String key, Snapshot snapshot) {
|
||||
byte[] slice = db.get(LevelDBLoader.toByteArray(key), ro);
|
||||
return slice == null? null : new String(slice, UTF_8);
|
||||
}
|
||||
|
||||
public void put(String key, String value) {
|
||||
db.put(LevelDBLoader.toByteArray(key), LevelDBLoader.toByteArray(value));
|
||||
}
|
||||
|
||||
public void delete(String key) {
|
||||
db.delete(LevelDBLoader.toByteArray(key));
|
||||
}
|
||||
|
||||
public SeekingIterator<String, String> iterator() {
|
||||
return new StringDbIterator(db.iterator());
|
||||
}
|
||||
|
||||
public Snapshot getSnapshot() {
|
||||
return db.getSnapshot();
|
||||
}
|
||||
|
||||
public void close() {
|
||||
try {
|
||||
ro.snapshot().close();
|
||||
db.close();
|
||||
} catch (IOException e) {} // ignore any error
|
||||
}
|
||||
|
||||
public long size(String start, String limit) {
|
||||
return db.getApproximateSizes(new Range(LevelDBLoader.toByteArray(start), LevelDBLoader.toByteArray(limit)));
|
||||
}
|
||||
|
||||
public long getMaxNextLevelOverlappingBytes() {
|
||||
return db.getMaxNextLevelOverlappingBytes();
|
||||
}
|
||||
|
||||
public void reopen() throws IOException {
|
||||
reopen(options);
|
||||
}
|
||||
|
||||
public void reopen(Options options) throws IOException {
|
||||
this.close();
|
||||
db = new DbImpl(options.verifyChecksums(true).createIfMissing(false).errorIfExists(false), databaseDir);
|
||||
ro.snapshot(db.getSnapshot());
|
||||
}
|
||||
|
||||
public long getTimeResolution() {
|
||||
return timeResolution;
|
||||
}
|
||||
|
||||
public void setTimeResolution(long resolution) {
|
||||
this.timeResolution = resolution;
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import com.minres.scviewer.database.ITx;
|
||||
import com.minres.scviewer.database.ITxEvent;
|
||||
import com.minres.scviewer.database.IWaveformEvent;
|
||||
|
||||
public class TxEvent implements ITxEvent {
|
||||
|
||||
private final Type type;
|
||||
private ITx tx;
|
||||
|
||||
public TxEvent(Type type, ITx tx) {
|
||||
super();
|
||||
this.type = type;
|
||||
this.tx = tx;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getTime() {
|
||||
return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWaveformEvent duplicate() throws CloneNotSupportedException {
|
||||
return new TxEvent(type, tx);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(IWaveformEvent o) {
|
||||
return getTime().compareTo(o.getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITx getTransaction() {
|
||||
return tx;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return type.toString()+"@"+getTime()+" of tx #"+tx.getId();
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import com.minres.scviewer.database.ITx;
|
||||
import com.minres.scviewer.database.ITxEvent;
|
||||
import com.minres.scviewer.database.ITxGenerator;
|
||||
import com.minres.scviewer.database.ITxStream;
|
||||
|
||||
public class TxGenerator implements ITxGenerator {
|
||||
|
||||
private ITxStream<ITxEvent> stream;
|
||||
|
||||
private long id;
|
||||
|
||||
private String name;
|
||||
|
||||
public TxGenerator(ITxStream<ITxEvent> stream, JSONObject object) {
|
||||
this.stream=stream;
|
||||
this.id=object.getLong("id");
|
||||
this.name=object.getString("name");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITxStream<ITxEvent> getStream() {
|
||||
return stream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITx> getTransactions() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import com.minres.scviewer.database.ITxRelation;
|
||||
import com.minres.scviewer.database.ITx;
|
||||
import com.minres.scviewer.database.RelationType;
|
||||
|
||||
public class TxRelation implements ITxRelation {
|
||||
|
||||
RelationType relationType;
|
||||
Tx source, target;
|
||||
|
||||
public TxRelation(RelationType relationType, Tx source, Tx target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
this.relationType = relationType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RelationType getRelationType() {
|
||||
return relationType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITx getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITx getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
}
|
@ -1,178 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* MINRES Technologies GmbH - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.leveldb;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.iq80.leveldb.impl.SeekingIterator;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.NavigableMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.Vector;
|
||||
|
||||
import com.minres.scviewer.database.HierNode;
|
||||
import com.minres.scviewer.database.ITx;
|
||||
import com.minres.scviewer.database.ITxEvent;
|
||||
import com.minres.scviewer.database.ITxGenerator;
|
||||
import com.minres.scviewer.database.ITxStream;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.IWaveformDb;
|
||||
import com.minres.scviewer.database.RelationType;
|
||||
|
||||
public class TxStream extends HierNode implements ITxStream<ITxEvent> {
|
||||
|
||||
private TxDBWrapper levelDb;
|
||||
|
||||
private String fullName;
|
||||
|
||||
private String kind;
|
||||
|
||||
private IWaveformDb db;
|
||||
|
||||
private long id;
|
||||
|
||||
private TreeMap<Long, TxGenerator> generators;
|
||||
|
||||
private TreeMap<Long, ITx> transactions;
|
||||
|
||||
private Integer maxConcurrency;
|
||||
|
||||
private TreeMap<Long, List<ITxEvent>> events;
|
||||
|
||||
private List<RelationType> usedRelationsList;
|
||||
|
||||
public TxStream(TxDBWrapper database, IWaveformDb waveformDb, JSONObject object) {
|
||||
super(object.get("name").toString());
|
||||
this.levelDb=database;
|
||||
this.db=waveformDb;
|
||||
this.fullName=object.getString("name");
|
||||
this.kind=object.getString("kind");
|
||||
this.id = object.getLong("id");
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWaveformDb getDb() {
|
||||
return db;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
return fullName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKind() {
|
||||
return kind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITxGenerator> getGenerators() {
|
||||
if(generators==null){
|
||||
generators=new TreeMap<Long, TxGenerator>();
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
String key="sg~"+String.format("%016x", id);
|
||||
it.seek(key);
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> val = it.next();
|
||||
if(!val.getKey().startsWith(key)) break;
|
||||
JSONObject jVal = new JSONObject(val.getValue());
|
||||
generators.put(jVal.getLong("id"), new TxGenerator(this, jVal));
|
||||
}
|
||||
}
|
||||
return new ArrayList<ITxGenerator>(generators.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxConcurrency() {
|
||||
if(maxConcurrency==null){
|
||||
getTransactions();
|
||||
}
|
||||
return maxConcurrency;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NavigableMap<Long, List<ITxEvent>> getEvents(){
|
||||
if(events==null){
|
||||
events=new TreeMap<Long, List<ITxEvent>>();
|
||||
for(Entry<Long, ITx> entry:getTransactions().entrySet()){
|
||||
ITx tx = entry.getValue();
|
||||
putEvent(new TxEvent(TxEvent.Type.BEGIN, tx));
|
||||
putEvent(new TxEvent(TxEvent.Type.END, tx));
|
||||
}
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
private void putEvent(TxEvent ev){
|
||||
Long time = ev.getTime();
|
||||
if(!events.containsKey(time)){
|
||||
Vector<ITxEvent> vector=new Vector<ITxEvent>();
|
||||
vector.add(ev);
|
||||
events.put(time, vector);
|
||||
} else {
|
||||
events.get(time).add(ev);
|
||||
}
|
||||
}
|
||||
|
||||
protected Map<Long, ITx> getTransactions() {
|
||||
if(transactions==null){
|
||||
if(generators==null) getGenerators();
|
||||
transactions = new TreeMap<Long, ITx>();
|
||||
maxConcurrency=0;
|
||||
SeekingIterator<String, String> it = levelDb.iterator();
|
||||
String key = "sgx~"+String.format("%016x", id);
|
||||
it.seek(key);
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> val = it.next();
|
||||
if(!val.getKey().startsWith(key)) break;
|
||||
String[] token = val.getKey().split("~");
|
||||
long gid = Long.parseLong(token[2], 16); // gen id
|
||||
long id = Long.parseLong(token[3], 16); // tx id
|
||||
ITx tx = new Tx(levelDb, this, generators.get(gid), id);
|
||||
transactions.put(id, tx);
|
||||
maxConcurrency= Math.max(maxConcurrency, tx.getConcurrencyIndex());
|
||||
}
|
||||
maxConcurrency++;
|
||||
}
|
||||
return transactions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ITxEvent> getWaveformEventsAtTime(Long time) {
|
||||
return getEvents().get(time);
|
||||
}
|
||||
|
||||
public void setRelationTypeList(List<RelationType> usedRelationsList){
|
||||
this.usedRelationsList=usedRelationsList;
|
||||
}
|
||||
|
||||
public RelationType getRelationType(String name) {
|
||||
RelationType relType=RelationType.create(name);
|
||||
if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType);
|
||||
return relType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean equals(IWaveform other) {
|
||||
return(other instanceof TxStream && this.getId()==other.getId());
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/>
|
||||
|
@ -1,8 +1,10 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
|
||||
org.eclipse.jdt.core.compiler.compliance=11
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.release=disabled
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||
org.eclipse.jdt.core.compiler.release=enabled
|
||||
org.eclipse.jdt.core.compiler.source=11
|
||||
|
@ -4,7 +4,7 @@ Bundle-Name: SQLite transaction database
|
||||
Bundle-SymbolicName: com.minres.scviewer.database.sqlite
|
||||
Bundle-Version: 1.1.0.qualifier
|
||||
Bundle-Vendor: MINRES Technologies GmbH
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-11
|
||||
Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0"
|
||||
Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar
|
||||
Service-Component: OSGI-INF/component.xml
|
||||
|
@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<packaging>eclipse-plugin</packaging>
|
||||
|
@ -14,12 +14,13 @@ import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NavigableMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.minres.scviewer.database.EventEntry;
|
||||
import com.minres.scviewer.database.EventKind;
|
||||
import com.minres.scviewer.database.HierNode;
|
||||
import com.minres.scviewer.database.IEvent;
|
||||
import com.minres.scviewer.database.IEventList;
|
||||
import com.minres.scviewer.database.EventList;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.RelationType;
|
||||
import com.minres.scviewer.database.RelationTypeFactory;
|
||||
@ -35,18 +36,18 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
|
||||
private Integer maxConcurrency;
|
||||
|
||||
private TreeMap<Long, IEvent[]> events;
|
||||
private IEventList events;
|
||||
|
||||
private List<RelationType> usedRelationsList;
|
||||
|
||||
public AbstractTxStream(IDatabase database, String name, long streamId) {
|
||||
protected AbstractTxStream(IDatabase database, String name, long streamId) {
|
||||
super(name);
|
||||
this.database=database;
|
||||
this.streamId=streamId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
public int getRowCount() {
|
||||
if(maxConcurrency==null){
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream=");
|
||||
@ -71,9 +72,9 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
}
|
||||
|
||||
@Override
|
||||
public NavigableMap<Long, IEvent[]> getEvents(){
|
||||
public IEventList getEvents(){
|
||||
if(events==null){
|
||||
events=new TreeMap<>();
|
||||
events=new EventList();
|
||||
for(Entry<Integer, ITx> entry:getTransactions().entrySet()){
|
||||
putEvent(new TxEvent(EventKind.BEGIN, entry.getValue()));
|
||||
putEvent(new TxEvent(EventKind.END, entry.getValue()));
|
||||
@ -83,22 +84,13 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
}
|
||||
|
||||
private void putEvent(TxEvent ev){
|
||||
Long time = ev.getTime();
|
||||
if(events.containsKey(time)) {
|
||||
IEvent[] oldV = events.get(time);
|
||||
IEvent[] newV = new IEvent[oldV.length+1];
|
||||
System.arraycopy(oldV, 0, newV, 0, oldV.length);
|
||||
newV[oldV.length]=ev;
|
||||
events.put(time, newV);
|
||||
} else {
|
||||
events.put(time, new IEvent[] {ev});
|
||||
}
|
||||
events.put(ev.getTime(), ev);
|
||||
}
|
||||
|
||||
protected abstract Map<Integer, ITx> getTransactions();
|
||||
|
||||
@Override
|
||||
public IEvent[] getEventsAtTime(Long time) {
|
||||
public IEvent[] getEventsAtTime(long time) {
|
||||
return getEvents().get(time);
|
||||
}
|
||||
|
||||
@ -113,12 +105,12 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEvent[] getEventsBeforeTime(Long time) {
|
||||
Entry<Long, IEvent[]> e = events.floorEntry(time);
|
||||
public IEvent[] getEventsBeforeTime(long time) {
|
||||
EventEntry e = events.floorEntry(time);
|
||||
if(e==null)
|
||||
return new IEvent[]{};
|
||||
else
|
||||
return events.floorEntry(time).getValue();
|
||||
return events.floorEntry(time).events;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -126,4 +118,11 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
return WaveformType.TRANSACTION;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate concurrency.
|
||||
*/
|
||||
public void calculateConcurrency() {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
||||
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
||||
|
||||
@Override
|
||||
public Long getMaxTime() {
|
||||
public long getMaxTime() {
|
||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
||||
database, "time = (SELECT MAX(time) FROM ScvTxEvent)");
|
||||
try {
|
||||
@ -56,7 +56,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
||||
if(!event.isEmpty())
|
||||
return event.get(0).getTime()*scvSimProps.getTime_resolution();
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0L;
|
||||
@ -73,33 +73,32 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
||||
streams.add(stream);
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
return streams;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canLoad(File inputFile) {
|
||||
if (!inputFile.isDirectory() && inputFile.exists()) {
|
||||
try(InputStream stream = new FileInputStream(inputFile)){
|
||||
byte[] buffer = new byte[x.length];
|
||||
int readCnt = stream.read(buffer, 0, x.length);
|
||||
if (readCnt == x.length) {
|
||||
for (int i = 0; i < x.length; i++)
|
||||
if (buffer[i] != x[i])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// @Override
|
||||
// public boolean canLoad(File inputFile) {
|
||||
// if (!inputFile.isDirectory() && inputFile.exists()) {
|
||||
// try(InputStream stream = new FileInputStream(inputFile)){
|
||||
// byte[] buffer = new byte[x.length];
|
||||
// int readCnt = stream.read(buffer, 0, x.length);
|
||||
// if (readCnt == x.length) {
|
||||
// for (int i = 0; i < x.length; i++)
|
||||
// if (buffer[i] != x[i])
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// } catch (Exception e) {
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void load(IWaveformDb db, File file) throws InputFormatException {
|
||||
dispose();
|
||||
database=new SQLiteDatabase(file.getAbsolutePath(), db);
|
||||
database.setData("TIMERESOLUTION", 1L);
|
||||
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database);
|
||||
@ -110,7 +109,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
|
||||
}
|
||||
pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null);
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
throw new InputFormatException(e.toString());
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ import com.minres.scviewer.database.sqlite.tables.ScvTxEvent;
|
||||
import com.minres.scviewer.database.sqlite.tables.ScvTxRelation;
|
||||
import com.minres.scviewer.database.tx.ITx;
|
||||
import com.minres.scviewer.database.tx.ITxAttribute;
|
||||
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||
import com.minres.scviewer.database.tx.ITxRelation;
|
||||
|
||||
public class Tx implements ITx {
|
||||
@ -38,8 +37,8 @@ public class Tx implements ITx {
|
||||
private TxGenerator trGenerator;
|
||||
private ScvTx scvTx;
|
||||
private List<ITxAttribute> attributes;
|
||||
private Long begin;
|
||||
private Long end;
|
||||
private long begin=-1;
|
||||
private long end=-1;
|
||||
private List<ITxRelation> incoming;
|
||||
private List<ITxRelation> outgoing;
|
||||
|
||||
@ -51,7 +50,7 @@ public class Tx implements ITx {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
public long getId() {
|
||||
return (long) scvTx.getId();
|
||||
}
|
||||
|
||||
@ -61,18 +60,17 @@ public class Tx implements ITx {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITxGenerator getGenerator() {
|
||||
public IWaveform getGenerator() {
|
||||
return trGenerator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getConcurrencyIndex() {
|
||||
int getConcurrencyIndex() {
|
||||
return scvTx.getConcurrencyLevel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getBeginTime() {
|
||||
if(begin==null){
|
||||
public long getBeginTime() {
|
||||
if(begin<0){
|
||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal());
|
||||
try {
|
||||
@ -80,15 +78,15 @@ public class Tx implements ITx {
|
||||
begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
}
|
||||
return begin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getEndTime() {
|
||||
if(end==null){
|
||||
public long getEndTime() {
|
||||
if(end<0){
|
||||
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
|
||||
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal());
|
||||
try {
|
||||
@ -96,7 +94,7 @@ public class Tx implements ITx {
|
||||
end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
}
|
||||
return end;
|
||||
@ -114,7 +112,7 @@ public class Tx implements ITx {
|
||||
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
}
|
||||
return attributes;
|
||||
@ -131,7 +129,7 @@ public class Tx implements ITx {
|
||||
incoming.add(createRelation(scvRelation, false));
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
}
|
||||
return incoming;
|
||||
@ -148,7 +146,7 @@ public class Tx implements ITx {
|
||||
outgoing.add(createRelation(scvRelation, true));
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
}
|
||||
}
|
||||
return outgoing;
|
||||
@ -171,7 +169,7 @@ public class Tx implements ITx {
|
||||
else
|
||||
return new TxRelation(trStream.getRelationType(rel.getName()), that, this);
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@ -180,11 +178,11 @@ public class Tx implements ITx {
|
||||
|
||||
@Override
|
||||
public int compareTo(ITx o) {
|
||||
int res = this.getBeginTime().compareTo(o.getBeginTime());
|
||||
int res = Long.compare(this.getBeginTime(), o.getBeginTime());
|
||||
if(res!=0)
|
||||
return res;
|
||||
else
|
||||
return this.getId().compareTo(o.getId());
|
||||
return Long.compare(this.getId(), o.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -28,7 +28,7 @@ public class TxEvent implements ITxEvent {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getTime() {
|
||||
public long getTime() {
|
||||
return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime();
|
||||
}
|
||||
|
||||
@ -56,4 +56,10 @@ public class TxEvent implements ITxEvent {
|
||||
public WaveformType getType() {
|
||||
return WaveformType.TRANSACTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowIndex() {
|
||||
return ((Tx)tx).getConcurrencyIndex();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,9 +22,8 @@ import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler;
|
||||
import com.minres.scviewer.database.sqlite.tables.ScvGenerator;
|
||||
import com.minres.scviewer.database.sqlite.tables.ScvTx;
|
||||
import com.minres.scviewer.database.tx.ITx;
|
||||
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||
|
||||
public class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
public class TxGenerator extends AbstractTxStream {
|
||||
|
||||
private TxStream stream;
|
||||
|
||||
@ -40,15 +39,10 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
public long getId() {
|
||||
return (long) scvGenerator.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWaveform getStream() {
|
||||
return stream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return scvGenerator.getName();
|
||||
@ -56,7 +50,7 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
|
||||
@Override
|
||||
public boolean isSame(IWaveform other) {
|
||||
return(other instanceof TxGenerator && this.getId().equals(other.getId()));
|
||||
return(other instanceof TxGenerator && this.getId() == other.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -75,7 +69,7 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
transactions.put(scvTx.getId(), new Tx(database, (TxStream) stream, this, scvTx));
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import com.minres.scviewer.database.sqlite.tables.ScvGenerator;
|
||||
import com.minres.scviewer.database.sqlite.tables.ScvStream;
|
||||
import com.minres.scviewer.database.sqlite.tables.ScvTx;
|
||||
import com.minres.scviewer.database.tx.ITx;
|
||||
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||
|
||||
public class TxStream extends AbstractTxStream {
|
||||
|
||||
@ -50,11 +49,11 @@ public class TxStream extends AbstractTxStream {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
public long getId() {
|
||||
return (long) scvStream.getId();
|
||||
}
|
||||
|
||||
public List<ITxGenerator> getGenerators() {
|
||||
public List<IWaveform> getGenerators() {
|
||||
if(generators==null){
|
||||
SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<>(
|
||||
ScvGenerator.class, database, "stream="+scvStream.getId());
|
||||
@ -64,7 +63,7 @@ public class TxStream extends AbstractTxStream {
|
||||
generators.put(scvGenerator.getId(), new TxGenerator(database, this, scvGenerator));
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@ -82,7 +81,7 @@ public class TxStream extends AbstractTxStream {
|
||||
transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx));
|
||||
}
|
||||
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException | SQLException | IntrospectionException e) {
|
||||
| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@ -90,13 +89,13 @@ public class TxStream extends AbstractTxStream {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEvent[] getEventsAtTime(Long time) {
|
||||
public IEvent[] getEventsAtTime(long time) {
|
||||
return getEvents().get(time);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSame(IWaveform other) {
|
||||
return(other instanceof TxStream && this.getId().equals(other.getId()));
|
||||
return(other instanceof TxStream && this.getId() == other.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -75,10 +75,11 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
|
||||
* @throws IllegalAccessException
|
||||
* @throws IntrospectionException
|
||||
* @throws InvocationTargetException
|
||||
* @throws NoSuchMethodException
|
||||
*/
|
||||
public synchronized List<T> selectObjects() throws SQLException,
|
||||
InstantiationException, IllegalAccessException,
|
||||
IntrospectionException, InvocationTargetException {
|
||||
IntrospectionException, InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
|
||||
|
||||
Connection connection = null;
|
||||
Statement statement = null;
|
||||
@ -113,17 +114,18 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
|
||||
* @throws IllegalAccessException
|
||||
* @throws IntrospectionException
|
||||
* @throws InvocationTargetException
|
||||
* @throws NoSuchMethodException
|
||||
*/
|
||||
private List<T> createObjects(ResultSet resultSet)
|
||||
throws SQLException, InstantiationException,
|
||||
IllegalAccessException, IntrospectionException,
|
||||
InvocationTargetException {
|
||||
InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
|
||||
|
||||
List<T> list = new ArrayList<>();
|
||||
|
||||
while (resultSet.next()) {
|
||||
|
||||
T instance = type.newInstance();
|
||||
T instance = type.getDeclaredConstructor().newInstance();
|
||||
|
||||
for (Field field : type.getDeclaredFields()) {
|
||||
|
||||
|
@ -1,17 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="src" path="src/"/>
|
||||
<classpathentry exported="true" kind="lib" path="lib/mapdb-3.0.7.jar" sourcepath="lib/mapdb-3.0.7-sources.jar">
|
||||
<attributes>
|
||||
<attribute name="javadoc_location" value="jar:platform:/resource/com.minres.scviewer.database.text/lib/mapdb-3.0.7-javadoc.jar!/"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry exported="true" kind="lib" path="lib/kotlin-stdlib-1.2.42.jar"/>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lz4-1.3.0.jar"/>
|
||||
<classpathentry exported="true" kind="lib" path="lib/elsa-3.0.0-M5.jar"/>
|
||||
|
@ -1,9 +1,11 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
|
||||
org.eclipse.jdt.core.compiler.compliance=11
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.release=disabled
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||
org.eclipse.jdt.core.compiler.release=enabled
|
||||
org.eclipse.jdt.core.compiler.source=11
|
||||
|
@ -2,14 +2,15 @@ Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: Textual transaction database
|
||||
Bundle-SymbolicName: com.minres.scviewer.database.text
|
||||
Bundle-Version: 3.0.0.qualifier
|
||||
Bundle-Version: 4.0.1.qualifier
|
||||
Bundle-Vendor: MINRES Technologies GmbH
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-11
|
||||
Import-Package: org.osgi.framework;version="1.3.0"
|
||||
Require-Bundle: com.minres.scviewer.database,
|
||||
org.eclipse.osgi.services;bundle-version="3.4.0",
|
||||
com.google.guava;bundle-version="15.0.0",
|
||||
org.eclipse.collections;bundle-version="10.4.0"
|
||||
org.eclipse.collections;bundle-version="10.4.0",
|
||||
org.apache.commons.compress;bundle-version="1.20.0"
|
||||
Service-Component: OSGI-INF/component.xml
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Automatic-Module-Name: com.minres.scviewer.database.text
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoader">
|
||||
<implementation class="com.minres.scviewer.database.text.TextDbLoader"/>
|
||||
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoaderFactory">
|
||||
<implementation class="com.minres.scviewer.database.text.TextDbLoaderFactory"/>
|
||||
<service>
|
||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoader"/>
|
||||
<provide interface="com.minres.scviewer.database.IWaveformDbLoaderFactory"/>
|
||||
</service>
|
||||
</scr:component>
|
||||
|
@ -2,44 +2,13 @@
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>com.minres.scviewer.database.text</artifactId>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
<version>4.0.1-SNAPSHOT</version>
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<packaging>eclipse-plugin</packaging>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.eclipse.tycho</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.0</version>
|
||||
<configuration>
|
||||
<compilerId>groovy-eclipse-compiler</compilerId>
|
||||
<compilerArguments>
|
||||
<indy/><!-- optional; supported by batch 2.4.12-04+ -->
|
||||
</compilerArguments>
|
||||
<!-- set verbose to be true if you want lots of uninteresting messages -->
|
||||
<!-- <verbose>true</verbose> -->
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-eclipse-compiler</artifactId>
|
||||
<version>${groovy-eclipse-compiler-version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-eclipse-batch</artifactId>
|
||||
<version>${groovy-eclipse-batch-version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
@ -12,16 +12,16 @@
|
||||
package com.minres.scviewer.database.text;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NavigableMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.minres.scviewer.database.EventKind;
|
||||
import com.minres.scviewer.database.EventEntry;
|
||||
import com.minres.scviewer.database.EventList;
|
||||
import com.minres.scviewer.database.HierNode;
|
||||
import com.minres.scviewer.database.IEvent;
|
||||
import com.minres.scviewer.database.IEventList;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.WaveformType;
|
||||
import com.minres.scviewer.database.tx.ITx;
|
||||
import com.minres.scviewer.database.tx.ITxEvent;
|
||||
|
||||
/**
|
||||
@ -29,6 +29,8 @@ import com.minres.scviewer.database.tx.ITxEvent;
|
||||
*/
|
||||
abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
|
||||
private final String fullName;
|
||||
|
||||
/** The id. */
|
||||
private Long id;
|
||||
|
||||
@ -36,10 +38,10 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
protected TextDbLoader loader;
|
||||
|
||||
/** The events. */
|
||||
TreeMap<Long, IEvent[]> events = new TreeMap<>();
|
||||
IEventList events = new EventList();
|
||||
|
||||
/** The concurrency calculated. */
|
||||
boolean concurrencyCalculated = false;
|
||||
/** The max concurrency. */
|
||||
private int rowCount = -1;
|
||||
|
||||
/**
|
||||
* Instantiates a new abstract tx stream.
|
||||
@ -48,26 +50,29 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
* @param id the id
|
||||
* @param name the name
|
||||
*/
|
||||
public AbstractTxStream(TextDbLoader loader, Long id, String name) {
|
||||
protected AbstractTxStream(TextDbLoader loader, Long id, String name) {
|
||||
super(name);
|
||||
fullName=name;
|
||||
this.loader = loader;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the full hierarchical name.
|
||||
*
|
||||
* @return the full name
|
||||
*/
|
||||
@Override
|
||||
public String getFullName() {
|
||||
return fullName;
|
||||
}
|
||||
/**
|
||||
* Adds the event.
|
||||
*
|
||||
* @param evt the evt
|
||||
*/
|
||||
public void addEvent(ITxEvent evt) {
|
||||
if (!events.containsKey(evt.getTime()))
|
||||
events.put(evt.getTime(), new IEvent[] { evt });
|
||||
else {
|
||||
IEvent[] evts = events.get(evt.getTime());
|
||||
IEvent[] newEvts = Arrays.copyOf(evts, evts.length + 1);
|
||||
newEvts[evts.length] = evt;
|
||||
events.put(evt.getTime(), newEvts);
|
||||
}
|
||||
events.put(evt.getTime(), evt);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,9 +81,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
* @return the events
|
||||
*/
|
||||
@Override
|
||||
public NavigableMap<Long, IEvent[]> getEvents() {
|
||||
if (!concurrencyCalculated)
|
||||
calculateConcurrency();
|
||||
public IEventList getEvents() {
|
||||
return events;
|
||||
}
|
||||
|
||||
@ -89,9 +92,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
* @return the events at time
|
||||
*/
|
||||
@Override
|
||||
public IEvent[] getEventsAtTime(Long time) {
|
||||
if (!concurrencyCalculated)
|
||||
calculateConcurrency();
|
||||
public IEvent[] getEventsAtTime(long time) {
|
||||
return events.get(time);
|
||||
}
|
||||
|
||||
@ -102,14 +103,12 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
* @return the events before time
|
||||
*/
|
||||
@Override
|
||||
public IEvent[] getEventsBeforeTime(Long time) {
|
||||
if (!concurrencyCalculated)
|
||||
calculateConcurrency();
|
||||
Entry<Long, IEvent[]> e = events.floorEntry(time);
|
||||
public IEvent[] getEventsBeforeTime(long time) {
|
||||
EventEntry e = events.floorEntry(time);
|
||||
if (e == null)
|
||||
return new IEvent[] {};
|
||||
else
|
||||
return events.floorEntry(time).getValue();
|
||||
return events.floorEntry(time).events;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -128,32 +127,63 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||
* @return the id
|
||||
*/
|
||||
@Override
|
||||
public Long getId() {
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the width.
|
||||
*
|
||||
* @return the width
|
||||
*/
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
if (rowCount<0)
|
||||
calculateConcurrency();
|
||||
return rowCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate concurrency.
|
||||
*/
|
||||
synchronized void calculateConcurrency() {
|
||||
if (concurrencyCalculated)
|
||||
void calculateConcurrency() {
|
||||
if (rowCount>=0)
|
||||
return;
|
||||
ArrayList<Long> rowendtime = new ArrayList<>();
|
||||
events.entrySet().stream().forEach(entry -> {
|
||||
IEvent[] values = entry.getValue();
|
||||
Arrays.asList(values).stream().filter(e -> e.getKind() == EventKind.BEGIN).forEach(evt -> {
|
||||
Tx tx = (Tx) ((TxEvent) evt).getTransaction();
|
||||
ArrayList<Long> rowEndTime = new ArrayList<>();
|
||||
HashMap<Long, Integer> rowByTxId = new HashMap<>();
|
||||
for(EventEntry entry: events) {
|
||||
for(IEvent evt:entry.events) {
|
||||
TxEvent txEvt = (TxEvent) evt;
|
||||
ITx tx = txEvt.getTransaction();
|
||||
int rowIdx = 0;
|
||||
for (; rowIdx < rowendtime.size() && rowendtime.get(rowIdx) > tx.getBeginTime(); rowIdx++)
|
||||
;
|
||||
if (rowendtime.size() <= rowIdx)
|
||||
rowendtime.add(tx.getEndTime());
|
||||
else
|
||||
rowendtime.set(rowIdx, tx.getEndTime());
|
||||
tx.setConcurrencyIndex(rowIdx);
|
||||
});
|
||||
});
|
||||
concurrencyCalculated = true;
|
||||
switch(evt.getKind()) {
|
||||
case END:
|
||||
Long txId = txEvt.getTransaction().getId();
|
||||
txEvt.setConcurrencyIndex(rowByTxId.get(txId));
|
||||
rowByTxId.remove(txId);
|
||||
break;
|
||||
case SINGLE:
|
||||
for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++);
|
||||
if (rowEndTime.size() <= rowIdx)
|
||||
rowEndTime.add(tx.getEndTime());
|
||||
else
|
||||
rowEndTime.set(rowIdx, tx.getEndTime());
|
||||
((TxEvent) evt).setConcurrencyIndex(rowIdx);
|
||||
break;
|
||||
case BEGIN:
|
||||
for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++);
|
||||
if (rowEndTime.size() <= rowIdx)
|
||||
rowEndTime.add(tx.getEndTime());
|
||||
else
|
||||
rowEndTime.set(rowIdx, tx.getEndTime());
|
||||
((TxEvent) evt).setConcurrencyIndex(rowIdx);
|
||||
rowByTxId.put(tx.getId(), rowIdx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
rowCount=rowEndTime.size()>0?rowEndTime.size():1;
|
||||
getChildNodes().parallelStream().forEach(c -> ((TxGenerator)c).calculateConcurrency());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ package com.minres.scviewer.database.text;
|
||||
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyChangeSupport;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@ -28,14 +29,16 @@ import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;
|
||||
import org.eclipse.collections.impl.map.mutable.UnifiedMap;
|
||||
import org.mapdb.DB;
|
||||
import org.mapdb.DB.TreeMapSink;
|
||||
import org.mapdb.DBMaker;
|
||||
import org.mapdb.HTreeMap;
|
||||
import org.mapdb.Serializer;
|
||||
|
||||
import com.google.common.collect.HashMultimap;
|
||||
@ -55,6 +58,15 @@ import com.minres.scviewer.database.tx.ITx;
|
||||
*/
|
||||
public class TextDbLoader implements IWaveformDbLoader {
|
||||
|
||||
enum FileType { NONE, PLAIN, GZIP, LZ4};
|
||||
|
||||
/** the file size limit of a zipped txlog where the loader starts to use a file mapped database */
|
||||
private static final long MEMMAP_LIMIT=256l*1024l*1024l;
|
||||
|
||||
private static final long MAPDB_INITIAL_ALLOC = 512l*1024l*1024l;
|
||||
|
||||
private static final long MAPDB_INCREMENTAL_ALLOC = 128l*1024l*1024l;
|
||||
|
||||
/** The max time. */
|
||||
private Long maxTime = 0L;
|
||||
|
||||
@ -76,8 +88,6 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
/** The transactions. */
|
||||
Map<Long, ScvTx> transactions = null;
|
||||
|
||||
Map<Long, Long> id2index = new HashMap<>();
|
||||
|
||||
/** The attribute types. */
|
||||
final Map<String, TxAttributeType> attributeTypes = UnifiedMap.newMap();
|
||||
|
||||
@ -99,18 +109,59 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
/** The Constant x. */
|
||||
static final byte[] x = "scv_tr_stream".getBytes();
|
||||
|
||||
/**
|
||||
* Adds the property change listener.
|
||||
*
|
||||
* @param l the l
|
||||
*/
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener l) {
|
||||
pcs.addPropertyChangeListener(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the property change listener.
|
||||
*
|
||||
* @param l the l
|
||||
*/
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener l) {
|
||||
pcs.removePropertyChangeListener(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the max time.
|
||||
*
|
||||
* @return the max time
|
||||
*/
|
||||
@Override
|
||||
public Long getMaxTime() {
|
||||
public long getMaxTime() {
|
||||
return maxTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the transaction.
|
||||
*
|
||||
* @param txId the tx id
|
||||
* @return the transaction
|
||||
*/
|
||||
public ITx getTransaction(long txId) {
|
||||
if (txCache.containsKey(txId))
|
||||
return txCache.get(txId);
|
||||
if(transactions.containsKey(txId)) {
|
||||
Tx tx = new Tx(this, transactions.get(txId));
|
||||
txCache.put(txId, tx);
|
||||
return tx;
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
}
|
||||
|
||||
public ScvTx getScvTx(long id) {
|
||||
return transactions.get(id2index.get(id));
|
||||
if(transactions.containsKey(id))
|
||||
return transactions.get(id);
|
||||
else
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -120,33 +171,45 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
*/
|
||||
@Override
|
||||
public Collection<IWaveform> getAllWaves() {
|
||||
return new ArrayList<>(txStreams.values());
|
||||
ArrayList<IWaveform> ret = new ArrayList<>(txStreams.values());
|
||||
ret.addAll(txGenerators.values());
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can load.
|
||||
* Gets the all relation types.
|
||||
*
|
||||
* @param inputFile the input file
|
||||
* @return true, if successful
|
||||
* @return the all relation types
|
||||
*/
|
||||
@Override
|
||||
public boolean canLoad(File inputFile) {
|
||||
if (!inputFile.isDirectory() && inputFile.exists()) {
|
||||
boolean gzipped = isGzipped(inputFile);
|
||||
try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){
|
||||
byte[] buffer = new byte[x.length];
|
||||
int readCnt = stream.read(buffer, 0, x.length);
|
||||
if (readCnt == x.length) {
|
||||
for (int i = 0; i < x.length; i++)
|
||||
if (buffer[i] != x[i])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
public Collection<RelationType> getAllRelationTypes() {
|
||||
return relationTypes.values();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is gzipped.
|
||||
*
|
||||
* @param f the f
|
||||
* @return true, if is gzipped
|
||||
*/
|
||||
static FileType getFileType(File f) {
|
||||
try (InputStream is = new FileInputStream(f)) {
|
||||
byte[] signature = new byte[4];
|
||||
int nread = is.read(signature); // read the gzip signature
|
||||
if(nread >= 2 &&
|
||||
signature[0] == (byte) 0x1f &&
|
||||
signature[1] == (byte) 0x8b)
|
||||
return FileType.GZIP;
|
||||
else if(nread>=4 &&
|
||||
signature[0] == (byte) 0x04 &&
|
||||
signature[1] == (byte) 0x22 &&
|
||||
signature[2] == (byte) 0x4d &&
|
||||
signature[3] == (byte) 0x18)
|
||||
return FileType.LZ4;
|
||||
else
|
||||
return FileType.PLAIN;
|
||||
} catch (IOException e) {
|
||||
return FileType.NONE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -161,11 +224,10 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
@Override
|
||||
public void load(IWaveformDb db, File file) throws InputFormatException {
|
||||
dispose();
|
||||
boolean gzipped = isGzipped(file);
|
||||
if (file.length() < 75000000 * (gzipped ? 1 : 10)
|
||||
FileType fType = getFileType(file);
|
||||
if (file.length() < MEMMAP_LIMIT * (fType!=FileType.PLAIN ? 1 : 10)
|
||||
|| "memory".equals(System.getProperty("ScvBackingDB", "file")))
|
||||
mapDb = DBMaker.memoryDirectDB().allocateStartSize(512l * 1024l * 1024l)
|
||||
.allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make();
|
||||
mapDb = DBMaker.memoryDirectDB().make();
|
||||
else {
|
||||
File mapDbFile;
|
||||
try {
|
||||
@ -175,32 +237,23 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
throw new InputFormatException(e.toString());
|
||||
}
|
||||
mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap
|
||||
.fileMmapEnableIfSupported().fileMmapPreclearDisable().allocateStartSize(512l * 1024l * 1024l)
|
||||
.allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make();
|
||||
.fileMmapPreclearDisable().allocateStartSize(MAPDB_INITIAL_ALLOC)
|
||||
.allocateIncrement(MAPDB_INCREMENTAL_ALLOC).cleanerHackEnable().make();
|
||||
mapDbFile.deleteOnExit();
|
||||
}
|
||||
TextDbParser parser = new TextDbParser(this);
|
||||
try {
|
||||
parser.txSink = mapDb.treeMap("transactions", Serializer.LONG, Serializer.JAVA).createFromSink();
|
||||
parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file));
|
||||
transactions = parser.txSink.create();
|
||||
|
||||
parser.txSink = mapDb.hashMap("transactions", Serializer.LONG, Serializer.JAVA).create();
|
||||
InputStream is = new BufferedInputStream(new FileInputStream(file));
|
||||
parser.parseInput(fType==FileType.GZIP ? new GZIPInputStream(is) : fType==FileType.LZ4? new FramedLZ4CompressorInputStream(is) : is);
|
||||
} catch (IllegalArgumentException | ArrayIndexOutOfBoundsException e) {
|
||||
} catch (Exception e) {
|
||||
throw new InputFormatException(e.toString());
|
||||
} finally {
|
||||
transactions = parser.txSink;
|
||||
}
|
||||
for (TxStream stream : txStreams.values()) {
|
||||
Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
stream.calculateConcurrency();
|
||||
} catch (Exception e) {
|
||||
/* don't let exceptions bubble up */ }
|
||||
}
|
||||
};
|
||||
threads.add(t);
|
||||
t.start();
|
||||
}
|
||||
txStreams.values().parallelStream().forEach(TxStream::calculateConcurrency);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -222,31 +275,6 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is gzipped.
|
||||
*
|
||||
* @param f the f
|
||||
* @return true, if is gzipped
|
||||
*/
|
||||
private static boolean isGzipped(File f) {
|
||||
try (InputStream is = new FileInputStream(f)) {
|
||||
byte[] signature = new byte[2];
|
||||
int nread = is.read(signature); // read the gzip signature
|
||||
return nread == 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the all relation types.
|
||||
*
|
||||
* @return the all relation types
|
||||
*/
|
||||
public Collection<RelationType> getAllRelationTypes() {
|
||||
return relationTypes.values();
|
||||
}
|
||||
|
||||
/**
|
||||
* The Class TextDbParser.
|
||||
*/
|
||||
@ -275,7 +303,7 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
HashMap<Long, ScvTx> transactionById = new HashMap<>();
|
||||
|
||||
/** The tx sink. */
|
||||
TreeMapSink<Long, ScvTx> txSink;
|
||||
HTreeMap<Long, ScvTx> txSink;
|
||||
|
||||
/** The reader. */
|
||||
BufferedReader reader = null;
|
||||
@ -286,7 +314,6 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
/** The attr value lut. */
|
||||
Map<String, Integer> attrValueLut = new HashMap<>();
|
||||
|
||||
long indexCount = 0;
|
||||
/**
|
||||
* Instantiates a new text db parser.
|
||||
*
|
||||
@ -304,15 +331,22 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
* @throws IOException Signals that an I/O exception has occurred.
|
||||
* @throws InputFormatException Signals that the input format is wrong
|
||||
*/
|
||||
void parseInput(InputStream inputStream) throws IOException, InputFormatException {
|
||||
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
|
||||
String curLine = reader.readLine();
|
||||
String nextLine = null;
|
||||
while ((nextLine = reader.readLine()) != null && curLine != null) {
|
||||
curLine = parseLine(curLine, nextLine);
|
||||
}
|
||||
if (curLine != null)
|
||||
parseLine(curLine, nextLine);
|
||||
void parseInput(InputStream inputStream) throws InputFormatException {
|
||||
try {
|
||||
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
|
||||
String curLine = reader.readLine();
|
||||
String nextLine = null;
|
||||
while ((nextLine = reader.readLine()) != null && curLine != null) {
|
||||
curLine = parseLine(curLine, nextLine, false);
|
||||
}
|
||||
if (curLine != null)
|
||||
parseLine(curLine, nextLine, true);
|
||||
for(Entry<Long, ScvTx> e: transactionById.entrySet()) {
|
||||
ScvTx scvTx = e.getValue();
|
||||
scvTx.endTime=loader.maxTime;
|
||||
txSink.put(e.getKey(), scvTx);
|
||||
}
|
||||
} catch(IOException e) {}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -344,89 +378,87 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
* @throws IOException Signals that an I/O exception has occurred.
|
||||
* @throws InputFormatException Signals that the input format is wrong
|
||||
*/
|
||||
private String parseLine(String curLine, String nextLine) throws IOException, InputFormatException {
|
||||
String[] tokens = curLine.split("\\s+");
|
||||
if ("tx_record_attribute".equals(tokens[0])) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
String name = tokens[2].substring(1, tokens[2].length());
|
||||
DataType type = DataType.valueOf(tokens[3]);
|
||||
String remaining = tokens.length > 5 ? String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length))
|
||||
: "";
|
||||
TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD);
|
||||
transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining)));
|
||||
} else if ("tx_begin".equals(tokens[0])) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
Long genId = Long.parseLong(tokens[2]);
|
||||
TxGenerator gen = loader.txGenerators.get(genId);
|
||||
ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId,
|
||||
Long.parseLong(tokens[3]) * stringToScale(tokens[4]));
|
||||
loader.maxTime = loader.maxTime > scvTx.beginTime ? loader.maxTime : scvTx.beginTime;
|
||||
TxStream stream = loader.txStreams.get(gen.stream.getId());
|
||||
stream.setConcurrency(stream.getConcurrency() + 1);
|
||||
if (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
int idx = 0;
|
||||
while (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
String[] attrTokens = nextLine.split("\\s+");
|
||||
TxAttributeType attrType = gen.beginAttrs.get(idx);
|
||||
TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1]));
|
||||
scvTx.attributes.add(attr);
|
||||
idx++;
|
||||
nextLine = reader.readLine();
|
||||
private String parseLine(String curLine, String nextLine, boolean last) throws IOException, InputFormatException {
|
||||
if(curLine.charAt(0)=='t') {
|
||||
String[] tokens = curLine.split(" ");
|
||||
//if ("tx_record_attribute".equals(tokens[0]) && tokens.length>4) {
|
||||
if (curLine.charAt(5)=='c' && tokens.length>4) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
String name = tokens[2].substring(1, tokens[2].length()-1);
|
||||
DataType type = DataType.valueOf(tokens[3]);
|
||||
String remaining = tokens.length > 5 ? String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)) : "";
|
||||
TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD);
|
||||
transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining)));
|
||||
//} else if ("tx_begin".equals(tokens[0]) && tokens.length>4) {
|
||||
} else if (curLine.charAt(3)=='b' && tokens.length>4) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
Long genId = Long.parseLong(tokens[2]);
|
||||
TxGenerator gen = loader.txGenerators.get(genId);
|
||||
ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId,
|
||||
Long.parseLong(tokens[3]) * stringToScale(tokens[4]));
|
||||
loader.maxTime = loader.maxTime > scvTx.beginTime ? loader.maxTime : scvTx.beginTime;
|
||||
if (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
int idx = 0;
|
||||
while (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
String[] attrTokens = nextLine.split("\\s+");
|
||||
TxAttributeType attrType = gen.beginAttrs.get(idx);
|
||||
TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1]));
|
||||
scvTx.attributes.add(attr);
|
||||
idx++;
|
||||
nextLine = reader.readLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
transactionById.put(id, scvTx);
|
||||
} else if ("tx_end".equals(tokens[0])) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
ScvTx scvTx = transactionById.get(id);
|
||||
assert Long.parseLong(tokens[2]) == scvTx.generatorId;
|
||||
scvTx.endTime = Long.parseLong(tokens[3]) * stringToScale(tokens[4]);
|
||||
loader.maxTime = loader.maxTime > scvTx.endTime ? loader.maxTime : scvTx.endTime;
|
||||
TxGenerator gen = loader.txGenerators.get(scvTx.generatorId);
|
||||
TxStream stream = loader.txStreams.get(gen.stream.getId());
|
||||
if (scvTx.beginTime == scvTx.endTime) {
|
||||
TxEvent evt = new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime);
|
||||
stream.addEvent(evt);
|
||||
gen.addEvent(evt);
|
||||
} else {
|
||||
TxEvent begEvt = new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime);
|
||||
stream.addEvent(begEvt);
|
||||
gen.addEvent(begEvt);
|
||||
TxEvent endEvt = new TxEvent(loader, EventKind.END, id, scvTx.endTime);
|
||||
stream.addEvent(endEvt);
|
||||
gen.addEvent(endEvt);
|
||||
}
|
||||
stream.setConcurrency(stream.getConcurrency() - 1);
|
||||
if (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
int idx = 0;
|
||||
while (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
String[] attrTokens = nextLine.split("\\s+");
|
||||
TxAttributeType attrType = gen.endAttrs.get(idx);
|
||||
TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1]));
|
||||
scvTx.attributes.add(attr);
|
||||
idx++;
|
||||
nextLine = reader.readLine();
|
||||
transactionById.put(id, scvTx);
|
||||
//} else if ("tx_end".equals(tokens[0]) && tokens.length>4) {
|
||||
} else if (curLine.charAt(3)=='e' && tokens.length>4) {
|
||||
Long id = Long.parseLong(tokens[1]);
|
||||
ScvTx scvTx = transactionById.get(id);
|
||||
assert Long.parseLong(tokens[2]) == scvTx.generatorId;
|
||||
scvTx.endTime = Long.parseLong(tokens[3]) * stringToScale(tokens[4]);
|
||||
loader.maxTime = loader.maxTime > scvTx.endTime ? loader.maxTime : scvTx.endTime;
|
||||
TxGenerator gen = loader.txGenerators.get(scvTx.generatorId);
|
||||
TxStream stream = loader.txStreams.get(gen.stream.getId());
|
||||
if (scvTx.beginTime == scvTx.endTime) {
|
||||
stream.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime));
|
||||
gen.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime));
|
||||
} else {
|
||||
stream.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime));
|
||||
gen.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime));
|
||||
stream.addEvent(new TxEvent(loader, EventKind.END, id, scvTx.endTime));
|
||||
gen.addEvent(new TxEvent(loader, EventKind.END, id, scvTx.endTime));
|
||||
}
|
||||
if (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
int idx = 0;
|
||||
while (nextLine != null && nextLine.charAt(0) == 'a') {
|
||||
String[] attrTokens = nextLine.split("\\s+");
|
||||
TxAttributeType attrType = gen.endAttrs.get(idx);
|
||||
TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1]));
|
||||
scvTx.attributes.add(attr);
|
||||
idx++;
|
||||
nextLine = reader.readLine();
|
||||
}
|
||||
}
|
||||
txSink.put(scvTx.getId(), scvTx);
|
||||
transactionById.remove(id);
|
||||
//} else if ("tx_relation".equals(tokens[0]) && tokens.length>3) {
|
||||
} else if (curLine.charAt(5)=='l' && tokens.length>3) {
|
||||
Long tr2 = Long.parseLong(tokens[2]);
|
||||
Long tr1 = Long.parseLong(tokens[3]);
|
||||
String relType = tokens[1].substring(1, tokens[1].length() - 1);
|
||||
if (!loader.relationTypes.containsKey(relType))
|
||||
loader.relationTypes.put(relType, RelationTypeFactory.create(relType));
|
||||
ScvRelation rel = new ScvRelation(loader.relationTypes.get(relType), tr1, tr2);
|
||||
loader.relationsOut.put(tr1, rel);
|
||||
loader.relationsIn.put(tr2, rel);
|
||||
}
|
||||
txSink.put(indexCount, scvTx);
|
||||
loader.id2index.put(scvTx.getId(), indexCount++);
|
||||
transactionById.remove(id);
|
||||
} else if ("tx_relation".equals(tokens[0])) {
|
||||
Long tr2 = Long.parseLong(tokens[2]);
|
||||
Long tr1 = Long.parseLong(tokens[3]);
|
||||
String relType = tokens[1].substring(1, tokens[1].length() - 1);
|
||||
if (!loader.relationTypes.containsKey(relType))
|
||||
loader.relationTypes.put(relType, RelationTypeFactory.create(relType));
|
||||
ScvRelation rel = new ScvRelation(loader.relationTypes.get(relType), tr1, tr2);
|
||||
loader.relationsOut.put(tr1, rel);
|
||||
loader.relationsIn.put(tr2, rel);
|
||||
} else if ("scv_tr_stream".equals(tokens[0])) {
|
||||
} else if (curLine.length()>13 && "scv_tr_stream".equals(curLine.substring(0, 13))) {
|
||||
Matcher matcher = scv_tr_stream.matcher(curLine);
|
||||
if (matcher.matches()) {
|
||||
Long id = Long.parseLong(matcher.group(1));
|
||||
TxStream stream = new TxStream(loader, id, matcher.group(2), matcher.group(3));
|
||||
add(id, stream);
|
||||
}
|
||||
} else if ("scv_tr_generator".equals(tokens[0])) {
|
||||
} else if (curLine.length()>16 && "scv_tr_generator".equals(curLine.substring(0, 16))) {
|
||||
Matcher matcher = scv_tr_generator.matcher(curLine);
|
||||
if ((matcher.matches())) {
|
||||
Long id = Long.parseLong(matcher.group(1));
|
||||
@ -434,23 +466,23 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
generator = new TxGenerator(loader, id, matcher.group(2), stream);
|
||||
add(id, generator);
|
||||
}
|
||||
} else if ("begin_attribute".equals(tokens[0])) {
|
||||
} else if (curLine.length()>15 && "begin_attribute".equals(curLine.substring(0, 15))) {
|
||||
Matcher matcher = begin_attribute.matcher(curLine);
|
||||
if ((matcher.matches())) {
|
||||
TxAttributeType attrType = getAttrType(matcher.group(2), DataType.valueOf(matcher.group(3)),
|
||||
AssociationType.BEGIN);
|
||||
generator.beginAttrs.add(attrType);
|
||||
}
|
||||
} else if ("end_attribute".equals(tokens[0])) {
|
||||
} else if (curLine.length()>13 && "end_attribute".equals(curLine.substring(0, 13))) {
|
||||
Matcher matcher = end_attribute.matcher(curLine);
|
||||
if ((matcher.matches())) {
|
||||
TxAttributeType attrType = getAttrType(matcher.group(2), DataType.valueOf(matcher.group(3)),
|
||||
AssociationType.END);
|
||||
generator.endAttrs.add(attrType);
|
||||
}
|
||||
} else if (")".equals(tokens[0])) {
|
||||
} else if (curLine.charAt(0) == ')') {
|
||||
generator = null;
|
||||
} else
|
||||
} else if(!last)
|
||||
throw new InputFormatException("Don't know what to do with: '" + curLine + "'");
|
||||
return nextLine;
|
||||
}
|
||||
@ -515,38 +547,4 @@ public class TextDbLoader implements IWaveformDbLoader {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the transaction.
|
||||
*
|
||||
* @param txId the tx id
|
||||
* @return the transaction
|
||||
*/
|
||||
public ITx getTransaction(long txId) {
|
||||
if (txCache.containsKey(txId))
|
||||
return txCache.get(txId);
|
||||
Tx tx = new Tx(this, txId);
|
||||
txCache.put(txId, tx);
|
||||
return tx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the property change listener.
|
||||
*
|
||||
* @param l the l
|
||||
*/
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener l) {
|
||||
pcs.addPropertyChangeListener(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the property change listener.
|
||||
*
|
||||
* @param l the l
|
||||
*/
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener l) {
|
||||
pcs.removePropertyChangeListener(l);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,77 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2012 IT Just working.
|
||||
* Copyright (c) 2020 MINRES Technologies GmbH
|
||||
* 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
|
||||
*
|
||||
* Contributors:
|
||||
* IT Just working - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.minres.scviewer.database.text;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;
|
||||
|
||||
import com.minres.scviewer.database.IWaveformDbLoader;
|
||||
import com.minres.scviewer.database.IWaveformDbLoaderFactory;
|
||||
import com.minres.scviewer.database.text.TextDbLoader.FileType;
|
||||
|
||||
/**
|
||||
* The Class TextDbLoader.
|
||||
*/
|
||||
public class TextDbLoaderFactory implements IWaveformDbLoaderFactory {
|
||||
|
||||
/** The Constant x. */
|
||||
static final byte[] x = "scv_tr_stream".getBytes();
|
||||
|
||||
/**
|
||||
* Checks if f is gzipped.
|
||||
*
|
||||
* @param f the f
|
||||
* @return true, if is gzipped
|
||||
*/
|
||||
private static boolean isGzipped(File f) {
|
||||
try (InputStream is = new FileInputStream(f)) {
|
||||
byte[] signature = new byte[2];
|
||||
int nread = is.read(signature); // read the gzip signature
|
||||
return nread == 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Can load.
|
||||
*
|
||||
* @param inputFile the input file
|
||||
* @return true, if successful
|
||||
*/
|
||||
@Override
|
||||
public boolean canLoad(File inputFile) {
|
||||
FileType fType = TextDbLoader.getFileType(inputFile);
|
||||
try (InputStream is = new FileInputStream(inputFile)) {
|
||||
InputStream plainIs = fType==FileType.GZIP ? new GZIPInputStream(is) : fType==FileType.LZ4? new FramedLZ4CompressorInputStream(is) : is;
|
||||
byte[] buffer = new byte[x.length];
|
||||
int readCnt = plainIs.read(buffer, 0, x.length);
|
||||
if (readCnt == x.length) {
|
||||
for (int i = 0; i < x.length; i++)
|
||||
if (buffer[i] != x[i]) return false;
|
||||
}
|
||||
return true;
|
||||
} catch (IOException e) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWaveformDbLoader getLoader() {
|
||||
return new TextDbLoader();
|
||||
}
|
||||
}
|
@ -19,7 +19,6 @@ import java.util.stream.Collectors;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.tx.ITx;
|
||||
import com.minres.scviewer.database.tx.ITxAttribute;
|
||||
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||
import com.minres.scviewer.database.tx.ITxRelation;
|
||||
|
||||
/**
|
||||
@ -30,8 +29,14 @@ class Tx implements ITx {
|
||||
/** The loader. */
|
||||
private final TextDbLoader loader;
|
||||
|
||||
private ScvTx scvTx =null;
|
||||
|
||||
/** The id. */
|
||||
private long id;
|
||||
private final long id;
|
||||
|
||||
private final long generatorId;
|
||||
|
||||
private final long streamId;
|
||||
|
||||
/** The begin time. */
|
||||
long beginTime = -1;
|
||||
@ -39,9 +44,6 @@ class Tx implements ITx {
|
||||
/** The end time. */
|
||||
long endTime = -1;
|
||||
|
||||
/** The concurrency index. */
|
||||
private int concurrencyIndex;
|
||||
|
||||
/**
|
||||
* Instantiates a new tx.
|
||||
*
|
||||
@ -51,6 +53,10 @@ class Tx implements ITx {
|
||||
public Tx(TextDbLoader loader, ScvTx scvTx) {
|
||||
this.loader = loader;
|
||||
id = scvTx.id;
|
||||
generatorId=scvTx.generatorId;
|
||||
streamId=scvTx.streamId;
|
||||
beginTime=scvTx.beginTime;
|
||||
endTime=scvTx.endTime;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -59,9 +65,11 @@ class Tx implements ITx {
|
||||
* @param loader the loader
|
||||
* @param txId the tx id
|
||||
*/
|
||||
public Tx(TextDbLoader loader, long txId) {
|
||||
public Tx(TextDbLoader loader, long id, long generatorId, long streamId) {
|
||||
this.loader = loader;
|
||||
id = txId;
|
||||
this.id = id;
|
||||
this.generatorId=generatorId;
|
||||
this.streamId = streamId;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -94,11 +102,11 @@ class Tx implements ITx {
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(ITx o) {
|
||||
int res = getBeginTime().compareTo(o.getBeginTime());
|
||||
int res = Long.compare(getBeginTime(), o.getBeginTime());
|
||||
if (res != 0)
|
||||
return res;
|
||||
else
|
||||
return getId().compareTo(o.getId());
|
||||
return Long.compare(getId(), o.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -113,7 +121,7 @@ class Tx implements ITx {
|
||||
return true;
|
||||
if (obj == null || getClass() != obj.getClass())
|
||||
return false;
|
||||
return this.loader.getScvTx(id).equals(((Tx) obj).loader.getScvTx(id));
|
||||
return this.getScvTx().equals(((Tx) obj).getScvTx());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,7 +131,7 @@ class Tx implements ITx {
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return loader.getScvTx(id).hashCode();
|
||||
return getScvTx().hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -142,8 +150,8 @@ class Tx implements ITx {
|
||||
* @return the id
|
||||
*/
|
||||
@Override
|
||||
public Long getId() {
|
||||
return loader.getScvTx(id).id;
|
||||
public long getId() {
|
||||
return getScvTx().id;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -153,7 +161,7 @@ class Tx implements ITx {
|
||||
*/
|
||||
@Override
|
||||
public IWaveform getStream() {
|
||||
return loader.txStreams.get(loader.getScvTx(id).streamId);
|
||||
return loader.txStreams.get(streamId);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -162,8 +170,8 @@ class Tx implements ITx {
|
||||
* @return the generator
|
||||
*/
|
||||
@Override
|
||||
public ITxGenerator getGenerator() {
|
||||
return loader.txGenerators.get(loader.getScvTx(id).generatorId);
|
||||
public IWaveform getGenerator() {
|
||||
return loader.txGenerators.get(generatorId);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,9 +180,12 @@ class Tx implements ITx {
|
||||
* @return the begin time
|
||||
*/
|
||||
@Override
|
||||
public Long getBeginTime() {
|
||||
if (beginTime < 0)
|
||||
beginTime = loader.getScvTx(id).beginTime;
|
||||
public long getBeginTime() {
|
||||
if (beginTime < 0) {
|
||||
ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx();
|
||||
beginTime = tx.beginTime;
|
||||
endTime = tx.endTime;
|
||||
}
|
||||
return beginTime;
|
||||
}
|
||||
|
||||
@ -184,9 +195,12 @@ class Tx implements ITx {
|
||||
* @return the end time
|
||||
*/
|
||||
@Override
|
||||
public Long getEndTime() {
|
||||
if (endTime < 0)
|
||||
endTime = loader.getScvTx(id).endTime;
|
||||
public long getEndTime() {
|
||||
if (endTime < 0) {
|
||||
ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx();
|
||||
beginTime = tx.beginTime;
|
||||
endTime = tx.endTime;
|
||||
}
|
||||
return endTime;
|
||||
}
|
||||
|
||||
@ -196,26 +210,7 @@ class Tx implements ITx {
|
||||
* @param time the new end time
|
||||
*/
|
||||
void setEndTime(Long time) {
|
||||
loader.getScvTx(id).endTime = time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the concurrency index.
|
||||
*
|
||||
* @return the concurrency index
|
||||
*/
|
||||
@Override
|
||||
public int getConcurrencyIndex() {
|
||||
return concurrencyIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the concurrency index.
|
||||
*
|
||||
* @param idx the new concurrency index
|
||||
*/
|
||||
void setConcurrencyIndex(int idx) {
|
||||
concurrencyIndex = idx;
|
||||
getScvTx().endTime = time;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -225,7 +220,12 @@ class Tx implements ITx {
|
||||
*/
|
||||
@Override
|
||||
public List<ITxAttribute> getAttributes() {
|
||||
return loader.getScvTx(id).attributes;
|
||||
return getScvTx().attributes;
|
||||
}
|
||||
|
||||
private ScvTx getScvTx() {
|
||||
if(scvTx==null)
|
||||
scvTx=loader.getScvTx(id);
|
||||
return scvTx;
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ class TxEvent implements ITxEvent {
|
||||
/** The time. */
|
||||
final long time;
|
||||
|
||||
private int concurrencyIdx=-1;
|
||||
/**
|
||||
* Instantiates a new tx event.
|
||||
*
|
||||
@ -94,7 +95,7 @@ class TxEvent implements ITxEvent {
|
||||
* @return the time
|
||||
*/
|
||||
@Override
|
||||
public Long getTime() {
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
@ -107,4 +108,13 @@ class TxEvent implements ITxEvent {
|
||||
public ITx getTransaction() {
|
||||
return loader.getTransaction(transaction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowIndex() {
|
||||
return concurrencyIdx;
|
||||
}
|
||||
|
||||
public void setConcurrencyIndex(int idx) {
|
||||
concurrencyIdx=idx;
|
||||
}
|
||||
}
|
||||
|
@ -15,12 +15,11 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.tx.ITxGenerator;
|
||||
|
||||
/**
|
||||
* The Class TxGenerator.
|
||||
*/
|
||||
class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
class TxGenerator extends AbstractTxStream {
|
||||
|
||||
/** The stream. */
|
||||
TxStream stream;
|
||||
@ -45,16 +44,6 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
stream.addChild(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the stream.
|
||||
*
|
||||
* @return the stream
|
||||
*/
|
||||
@Override
|
||||
public IWaveform getStream() {
|
||||
return stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is same.
|
||||
*
|
||||
@ -63,7 +52,7 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
*/
|
||||
@Override
|
||||
public boolean isSame(IWaveform other) {
|
||||
return (other instanceof TxGenerator && this.getId().equals(other.getId()));
|
||||
return (other instanceof TxGenerator && this.getId()==other.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -95,12 +84,13 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the width.
|
||||
* Gets the full hierarchical name.
|
||||
*
|
||||
* @return the width
|
||||
* @return the full name
|
||||
*/
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return stream.getWidth();
|
||||
public String getFullName() {
|
||||
return ((AbstractTxStream)parent).getFullName()+"."+name;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ class TxStream extends AbstractTxStream {
|
||||
*/
|
||||
@Override
|
||||
public boolean isSame(IWaveform other) {
|
||||
return (other instanceof TxStream && this.getId().equals(other.getId()));
|
||||
return (other instanceof TxStream && this.getId() == other.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -55,40 +55,4 @@ class TxStream extends AbstractTxStream {
|
||||
return kind;
|
||||
}
|
||||
|
||||
/** The max concurrency. */
|
||||
private int maxConcurrency = 0;
|
||||
|
||||
/** The concurrency. */
|
||||
private int concurrency = 0;
|
||||
|
||||
/**
|
||||
* Sets the concurrency.
|
||||
*
|
||||
* @param concurrency the new concurrency
|
||||
*/
|
||||
void setConcurrency(int concurrency) {
|
||||
this.concurrency = concurrency;
|
||||
if (concurrency > maxConcurrency)
|
||||
maxConcurrency = concurrency;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the concurrency.
|
||||
*
|
||||
* @return the concurrency
|
||||
*/
|
||||
int getConcurrency() {
|
||||
return this.concurrency;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the width.
|
||||
*
|
||||
* @return the width
|
||||
*/
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return maxConcurrency;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
|
@ -9,8 +9,8 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
|
||||
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
|
||||
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
|
||||
org.eclipse.jdt.core.compiler.compliance=11
|
||||
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
|
||||
@ -21,6 +21,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
|
||||
@ -66,6 +67,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=igno
|
||||
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
|
||||
@ -98,5 +100,5 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
|
||||
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||
org.eclipse.jdt.core.compiler.release=disabled
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
||||
org.eclipse.jdt.core.compiler.release=enabled
|
||||
org.eclipse.jdt.core.compiler.source=11
|
||||
|
@ -2,9 +2,9 @@ Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: SWT database widget
|
||||
Bundle-SymbolicName: com.minres.scviewer.database.ui.swt
|
||||
Bundle-Version: 3.0.0.qualifier
|
||||
Bundle-Version: 4.0.0.qualifier
|
||||
Bundle-Vendor: MINRES Technologies GmbH
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-11
|
||||
Require-Bundle: org.eclipse.swt;bundle-version="3.103.1",
|
||||
com.minres.scviewer.database;bundle-version="1.0.0",
|
||||
com.google.guava;bundle-version="15.0.0",
|
||||
|
@ -5,8 +5,8 @@
|
||||
<parent>
|
||||
<groupId>com.minres.scviewer</groupId>
|
||||
<artifactId>com.minres.scviewer.parent</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.16.1</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
<version>4.0.0-SNAPSHOT</version>
|
||||
</project>
|
||||
|
@ -27,9 +27,13 @@ import com.minres.scviewer.database.tx.ITx;
|
||||
|
||||
public interface IWaveformView extends PropertyChangeListener, ISelectionProvider{
|
||||
|
||||
String CURSOR_PROPERTY = "cursor_time";
|
||||
static final String CURSOR_PROPERTY = "cursor_time";
|
||||
|
||||
String MARKER_PROPERTY = "marker_time";
|
||||
static final String MARKER_PROPERTY = "marker_time";
|
||||
|
||||
static final int CURSOR_POS = 0;
|
||||
|
||||
static final int MARKER_POS = 1;
|
||||
|
||||
public static final RelationType NEXT_PREV_IN_STREAM = RelationTypeFactory.create("Prev/Next in stream");
|
||||
|
||||
@ -75,23 +79,17 @@ public interface IWaveformView extends PropertyChangeListener, ISelectionProvide
|
||||
|
||||
public void setHighliteRelation(RelationType relationType);
|
||||
|
||||
public long getMaxTime();
|
||||
|
||||
public void setMaxTime(long maxTime);
|
||||
|
||||
public void setZoomLevel(int scale);
|
||||
|
||||
public int getZoomLevel();
|
||||
|
||||
public void setCursorTime(long time);
|
||||
|
||||
public void setMarkerTime(long time, int index);
|
||||
public void setMarkerTime(int marker, long time);
|
||||
|
||||
public long getCursorTime();
|
||||
|
||||
public int getSelectedMarkerId();
|
||||
public int getSelectedMarker();
|
||||
|
||||
public long getMarkerTime(int index);
|
||||
public long getMarkerTime(int marker);
|
||||
|
||||
public void addPropertyChangeListener(PropertyChangeListener listener);
|
||||
|
||||
@ -101,21 +99,18 @@ public interface IWaveformView extends PropertyChangeListener, ISelectionProvide
|
||||
|
||||
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener);
|
||||
|
||||
public String getScaledTime(long time);
|
||||
|
||||
public String[] getZoomLevels();
|
||||
|
||||
public List<ICursor> getCursorList();
|
||||
|
||||
public long getBaselineTime();
|
||||
|
||||
public void setBaselineTime(Long scale);
|
||||
|
||||
public void scrollHorizontal(int percent);
|
||||
|
||||
public void scrollTo(int pos);
|
||||
|
||||
public void addDisposeListener( DisposeListener listener );
|
||||
|
||||
public void deleteSelectedTracks();
|
||||
|
||||
public TrackEntry addWaveform(IWaveform waveform, int pos);
|
||||
|
||||
public IWaveformZoom getWaveformZoom();
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.minres.scviewer.database.ui;
|
||||
|
||||
public interface IWaveformZoom {
|
||||
|
||||
long getMaxVisibleTime();
|
||||
|
||||
long getMinVisibleTime();
|
||||
|
||||
void setMinVisibleTime(long scale);
|
||||
|
||||
long getMaxTime();
|
||||
|
||||
long getScale();
|
||||
|
||||
void setScale(long factor);
|
||||
|
||||
void setVisibleRange(long startTime, long endTime);
|
||||
|
||||
void centerAt(long time);
|
||||
|
||||
void zoom(ZoomKind kind);
|
||||
|
||||
String timeToString(long time);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user