Compare commits

...

86 Commits

Author SHA1 Message Date
788065e456 Merge branch 'release/2.13.1' 2021-03-25 21:09:49 +00:00
22b46e0525 fix fit zoom level calculation 2021-03-25 21:07:05 +00:00
b75018239a Merge branch 'master' into develop
Conflicts:
	features/com.minres.scviewer.database.feature/pom.xml
	features/com.minres.scviewer.e4.feature/pom.xml
	features/com.minres.scviewer.e4.platform.feature/pom.xml
	features/com.minres.scviewer.feature/pom.xml
	features/com.minres.scviewer.ui.feature/pom.xml
	plugins/com.minres.scviewer.database.sqlite/pom.xml
	plugins/com.minres.scviewer.database.text/pom.xml
	plugins/com.minres.scviewer.database.ui.swt/pom.xml
	plugins/com.minres.scviewer.database.vcd/pom.xml
	plugins/com.minres.scviewer.database/pom.xml
	plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF
	plugins/com.minres.scviewer.e4.application/pom.xml
	plugins/com.minres.scviewer.ui/pom.xml
	pom.xml
	products/com.minres.scviewer.e4.product/pom.xml
	products/com.minres.scviewer.e4.product/scviewer.product
	releng/com.minres.scviewer.target/pom.xml
	releng/com.minres.scviewer.updateSite/pom.xml
	tests/com.minres.scviewer.database.test/pom.xml
2021-03-25 20:46:30 +00:00
598bb8eec7 Merge remote-tracking branch 'origin/master' 2021-03-25 20:33:25 +00:00
869265fc13 add gzip files to file dialog filter 2021-03-25 20:27:55 +00:00
5ad813527a fix CLI handling 2021-03-25 20:27:55 +00:00
73f8d3d50a fix full name display of generators 2021-03-25 20:27:55 +00:00
da1701195d update version numbers 2021-03-25 20:27:55 +00:00
9b6334509e update version numbers 2021-03-25 20:27:54 +00:00
ac4acc34a4 fix warning and left-overs 2021-03-25 20:27:54 +00:00
b6963f38d6 move interface to primitive types 2021-03-25 20:27:54 +00:00
182a036ade some more refactoring 2021-03-25 20:27:53 +00:00
97f2182290 adapt painter 2021-03-25 20:27:53 +00:00
1986a8c9c3 add explicit event list 2021-03-25 20:27:53 +00:00
6905d96329 add TreeMap facade 2021-03-25 20:27:52 +00:00
818f786b1d add dispose check in case view is closed while loading db 2021-03-25 20:27:52 +00:00
2948c1bd33 update version numbers 2021-03-25 20:22:15 +00:00
78faab404c apply UI fixes
* wrong arrow target of transaction
* wrong zomm factor calculation for zoom fit
* streams and waveforms not visible if at root level
2021-03-25 20:18:50 +00:00
64b10970a8 add gzip files to file dialog filter 2021-03-02 21:55:52 +01:00
6ab8fd232e fix CLI handling 2021-03-02 21:55:52 +01:00
f337a94112 fix full name display of generators 2021-03-02 21:55:52 +01:00
0135631a3e update version numbers 2021-03-02 21:55:52 +01:00
d0e1e8801f update version numbers 2021-03-02 21:55:52 +01:00
d1b3a91979 fix warning and left-overs 2021-03-02 21:55:52 +01:00
45c1396e0e move interface to primitive types 2021-03-02 21:55:51 +01:00
b7301733f0 some more refactoring 2021-03-02 21:55:51 +01:00
5df91dbaa8 adapt painter 2021-03-02 21:55:51 +01:00
68918689e7 add explicit event list 2021-03-02 21:55:51 +01:00
c41dd646da add TreeMap facade 2021-03-02 21:55:51 +01:00
a077389b83 add dispose check in case view is closed while loading db 2021-03-02 21:55:51 +01:00
caa37375c0 add gzip files to file dialog filter 2021-03-02 21:42:54 +01:00
3daea8ab43 fix CLI handling 2021-03-02 19:32:21 +01:00
c5d77af0d0 fix full name display of generators 2021-03-02 19:32:09 +01:00
7f7fdf09f4 update version numbers 2021-02-27 19:13:28 +00:00
7aba6a2ecb update version numbers 2021-02-27 19:13:17 +00:00
012395b933 Merge branch 'feature/eclipse_collections' into develop 2021-02-27 18:47:31 +00:00
787e3accc0 fix warning and left-overs 2021-02-27 14:00:29 +00:00
b778940c83 move interface to primitive types 2021-02-27 13:59:00 +00:00
71297c4e5a some more refactoring 2021-02-27 13:47:37 +00:00
1d2395e00d adapt painter 2021-02-27 13:33:15 +00:00
b69e1886b9 add explicit event list 2021-02-27 13:27:51 +00:00
d65803a4b7 add TreeMap facade 2021-02-26 11:57:54 +00:00
0e49a68e09 add dispose check in case view is closed while loading db 2021-02-24 08:46:19 +00:00
7af5593fd4 Merge branch 'release/2.12.2' into develop 2021-02-24 07:05:00 +00:00
25545dac51 Merge branch 'release/2.12.2' 2021-02-24 07:04:59 +00:00
df77af64ca update version numbers 2021-02-24 07:04:47 +00:00
e264ab2cbe fix name display in waveform view (#6) 2021-02-24 06:56:28 +00:00
8c17ed4146 Merge branch 'release/2.12.1' into develop 2021-02-18 08:19:17 +00:00
4ee2e8bc68 Merge branch 'release/2.12.1' 2021-02-18 08:19:16 +00:00
bdcba613d5 fix version numbers 2021-02-18 08:18:47 +00:00
049de0ddaf add VM arguments for Java > 9 2021-02-18 08:14:12 +00:00
6be3f378d4 renmove deprecated newInstance call 2021-02-18 06:32:14 +00:00
6d8aa33fc9 update language level 2021-02-18 06:26:42 +00:00
b37ba9f2f1 Merge branch 'master' into develop 2021-02-17 21:15:33 +00:00
799f083a74 fix hierarchy display 2021-02-17 21:14:28 +00:00
156abe63cd fix display bug 2021-02-17 20:27:58 +00:00
d38016a03f fix display bug 2021-02-17 20:24:25 +00:00
5604c3ee5e Merge branch 'release/2.12.0' 2021-01-15 16:50:33 +01:00
5adeae15a9 change name of generated product artifacts 2021-01-15 15:52:28 +01:00
bca94ceb9d fix stream row calculation 2021-01-15 15:51:59 +01:00
a42f086339 set max heap to 2GB by default 2021-01-14 23:56:04 +01:00
888edf32be remove ITxGenerator interface 2021-01-14 23:55:47 +01:00
ee5536f1b5 update version numbers 2021-01-14 23:51:18 +01:00
59859e5d90 cache some more infos for stream 2021-01-14 23:36:29 +01:00
5bae086712 fix (Sonarlint) warnings 2021-01-14 23:36:07 +01:00
16de83616a adapt ui to database API 2021-01-14 23:14:22 +01:00
6530362b89 refactor tests 2021-01-14 23:14:05 +01:00
0372e03abb minor database API change 2021-01-14 23:13:11 +01:00
26e8ea8a51 change design browser icons 2021-01-14 21:57:27 +01:00
efd042dd22 fix duplicate version numbers 2021-01-12 20:28:51 +01:00
d06642d51f Merge branch 'release/2.11.2' into develop 2021-01-12 20:25:46 +01:00
f27bcd7109 Merge branch 'release/2.11.2' 2021-01-12 20:25:45 +01:00
eaea5a4653 update version numbers 2021-01-12 20:25:34 +01:00
fa4bd0ddd5 move database to hashmap 2021-01-12 11:46:21 +01:00
3cbbdbee92 reduce default JVM heap size 2021-01-12 11:30:59 +01:00
d674e155e1 fix wrong name extraction 2021-01-12 11:30:37 +01:00
cb3366a559 fix project setup 2021-01-12 07:36:41 +01:00
8de0e11226 Merge branch 'release/2.11.1' 2021-01-12 07:36:02 +01:00
b12232329b Merge branch 'release/2.11.1' into develop 2021-01-12 07:36:02 +01:00
5e63972500 update version numbers 2021-01-12 07:34:36 +01:00
d53db967b3 Merge branch 'hotfix/tx_end_time_fix' into develop 2021-01-12 07:18:25 +01:00
12b08ca8c6 fix version numbers to adhere to eclipse versioning 2021-01-10 16:26:46 +01:00
bb60f3a9c8 fix bintray repo layout 2021-01-10 15:27:40 +01:00
ba347a258d refactor structure 2021-01-10 14:40:25 +01:00
ac41feff6e cleanup 2021-01-10 14:34:12 +01:00
d2cf13d64b Merge branch 'release/2.11.0' into develop 2021-01-10 13:37:39 +01:00
156 changed files with 1367 additions and 2778 deletions

3
.gitignore vendored
View File

@ -8,4 +8,5 @@ SCViewer.xcf
SCViewer_1.png SCViewer_1.png
copyrightLog.txt copyrightLog.txt
/workspace /workspace
?*.launch ?*.launch
/.settings/

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>3.0.0-SNAPSHOT</version> <version>3.0.0-SNAPSHOT</version>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>1.1.0-SNAPSHOT</version> <version>1.1.0-SNAPSHOT</version>

View File

@ -29,6 +29,10 @@
id="org.eclipse.emf.common" id="org.eclipse.emf.common"
version="0.0.0"/> version="0.0.0"/>
<includes
id="org.eclipse.collections.feature"
version="0.0.0"/>
<requires> <requires>
<import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/> <import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/>
<import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/> <import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>1.1.0-SNAPSHOT</version> <version>1.1.0-SNAPSHOT</version>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>1.1.0-SNAPSHOT</version> <version>1.1.0-SNAPSHOT</version>

View File

@ -1,4 +0,0 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry exported="true" kind="lib" path="json-20180813.jar" sourcepath="json-20180813-sources.jar"/>
<classpathentry exported="true" kind="lib" path="leveldb-0.11-SNAPSHOT-uber.jar" sourcepath="leveldb-0.11-SNAPSHOT-sources.jar"/>
<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.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,4 +0,0 @@
/json-20180813-sources.jar
/leveldb-0.11-SNAPSHOT-sources.jar
/bin/
/target/

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.minres.scviewer.database.leveldb</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ds.core.builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -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

View File

@ -1,4 +0,0 @@
eclipse.preferences.version=1
pluginProject.equinox=false
pluginProject.extensions=false
resolve.requirebundle=false

View File

@ -1,5 +0,0 @@
eclipse.preferences.version=1
enabled=true
path=OSGI-INF
validationErrorLevel=error
validationErrorLevel.missingImplicitUnbindMethod=error

View File

@ -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

View File

@ -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>

View File

@ -1,7 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
OSGI-INF/,\
leveldb-0.11-SNAPSHOT-uber.jar,\
json-20180813.jar

View File

@ -1,13 +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.database.leveldb</artifactId>
<version>1.0.0-SNAPSHOT</version>
<parent>
<groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<packaging>eclipse-plugin</packaging>
</project>

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/> <classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/>

View File

@ -1,8 +1,10 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11

View File

@ -4,7 +4,7 @@ Bundle-Name: SQLite transaction database
Bundle-SymbolicName: com.minres.scviewer.database.sqlite Bundle-SymbolicName: com.minres.scviewer.database.sqlite
Bundle-Version: 1.1.0.qualifier Bundle-Version: 1.1.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH 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" Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0"
Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar
Service-Component: OSGI-INF/component.xml Service-Component: OSGI-INF/component.xml

View File

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View File

@ -14,12 +14,13 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; 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.EventKind;
import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.IEvent; 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.IWaveform;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.RelationTypeFactory; import com.minres.scviewer.database.RelationTypeFactory;
@ -35,18 +36,18 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
private Integer maxConcurrency; private Integer maxConcurrency;
private TreeMap<Long, IEvent[]> events; private IEventList events;
private List<RelationType> usedRelationsList; private List<RelationType> usedRelationsList;
public AbstractTxStream(IDatabase database, String name, long streamId) { protected AbstractTxStream(IDatabase database, String name, long streamId) {
super(name); super(name);
this.database=database; this.database=database;
this.streamId=streamId; this.streamId=streamId;
} }
@Override @Override
public int getWidth() { public int getRowCount() {
if(maxConcurrency==null){ if(maxConcurrency==null){
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream=");
@ -71,9 +72,9 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
} }
@Override @Override
public NavigableMap<Long, IEvent[]> getEvents(){ public IEventList getEvents(){
if(events==null){ if(events==null){
events=new TreeMap<>(); events=new EventList();
for(Entry<Integer, ITx> entry:getTransactions().entrySet()){ for(Entry<Integer, ITx> entry:getTransactions().entrySet()){
putEvent(new TxEvent(EventKind.BEGIN, entry.getValue())); putEvent(new TxEvent(EventKind.BEGIN, entry.getValue()));
putEvent(new TxEvent(EventKind.END, 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){ private void putEvent(TxEvent ev){
Long time = ev.getTime(); events.put(ev.getTime(), ev);
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});
}
} }
protected abstract Map<Integer, ITx> getTransactions(); protected abstract Map<Integer, ITx> getTransactions();
@Override @Override
public IEvent[] getEventsAtTime(Long time) { public IEvent[] getEventsAtTime(long time) {
return getEvents().get(time); return getEvents().get(time);
} }
@ -113,12 +105,12 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
} }
@Override @Override
public IEvent[] getEventsBeforeTime(Long time) { public IEvent[] getEventsBeforeTime(long time) {
Entry<Long, IEvent[]> e = events.floorEntry(time); EventEntry e = events.floorEntry(time);
if(e==null) if(e==null)
return new IEvent[]{}; return new IEvent[]{};
else else
return events.floorEntry(time).getValue(); return events.floorEntry(time).events;
} }
@Override @Override
@ -126,4 +118,11 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
return WaveformType.TRANSACTION; return WaveformType.TRANSACTION;
} }
/**
* Calculate concurrency.
*/
public void calculateConcurrency() {
}
} }

View File

@ -48,7 +48,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
@Override @Override
public Long getMaxTime() { public long getMaxTime() {
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
database, "time = (SELECT MAX(time) FROM ScvTxEvent)"); database, "time = (SELECT MAX(time) FROM ScvTxEvent)");
try { try {
@ -56,7 +56,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
if(!event.isEmpty()) if(!event.isEmpty())
return event.get(0).getTime()*scvSimProps.getTime_resolution(); return event.get(0).getTime()*scvSimProps.getTime_resolution();
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
return 0L; return 0L;
@ -73,7 +73,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
streams.add(stream); streams.add(stream);
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
return streams; return streams;
} }
@ -99,7 +99,6 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
@Override @Override
public void load(IWaveformDb db, File file) throws InputFormatException { public void load(IWaveformDb db, File file) throws InputFormatException {
dispose();
database=new SQLiteDatabase(file.getAbsolutePath(), db); database=new SQLiteDatabase(file.getAbsolutePath(), db);
database.setData("TIMERESOLUTION", 1L); database.setData("TIMERESOLUTION", 1L);
SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database); SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database);
@ -110,7 +109,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader {
} }
pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null); pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null);
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
throw new InputFormatException(e.toString()); throw new InputFormatException(e.toString());
} }
} }

View File

@ -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.sqlite.tables.ScvTxRelation;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxAttribute; import com.minres.scviewer.database.tx.ITxAttribute;
import com.minres.scviewer.database.tx.ITxGenerator;
import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.tx.ITxRelation;
public class Tx implements ITx { public class Tx implements ITx {
@ -38,8 +37,8 @@ public class Tx implements ITx {
private TxGenerator trGenerator; private TxGenerator trGenerator;
private ScvTx scvTx; private ScvTx scvTx;
private List<ITxAttribute> attributes; private List<ITxAttribute> attributes;
private Long begin; private long begin=-1;
private Long end; private long end=-1;
private List<ITxRelation> incoming; private List<ITxRelation> incoming;
private List<ITxRelation> outgoing; private List<ITxRelation> outgoing;
@ -51,7 +50,7 @@ public class Tx implements ITx {
} }
@Override @Override
public Long getId() { public long getId() {
return (long) scvTx.getId(); return (long) scvTx.getId();
} }
@ -61,18 +60,17 @@ public class Tx implements ITx {
} }
@Override @Override
public ITxGenerator getGenerator() { public IWaveform getGenerator() {
return trGenerator; return trGenerator;
} }
@Override int getConcurrencyIndex() {
public int getConcurrencyIndex() {
return scvTx.getConcurrencyLevel(); return scvTx.getConcurrencyLevel();
} }
@Override @Override
public Long getBeginTime() { public long getBeginTime() {
if(begin==null){ if(begin<0){
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal()); database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal());
try { try {
@ -80,15 +78,15 @@ public class Tx implements ITx {
begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION"); begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
} }
return begin; return begin;
} }
@Override @Override
public Long getEndTime() { public long getEndTime() {
if(end==null){ if(end<0){
SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class,
database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal()); database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal());
try { try {
@ -96,7 +94,7 @@ public class Tx implements ITx {
end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION"); end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION");
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
} }
return end; return end;
@ -114,7 +112,7 @@ public class Tx implements ITx {
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
} }
return attributes; return attributes;
@ -131,7 +129,7 @@ public class Tx implements ITx {
incoming.add(createRelation(scvRelation, false)); incoming.add(createRelation(scvRelation, false));
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
} }
return incoming; return incoming;
@ -148,7 +146,7 @@ public class Tx implements ITx {
outgoing.add(createRelation(scvRelation, true)); outgoing.add(createRelation(scvRelation, true));
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
} }
} }
return outgoing; return outgoing;
@ -171,7 +169,7 @@ public class Tx implements ITx {
else else
return new TxRelation(trStream.getRelationType(rel.getName()), that, this); return new TxRelation(trStream.getRelationType(rel.getName()), that, this);
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -180,11 +178,11 @@ public class Tx implements ITx {
@Override @Override
public int compareTo(ITx o) { public int compareTo(ITx o) {
int res = this.getBeginTime().compareTo(o.getBeginTime()); int res = Long.compare(this.getBeginTime(), o.getBeginTime());
if(res!=0) if(res!=0)
return res; return res;
else else
return this.getId().compareTo(o.getId()); return Long.compare(this.getId(), o.getId());
} }
@Override @Override

View File

@ -28,7 +28,7 @@ public class TxEvent implements ITxEvent {
} }
@Override @Override
public Long getTime() { public long getTime() {
return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime(); return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime();
} }
@ -56,4 +56,10 @@ public class TxEvent implements ITxEvent {
public WaveformType getType() { public WaveformType getType() {
return WaveformType.TRANSACTION; return WaveformType.TRANSACTION;
} }
@Override
public int getRowIndex() {
return ((Tx)tx).getConcurrencyIndex();
}
} }

View File

@ -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.ScvGenerator;
import com.minres.scviewer.database.sqlite.tables.ScvTx; import com.minres.scviewer.database.sqlite.tables.ScvTx;
import com.minres.scviewer.database.tx.ITx; 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; private TxStream stream;
@ -40,15 +39,10 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
} }
@Override @Override
public Long getId() { public long getId() {
return (long) scvGenerator.getId(); return (long) scvGenerator.getId();
} }
@Override
public IWaveform getStream() {
return stream;
}
@Override @Override
public String getName() { public String getName() {
return scvGenerator.getName(); return scvGenerator.getName();
@ -56,7 +50,7 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
@Override @Override
public boolean isSame(IWaveform other) { public boolean isSame(IWaveform other) {
return(other instanceof TxGenerator && this.getId().equals(other.getId())); return(other instanceof TxGenerator && this.getId() == other.getId());
} }
@Override @Override
@ -75,7 +69,7 @@ public class TxGenerator extends AbstractTxStream implements ITxGenerator {
transactions.put(scvTx.getId(), new Tx(database, (TxStream) stream, this, scvTx)); transactions.put(scvTx.getId(), new Tx(database, (TxStream) stream, this, scvTx));
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -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.ScvStream;
import com.minres.scviewer.database.sqlite.tables.ScvTx; import com.minres.scviewer.database.sqlite.tables.ScvTx;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxGenerator;
public class TxStream extends AbstractTxStream { public class TxStream extends AbstractTxStream {
@ -50,11 +49,11 @@ public class TxStream extends AbstractTxStream {
} }
@Override @Override
public Long getId() { public long getId() {
return (long) scvStream.getId(); return (long) scvStream.getId();
} }
public List<ITxGenerator> getGenerators() { public List<IWaveform> getGenerators() {
if(generators==null){ if(generators==null){
SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<>( SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<>(
ScvGenerator.class, database, "stream="+scvStream.getId()); ScvGenerator.class, database, "stream="+scvStream.getId());
@ -64,7 +63,7 @@ public class TxStream extends AbstractTxStream {
generators.put(scvGenerator.getId(), new TxGenerator(database, this, scvGenerator)); generators.put(scvGenerator.getId(), new TxGenerator(database, this, scvGenerator));
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -82,7 +81,7 @@ public class TxStream extends AbstractTxStream {
transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx)); transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx));
} }
} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException
| InvocationTargetException | SQLException | IntrospectionException e) { | InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -90,13 +89,13 @@ public class TxStream extends AbstractTxStream {
} }
@Override @Override
public IEvent[] getEventsAtTime(Long time) { public IEvent[] getEventsAtTime(long time) {
return getEvents().get(time); return getEvents().get(time);
} }
@Override @Override
public boolean isSame(IWaveform other) { public boolean isSame(IWaveform other) {
return(other instanceof TxStream && this.getId().equals(other.getId())); return(other instanceof TxStream && this.getId() == other.getId());
} }
@Override @Override

View File

@ -75,10 +75,11 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws IntrospectionException * @throws IntrospectionException
* @throws InvocationTargetException * @throws InvocationTargetException
* @throws NoSuchMethodException
*/ */
public synchronized List<T> selectObjects() throws SQLException, public synchronized List<T> selectObjects() throws SQLException,
InstantiationException, IllegalAccessException, InstantiationException, IllegalAccessException,
IntrospectionException, InvocationTargetException { IntrospectionException, InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
Connection connection = null; Connection connection = null;
Statement statement = null; Statement statement = null;
@ -113,17 +114,18 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> {
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws IntrospectionException * @throws IntrospectionException
* @throws InvocationTargetException * @throws InvocationTargetException
* @throws NoSuchMethodException
*/ */
private List<T> createObjects(ResultSet resultSet) private List<T> createObjects(ResultSet resultSet)
throws SQLException, InstantiationException, throws SQLException, InstantiationException,
IllegalAccessException, IntrospectionException, IllegalAccessException, IntrospectionException,
InvocationTargetException { InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException {
List<T> list = new ArrayList<>(); List<T> list = new ArrayList<>();
while (resultSet.next()) { while (resultSet.next()) {
T instance = type.newInstance(); T instance = type.getDeclaredConstructor().newInstance();
for (Field field : type.getDeclaredFields()) { for (Field field : type.getDeclaredFields()) {

View File

@ -1,10 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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"/>
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry exported="true" kind="lib" path="lib/mapdb-3.0.7.jar" sourcepath="lib/mapdb-3.0.7-sources.jar"> <classpathentry exported="true" kind="lib" path="lib/mapdb-3.0.7.jar" sourcepath="lib/mapdb-3.0.7-sources.jar">
<attributes> <attributes>

View File

@ -1,9 +1,11 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11

View File

@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: Textual transaction database Bundle-Name: Textual transaction database
Bundle-SymbolicName: com.minres.scviewer.database.text Bundle-SymbolicName: com.minres.scviewer.database.text
Bundle-Version: 3.0.0.qualifier Bundle-Version: 4.0.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH Bundle-Vendor: MINRES Technologies GmbH
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: org.osgi.framework;version="1.3.0" Import-Package: org.osgi.framework;version="1.3.0"
Require-Bundle: com.minres.scviewer.database, Require-Bundle: com.minres.scviewer.database,
org.eclipse.osgi.services;bundle-version="3.4.0", org.eclipse.osgi.services;bundle-version="3.4.0",

View File

@ -2,44 +2,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 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> <modelVersion>4.0.0</modelVersion>
<artifactId>com.minres.scviewer.database.text</artifactId> <artifactId>com.minres.scviewer.database.text</artifactId>
<version>3.0.0-SNAPSHOT</version> <version>4.0.0-SNAPSHOT</version>
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<packaging>eclipse-plugin</packaging> <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> </project>

View File

@ -12,16 +12,16 @@
package com.minres.scviewer.database.text; package com.minres.scviewer.database.text;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.HashMap;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeMap;
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.HierNode;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.WaveformType;
import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxEvent; 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 { abstract class AbstractTxStream extends HierNode implements IWaveform {
private final String fullName;
/** The id. */ /** The id. */
private Long id; private Long id;
@ -36,10 +38,10 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
protected TextDbLoader loader; protected TextDbLoader loader;
/** The events. */ /** The events. */
TreeMap<Long, IEvent[]> events = new TreeMap<>(); IEventList events = new EventList();
/** The concurrency calculated. */ /** The max concurrency. */
boolean concurrencyCalculated = false; private int rowCount = -1;
/** /**
* Instantiates a new abstract tx stream. * Instantiates a new abstract tx stream.
@ -48,26 +50,29 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
* @param id the id * @param id the id
* @param name the name * @param name the name
*/ */
public AbstractTxStream(TextDbLoader loader, Long id, String name) { protected AbstractTxStream(TextDbLoader loader, Long id, String name) {
super(name); super(name);
fullName=name;
this.loader = loader; this.loader = loader;
this.id = id; this.id = id;
} }
/**
* Gets the full hierarchical name.
*
* @return the full name
*/
@Override
public String getFullName() {
return fullName;
}
/** /**
* Adds the event. * Adds the event.
* *
* @param evt the evt * @param evt the evt
*/ */
public void addEvent(ITxEvent evt) { public void addEvent(ITxEvent evt) {
if (!events.containsKey(evt.getTime())) events.put(evt.getTime(), evt);
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);
}
} }
/** /**
@ -76,9 +81,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
* @return the events * @return the events
*/ */
@Override @Override
public NavigableMap<Long, IEvent[]> getEvents() { public IEventList getEvents() {
if (!concurrencyCalculated)
calculateConcurrency();
return events; return events;
} }
@ -89,9 +92,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
* @return the events at time * @return the events at time
*/ */
@Override @Override
public IEvent[] getEventsAtTime(Long time) { public IEvent[] getEventsAtTime(long time) {
if (!concurrencyCalculated)
calculateConcurrency();
return events.get(time); return events.get(time);
} }
@ -102,14 +103,12 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
* @return the events before time * @return the events before time
*/ */
@Override @Override
public IEvent[] getEventsBeforeTime(Long time) { public IEvent[] getEventsBeforeTime(long time) {
if (!concurrencyCalculated) EventEntry e = events.floorEntry(time);
calculateConcurrency();
Entry<Long, IEvent[]> e = events.floorEntry(time);
if (e == null) if (e == null)
return new IEvent[] {}; return new IEvent[] {};
else 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 * @return the id
*/ */
@Override @Override
public Long getId() { public long getId() {
return id; return id;
} }
/**
* Gets the width.
*
* @return the width
*/
@Override
public int getRowCount() {
if (rowCount<0)
calculateConcurrency();
return rowCount;
}
/** /**
* Calculate concurrency. * Calculate concurrency.
*/ */
synchronized void calculateConcurrency() { void calculateConcurrency() {
if (concurrencyCalculated) if (rowCount>=0)
return; return;
ArrayList<Long> rowendtime = new ArrayList<>(); ArrayList<Long> rowEndTime = new ArrayList<>();
events.entrySet().stream().forEach(entry -> { HashMap<Long, Integer> rowByTxId = new HashMap<>();
IEvent[] values = entry.getValue(); for(EventEntry entry: events) {
Arrays.asList(values).stream().filter(e -> e.getKind() == EventKind.BEGIN).forEach(evt -> { for(IEvent evt:entry.events) {
Tx tx = (Tx) ((TxEvent) evt).getTransaction(); TxEvent txEvt = (TxEvent) evt;
ITx tx = txEvt.getTransaction();
int rowIdx = 0; int rowIdx = 0;
for (; rowIdx < rowendtime.size() && rowendtime.get(rowIdx) > tx.getBeginTime(); rowIdx++) switch(evt.getKind()) {
; case END:
if (rowendtime.size() <= rowIdx) Long txId = txEvt.getTransaction().getId();
rowendtime.add(tx.getEndTime()); txEvt.setConcurrencyIndex(rowByTxId.get(txId));
else rowByTxId.remove(txId);
rowendtime.set(rowIdx, tx.getEndTime()); break;
tx.setConcurrencyIndex(rowIdx); case SINGLE:
}); for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++);
}); if (rowEndTime.size() <= rowIdx)
concurrencyCalculated = true; 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());
} }
} }

View File

@ -28,14 +28,15 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import org.eclipse.collections.impl.map.mutable.UnifiedMap; import org.eclipse.collections.impl.map.mutable.UnifiedMap;
import org.mapdb.DB; import org.mapdb.DB;
import org.mapdb.DB.TreeMapSink;
import org.mapdb.DBMaker; import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
import org.mapdb.Serializer; import org.mapdb.Serializer;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
@ -55,6 +56,13 @@ import com.minres.scviewer.database.tx.ITx;
*/ */
public class TextDbLoader implements IWaveformDbLoader { public class TextDbLoader implements IWaveformDbLoader {
/** 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. */ /** The max time. */
private Long maxTime = 0L; private Long maxTime = 0L;
@ -76,8 +84,6 @@ public class TextDbLoader implements IWaveformDbLoader {
/** The transactions. */ /** The transactions. */
Map<Long, ScvTx> transactions = null; Map<Long, ScvTx> transactions = null;
Map<Long, Long> id2index = new HashMap<>();
/** The attribute types. */ /** The attribute types. */
final Map<String, TxAttributeType> attributeTypes = UnifiedMap.newMap(); final Map<String, TxAttributeType> attributeTypes = UnifiedMap.newMap();
@ -99,18 +105,59 @@ public class TextDbLoader implements IWaveformDbLoader {
/** The Constant x. */ /** The Constant x. */
static final byte[] x = "scv_tr_stream".getBytes(); 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. * Gets the max time.
* *
* @return the max time * @return the max time
*/ */
@Override @Override
public Long getMaxTime() { public long getMaxTime() {
return maxTime; 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) { public ScvTx getScvTx(long id) {
return transactions.get(id2index.get(id)); if(transactions.containsKey(id))
return transactions.get(id);
else
throw new IllegalArgumentException();
} }
/** /**
@ -120,7 +167,18 @@ public class TextDbLoader implements IWaveformDbLoader {
*/ */
@Override @Override
public Collection<IWaveform> getAllWaves() { public Collection<IWaveform> getAllWaves() {
return new ArrayList<>(txStreams.values()); ArrayList<IWaveform> ret = new ArrayList<>(txStreams.values());
ret.addAll(txGenerators.values());
return ret;
}
/**
* Gets the all relation types.
*
* @return the all relation types
*/
public Collection<RelationType> getAllRelationTypes() {
return relationTypes.values();
} }
/** /**
@ -149,6 +207,22 @@ public class TextDbLoader implements IWaveformDbLoader {
return false; return false;
} }
/**
* 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;
}
}
/** /**
* Load. * Load.
* *
@ -162,10 +236,9 @@ public class TextDbLoader implements IWaveformDbLoader {
public void load(IWaveformDb db, File file) throws InputFormatException { public void load(IWaveformDb db, File file) throws InputFormatException {
dispose(); dispose();
boolean gzipped = isGzipped(file); boolean gzipped = isGzipped(file);
if (file.length() < 75000000 * (gzipped ? 1 : 10) if (file.length() < MEMMAP_LIMIT * (gzipped ? 1 : 10)
|| "memory".equals(System.getProperty("ScvBackingDB", "file"))) || "memory".equals(System.getProperty("ScvBackingDB", "file")))
mapDb = DBMaker.memoryDirectDB().allocateStartSize(512l * 1024l * 1024l) mapDb = DBMaker.memoryDirectDB().make();
.allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make();
else { else {
File mapDbFile; File mapDbFile;
try { try {
@ -175,32 +248,21 @@ public class TextDbLoader implements IWaveformDbLoader {
throw new InputFormatException(e.toString()); throw new InputFormatException(e.toString());
} }
mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap
.fileMmapEnableIfSupported().fileMmapPreclearDisable().allocateStartSize(512l * 1024l * 1024l) .fileMmapPreclearDisable().allocateStartSize(MAPDB_INITIAL_ALLOC)
.allocateIncrement(128l * 1024l * 1024l).cleanerHackEnable().make(); .allocateIncrement(MAPDB_INCREMENTAL_ALLOC).cleanerHackEnable().make();
mapDbFile.deleteOnExit(); mapDbFile.deleteOnExit();
} }
TextDbParser parser = new TextDbParser(this); TextDbParser parser = new TextDbParser(this);
try { try {
parser.txSink = mapDb.treeMap("transactions", Serializer.LONG, Serializer.JAVA).createFromSink();
parser.txSink = mapDb.hashMap("transactions", Serializer.LONG, Serializer.JAVA).create();
parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file)); parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file));
transactions = parser.txSink.create(); transactions = parser.txSink;
} catch (IllegalArgumentException | ArrayIndexOutOfBoundsException e) { } catch (IllegalArgumentException | ArrayIndexOutOfBoundsException e) {
} catch (Exception e) { } catch (Exception e) {
throw new InputFormatException(e.toString()); throw new InputFormatException(e.toString());
} }
for (TxStream stream : txStreams.values()) { txStreams.values().parallelStream().forEach(TxStream::calculateConcurrency);
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();
}
} }
/** /**
@ -222,31 +284,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. * The Class TextDbParser.
*/ */
@ -275,7 +312,7 @@ public class TextDbLoader implements IWaveformDbLoader {
HashMap<Long, ScvTx> transactionById = new HashMap<>(); HashMap<Long, ScvTx> transactionById = new HashMap<>();
/** The tx sink. */ /** The tx sink. */
TreeMapSink<Long, ScvTx> txSink; HTreeMap<Long, ScvTx> txSink;
/** The reader. */ /** The reader. */
BufferedReader reader = null; BufferedReader reader = null;
@ -286,7 +323,6 @@ public class TextDbLoader implements IWaveformDbLoader {
/** The attr value lut. */ /** The attr value lut. */
Map<String, Integer> attrValueLut = new HashMap<>(); Map<String, Integer> attrValueLut = new HashMap<>();
long indexCount = 0;
/** /**
* Instantiates a new text db parser. * Instantiates a new text db parser.
* *
@ -313,6 +349,11 @@ public class TextDbLoader implements IWaveformDbLoader {
} }
if (curLine != null) if (curLine != null)
parseLine(curLine, nextLine); parseLine(curLine, nextLine);
for(Entry<Long, ScvTx> e: transactionById.entrySet()) {
ScvTx scvTx = e.getValue();
scvTx.endTime=loader.maxTime;
txSink.put(e.getKey(), scvTx);
}
} }
/** /**
@ -348,10 +389,9 @@ public class TextDbLoader implements IWaveformDbLoader {
String[] tokens = curLine.split("\\s+"); String[] tokens = curLine.split("\\s+");
if ("tx_record_attribute".equals(tokens[0])) { if ("tx_record_attribute".equals(tokens[0])) {
Long id = Long.parseLong(tokens[1]); Long id = Long.parseLong(tokens[1]);
String name = tokens[2].substring(1, tokens[2].length()); String name = tokens[2].substring(1, tokens[2].length()-1);
DataType type = DataType.valueOf(tokens[3]); DataType type = DataType.valueOf(tokens[3]);
String remaining = tokens.length > 5 ? String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)) String remaining = tokens.length > 5 ? String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)) : "";
: "";
TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD); TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD);
transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining))); transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining)));
} else if ("tx_begin".equals(tokens[0])) { } else if ("tx_begin".equals(tokens[0])) {
@ -361,8 +401,6 @@ public class TextDbLoader implements IWaveformDbLoader {
ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId, ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId,
Long.parseLong(tokens[3]) * stringToScale(tokens[4])); Long.parseLong(tokens[3]) * stringToScale(tokens[4]));
loader.maxTime = loader.maxTime > scvTx.beginTime ? loader.maxTime : scvTx.beginTime; 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') { if (nextLine != null && nextLine.charAt(0) == 'a') {
int idx = 0; int idx = 0;
while (nextLine != null && nextLine.charAt(0) == 'a') { while (nextLine != null && nextLine.charAt(0) == 'a') {
@ -384,18 +422,14 @@ public class TextDbLoader implements IWaveformDbLoader {
TxGenerator gen = loader.txGenerators.get(scvTx.generatorId); TxGenerator gen = loader.txGenerators.get(scvTx.generatorId);
TxStream stream = loader.txStreams.get(gen.stream.getId()); TxStream stream = loader.txStreams.get(gen.stream.getId());
if (scvTx.beginTime == scvTx.endTime) { if (scvTx.beginTime == scvTx.endTime) {
TxEvent evt = new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime); stream.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime));
stream.addEvent(evt); gen.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime));
gen.addEvent(evt);
} else { } else {
TxEvent begEvt = new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime); stream.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime));
stream.addEvent(begEvt); gen.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime));
gen.addEvent(begEvt); stream.addEvent(new TxEvent(loader, EventKind.END, id, scvTx.endTime));
TxEvent endEvt = new TxEvent(loader, EventKind.END, id, scvTx.endTime); gen.addEvent(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') { if (nextLine != null && nextLine.charAt(0) == 'a') {
int idx = 0; int idx = 0;
while (nextLine != null && nextLine.charAt(0) == 'a') { while (nextLine != null && nextLine.charAt(0) == 'a') {
@ -407,8 +441,7 @@ public class TextDbLoader implements IWaveformDbLoader {
nextLine = reader.readLine(); nextLine = reader.readLine();
} }
} }
txSink.put(indexCount, scvTx); txSink.put(scvTx.getId(), scvTx);
loader.id2index.put(scvTx.getId(), indexCount++);
transactionById.remove(id); transactionById.remove(id);
} else if ("tx_relation".equals(tokens[0])) { } else if ("tx_relation".equals(tokens[0])) {
Long tr2 = Long.parseLong(tokens[2]); Long tr2 = Long.parseLong(tokens[2]);
@ -515,38 +548,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);
}
} }

View File

@ -19,7 +19,6 @@ import java.util.stream.Collectors;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxAttribute; import com.minres.scviewer.database.tx.ITxAttribute;
import com.minres.scviewer.database.tx.ITxGenerator;
import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.tx.ITxRelation;
/** /**
@ -29,9 +28,15 @@ class Tx implements ITx {
/** The loader. */ /** The loader. */
private final TextDbLoader loader; private final TextDbLoader loader;
private ScvTx scvTx =null;
/** The id. */ /** The id. */
private long id; private final long id;
private final long generatorId;
private final long streamId;
/** The begin time. */ /** The begin time. */
long beginTime = -1; long beginTime = -1;
@ -39,9 +44,6 @@ class Tx implements ITx {
/** The end time. */ /** The end time. */
long endTime = -1; long endTime = -1;
/** The concurrency index. */
private int concurrencyIndex;
/** /**
* Instantiates a new tx. * Instantiates a new tx.
* *
@ -51,6 +53,10 @@ class Tx implements ITx {
public Tx(TextDbLoader loader, ScvTx scvTx) { public Tx(TextDbLoader loader, ScvTx scvTx) {
this.loader = loader; this.loader = loader;
id = scvTx.id; 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 loader the loader
* @param txId the tx id * @param txId the tx id
*/ */
public Tx(TextDbLoader loader, long txId) { public Tx(TextDbLoader loader, long id, long generatorId, long streamId) {
this.loader = loader; this.loader = loader;
id = txId; this.id = id;
this.generatorId=generatorId;
this.streamId = streamId;
} }
/** /**
@ -94,11 +102,11 @@ class Tx implements ITx {
*/ */
@Override @Override
public int compareTo(ITx o) { public int compareTo(ITx o) {
int res = getBeginTime().compareTo(o.getBeginTime()); int res = Long.compare(getBeginTime(), o.getBeginTime());
if (res != 0) if (res != 0)
return res; return res;
else else
return getId().compareTo(o.getId()); return Long.compare(getId(), o.getId());
} }
/** /**
@ -113,7 +121,7 @@ class Tx implements ITx {
return true; return true;
if (obj == null || getClass() != obj.getClass()) if (obj == null || getClass() != obj.getClass())
return false; 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 @Override
public int hashCode() { public int hashCode() {
return loader.getScvTx(id).hashCode(); return getScvTx().hashCode();
} }
/** /**
@ -142,8 +150,8 @@ class Tx implements ITx {
* @return the id * @return the id
*/ */
@Override @Override
public Long getId() { public long getId() {
return loader.getScvTx(id).id; return getScvTx().id;
} }
/** /**
@ -153,7 +161,7 @@ class Tx implements ITx {
*/ */
@Override @Override
public IWaveform getStream() { 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 * @return the generator
*/ */
@Override @Override
public ITxGenerator getGenerator() { public IWaveform getGenerator() {
return loader.txGenerators.get(loader.getScvTx(id).generatorId); return loader.txGenerators.get(generatorId);
} }
/** /**
@ -172,9 +180,12 @@ class Tx implements ITx {
* @return the begin time * @return the begin time
*/ */
@Override @Override
public Long getBeginTime() { public long getBeginTime() {
if (beginTime < 0) if (beginTime < 0) {
beginTime = loader.getScvTx(id).beginTime; ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx();
beginTime = tx.beginTime;
endTime = tx.endTime;
}
return beginTime; return beginTime;
} }
@ -184,9 +195,12 @@ class Tx implements ITx {
* @return the end time * @return the end time
*/ */
@Override @Override
public Long getEndTime() { public long getEndTime() {
if (endTime < 0) if (endTime < 0) {
endTime = loader.getScvTx(id).endTime; ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx();
beginTime = tx.beginTime;
endTime = tx.endTime;
}
return endTime; return endTime;
} }
@ -196,26 +210,7 @@ class Tx implements ITx {
* @param time the new end time * @param time the new end time
*/ */
void setEndTime(Long time) { void setEndTime(Long time) {
loader.getScvTx(id).endTime = time; getScvTx().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;
} }
/** /**
@ -225,7 +220,12 @@ class Tx implements ITx {
*/ */
@Override @Override
public List<ITxAttribute> getAttributes() { public List<ITxAttribute> getAttributes() {
return loader.getScvTx(id).attributes; return getScvTx().attributes;
} }
private ScvTx getScvTx() {
if(scvTx==null)
scvTx=loader.getScvTx(id);
return scvTx;
}
} }

View File

@ -32,6 +32,7 @@ class TxEvent implements ITxEvent {
/** The time. */ /** The time. */
final long time; final long time;
private int concurrencyIdx=-1;
/** /**
* Instantiates a new tx event. * Instantiates a new tx event.
* *
@ -94,7 +95,7 @@ class TxEvent implements ITxEvent {
* @return the time * @return the time
*/ */
@Override @Override
public Long getTime() { public long getTime() {
return time; return time;
} }
@ -107,4 +108,13 @@ class TxEvent implements ITxEvent {
public ITx getTransaction() { public ITx getTransaction() {
return loader.getTransaction(transaction); return loader.getTransaction(transaction);
} }
@Override
public int getRowIndex() {
return concurrencyIdx;
}
public void setConcurrencyIndex(int idx) {
concurrencyIdx=idx;
}
} }

View File

@ -15,12 +15,11 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.tx.ITxGenerator;
/** /**
* The Class TxGenerator. * The Class TxGenerator.
*/ */
class TxGenerator extends AbstractTxStream implements ITxGenerator { class TxGenerator extends AbstractTxStream {
/** The stream. */ /** The stream. */
TxStream stream; TxStream stream;
@ -45,16 +44,6 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
stream.addChild(this); stream.addChild(this);
} }
/**
* Gets the stream.
*
* @return the stream
*/
@Override
public IWaveform getStream() {
return stream;
}
/** /**
* Checks if is same. * Checks if is same.
* *
@ -63,7 +52,7 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
*/ */
@Override @Override
public boolean isSame(IWaveform other) { public boolean isSame(IWaveform other) {
return (other instanceof TxGenerator && this.getId().equals(other.getId())); return (other instanceof TxGenerator && this.getId()==other.getId());
} }
/** /**
@ -93,14 +82,15 @@ class TxGenerator extends AbstractTxStream implements ITxGenerator {
public String getKind() { public String getKind() {
return stream.getKind(); return stream.getKind();
} }
/** /**
* Gets the width. * Gets the full hierarchical name.
* *
* @return the width * @return the full name
*/ */
@Override @Override
public int getWidth() { public String getFullName() {
return stream.getWidth(); return ((AbstractTxStream)parent).getFullName()+"."+name;
} }
} }

View File

@ -42,7 +42,7 @@ class TxStream extends AbstractTxStream {
*/ */
@Override @Override
public boolean isSame(IWaveform other) { 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; 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;
}
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>

View File

@ -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.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore 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.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=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.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=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.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled 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.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=11

View File

@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: SWT database widget Bundle-Name: SWT database widget
Bundle-SymbolicName: com.minres.scviewer.database.ui.swt 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-Vendor: MINRES Technologies GmbH
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", Require-Bundle: org.eclipse.swt;bundle-version="3.103.1",
com.minres.scviewer.database;bundle-version="1.0.0", com.minres.scviewer.database;bundle-version="1.0.0",
com.google.guava;bundle-version="15.0.0", com.google.guava;bundle-version="15.0.0",

View File

@ -5,8 +5,8 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<version>3.0.0-SNAPSHOT</version> <version>4.0.0-SNAPSHOT</version>
</project> </project>

View File

@ -10,9 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.ui.swt.internal; package com.minres.scviewer.database.ui.swt.internal;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Optional;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Color;
@ -21,8 +23,12 @@ import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxEvent;
import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.tx.ITxRelation;
import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.WaveformColors;
@ -32,7 +38,7 @@ public class ArrowPainter implements IPainter {
private int yCtrlOffset = 30; private int yCtrlOffset = 30;
private WaveformCanvas waveCanvas; private final WaveformCanvas waveCanvas;
private ITx tx; private ITx tx;
@ -48,8 +54,6 @@ public class ArrowPainter implements IPainter {
long scaleFactor; long scaleFactor;
boolean deferUpdate;
public ArrowPainter(WaveformCanvas waveCanvas, RelationType relationType) { public ArrowPainter(WaveformCanvas waveCanvas, RelationType relationType) {
this.waveCanvas = waveCanvas; this.waveCanvas = waveCanvas;
highlightType=relationType; highlightType=relationType;
@ -78,36 +82,47 @@ public class ArrowPainter implements IPainter {
} }
} }
protected void calculateGeometries() { private int getConcurrencyIndex(ITx tx) {
deferUpdate = false; IEvent[] eventList = tx.getStream().getEventsBeforeTime(tx.getBeginTime());
Optional<Integer> res = Arrays.stream(eventList).map(e -> ((ITxEvent)e).getRowIndex()).findFirst();
return res.isPresent()? res.get():0;
}
protected boolean calculateGeometries() {
iRect.clear(); iRect.clear();
oRect.clear(); oRect.clear();
IWaveformPainter painter = waveCanvas.wave2painterMap.get(tx.getStream()); IWaveformPainter painter = waveCanvas.wave2painterMap.get(tx.getStream());
if(painter == null)
painter = waveCanvas.wave2painterMap.get(tx.getGenerator());
if (painter == null) { // stream has been added but painter not yet if (painter == null) { // stream has been added but painter not yet
// created // created
deferUpdate = true; return true;
return;
} }
int laneHeight = painter.getHeight() / tx.getStream().getWidth(); int laneHeight = painter.getHeight() / tx.getStream().getRowCount();
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor), txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor),
waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * tx.getConcurrencyIndex(), waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * getConcurrencyIndex(tx),
(int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight); (int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight);
deriveGeom(tx.getIncomingRelations(), iRect, false); deriveGeom(tx.getIncomingRelations(), iRect, false);
deriveGeom(tx.getOutgoingRelations(), oRect, true); deriveGeom(tx.getOutgoingRelations(), oRect, true);
return false;
} }
protected void deriveGeom(Collection<ITxRelation> relations, List<LinkEntry> res, boolean useTarget) { protected void deriveGeom(Collection<ITxRelation> relations, List<LinkEntry> res, boolean useTarget) {
for (ITxRelation iTxRelation : relations) { for (ITxRelation iTxRelation : relations) {
ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource(); ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource();
if (waveCanvas.wave2painterMap.containsKey(otherTx.getStream())) { for(IWaveform iWaveform: new IWaveform[]{otherTx.getStream(), otherTx.getGenerator()}) {
IWaveformPainter painter = waveCanvas.wave2painterMap.get(otherTx.getStream()); if (waveCanvas.wave2painterMap.containsKey(iWaveform)) {
int height = waveCanvas.styleProvider.getTrackHeight(); IWaveformPainter painter = waveCanvas.wave2painterMap.get(iWaveform);
Rectangle bb = new Rectangle( if(painter!=null) {
(int) (otherTx.getBeginTime() / scaleFactor), int height = waveCanvas.styleProvider.getTrackHeight();
waveCanvas.rulerHeight + painter.getVerticalOffset() + height * otherTx.getConcurrencyIndex(), Rectangle bb = new Rectangle(
(int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor), (int) (otherTx.getBeginTime() / scaleFactor),
height); waveCanvas.rulerHeight + painter.getVerticalOffset() + height * getConcurrencyIndex(otherTx),
res.add(new LinkEntry(bb, iTxRelation.getRelationType())); (int) ((otherTx.getEndTime() - otherTx.getBeginTime()) / scaleFactor),
height);
res.add(new LinkEntry(bb, iTxRelation.getRelationType()));
}
}
} }
} }
} }
@ -119,11 +134,9 @@ public class ArrowPainter implements IPainter {
Color highliteColor = waveCanvas.styleProvider.getColor(WaveformColors.REL_ARROW_HIGHLITE); Color highliteColor = waveCanvas.styleProvider.getColor(WaveformColors.REL_ARROW_HIGHLITE);
if(tx==null) return; if(tx==null) return;
if (!deferUpdate) { scaleFactor = waveCanvas.getScaleFactor();
scaleFactor = waveCanvas.getScaleFactor(); if(calculateGeometries())
calculateGeometries(); return;
}
if(deferUpdate) return;
int correctionValue = (int)(selectionOffset); int correctionValue = (int)(selectionOffset);
Rectangle correctedTargetRectangle = new Rectangle(txRectangle.x+correctionValue, txRectangle.y, txRectangle.width, txRectangle.height); Rectangle correctedTargetRectangle = new Rectangle(txRectangle.x+correctionValue, txRectangle.y, txRectangle.width, txRectangle.height);
for (LinkEntry entry : iRect) { for (LinkEntry entry : iRect) {

View File

@ -19,7 +19,7 @@ import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.wb.swt.SWTResourceManager; import org.eclipse.wb.swt.SWTResourceManager;
public class RulerPainter implements IPainter { public class RulerPainter implements IPainter {
protected WaveformCanvas waveCanvas; protected final WaveformCanvas waveCanvas;
static final int RULER_TICK_MINOR = 10; static final int RULER_TICK_MINOR = 10;
static final int RULER_TICK_MAJOR = 100; static final int RULER_TICK_MAJOR = 100;

View File

@ -12,8 +12,6 @@ package com.minres.scviewer.database.ui.swt.internal;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Map.Entry;
import java.util.NavigableMap;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -26,7 +24,9 @@ import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.EventEntry;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.WaveformColors;
@ -37,16 +37,16 @@ public class SignalPainter extends TrackPainter {
IEvent value; IEvent value;
boolean fromMap; boolean fromMap;
public SignalChange(Entry<Long, IEvent[]> entry) { public SignalChange(EventEntry entry) {
time = entry.getKey(); time = entry.timestamp;
value = entry.getValue()[0]; value = entry.events[0];
fromMap = true; fromMap = true;
} }
public void set(Entry<Long, IEvent[]> entry, Long actTime) { public void set(EventEntry entry, Long actTime) {
if (entry != null) { if (entry != null) {
time = entry.getKey(); time = entry.timestamp;
value = entry.getValue()[0]; value = entry.events[0];
fromMap = true; fromMap = true;
} else { } else {
time = actTime; time = actTime;
@ -100,21 +100,16 @@ public class SignalPainter extends TrackPainter {
long beginTime = beginPos*scaleFactor; long beginTime = beginPos*scaleFactor;
long endTime = beginTime + area.width*scaleFactor; long endTime = beginTime + area.width*scaleFactor;
Entry<Long, IEvent[]> first = signal.getEvents().floorEntry(beginTime); EventEntry first = signal.getEvents().floorEntry(beginTime);
Entry<Long, IEvent[]> last = signal.getEvents().floorEntry(endTime); if (first == null)
if (first == null) {
if (last == null)
return;
first = signal.getEvents().firstEntry(); first = signal.getEvents().firstEntry();
} else if (last == null) { beginTime = first.timestamp;
last = signal.getEvents().lastEntry();
}
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE));
proj.setLineStyle(SWT.LINE_SOLID); proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1); proj.setLineWidth(1);
NavigableMap<Long, IEvent[]> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true); IEventList entries = signal.getEvents().subMap(beginTime, true, endTime);
SignalChange left = new SignalChange(first); SignalChange left = new SignalChange(entries.firstEntry());
SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first); SignalChange right = new SignalChange(entries.size() > 1 ? entries.higherEntry(left.time) : entries.firstEntry());
maxPosX = area.x + area.width; maxPosX = area.x + area.width;
yOffsetT = this.waveCanvas.styleProvider.getTrackHeight() / 5 + area.y; yOffsetT = this.waveCanvas.styleProvider.getTrackHeight() / 5 + area.y;
yOffsetM = this.waveCanvas.styleProvider.getTrackHeight() / 2 + area.y; yOffsetM = this.waveCanvas.styleProvider.getTrackHeight() / 2 + area.y;
@ -153,15 +148,15 @@ public class SignalPainter extends TrackPainter {
if (xSigChangeEndPos == xSigChangeBeginPos) { if (xSigChangeEndPos == xSigChangeBeginPos) {
multiple = true; multiple = true;
long eTime = (xSigChangeBeginPos + 1) * this.waveCanvas.getScaleFactor(); long eTime = (xSigChangeBeginPos + 1) * this.waveCanvas.getScaleFactor();
Entry<Long, IEvent[]> entry = entries.floorEntry(eTime); EventEntry entry = entries.floorEntry(eTime);
if(entry!=null && entry.getKey()> right.time) if(entry!=null && entry.timestamp> right.time)
right.set(entry, endTime); right.set(entry, endTime);
xSigChangeEndPos = getXPosEnd(eTime); xSigChangeEndPos = getXPosEnd(eTime);
} }
} while (left.time < endTime); } while (left.time < endTime);
} }
private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap<Long, IEvent[]> entries) { private SignalStencil getStencil(GC gc, SignalChange left, IEventList entries) {
IEvent val = left.value; IEvent val = left.value;
if(val instanceof BitVector) { if(val instanceof BitVector) {
BitVector bv = (BitVector) val; BitVector bv = (BitVector) val;
@ -253,15 +248,15 @@ public class SignalPainter extends TrackPainter {
private long maxVal; private long maxVal;
private long minVal; private long minVal;
double yRange = (yOffsetB-yOffsetT); double yRange = (yOffsetB-yOffsetT);
public MultiBitStencilAnalog(NavigableMap<Long, IEvent[]> entries, Object left, boolean continous, boolean signed) { public MultiBitStencilAnalog(IEventList entries, Object left, boolean continous, boolean signed) {
this.continous=continous; this.continous=continous;
this.signed=signed; this.signed=signed;
Collection<IEvent[]> values = entries.values(); Collection<EventEntry> ievents = entries.entrySet();
minVal=signed?((BitVector)left).toSignedValue():((BitVector)left).toUnsignedValue(); minVal=signed?((BitVector)left).toSignedValue():((BitVector)left).toUnsignedValue();
if(!values.isEmpty()) { if(!ievents.isEmpty()) {
maxVal=minVal; maxVal=minVal;
for (IEvent[] tp : entries.values()) for (EventEntry tp : ievents)
for(IEvent e: tp) { for(IEvent e: tp.events) {
long v = signed?((BitVector)e).toSignedValue():((BitVector)e).toUnsignedValue(); long v = signed?((BitVector)e).toSignedValue():((BitVector)e).toUnsignedValue();
maxVal=Math.max(maxVal, v); maxVal=Math.max(maxVal, v);
minVal=Math.min(minVal, v); minVal=Math.min(minVal, v);
@ -358,15 +353,15 @@ public class SignalPainter extends TrackPainter {
boolean continous=true; boolean continous=true;
public RealStencil(NavigableMap<Long, IEvent[]> entries, Object left, boolean continous) { public RealStencil(IEventList entries, Object left, boolean continous) {
this.continous=continous; this.continous=continous;
Collection<IEvent[]> values = entries.values(); Collection<EventEntry> values = entries.entrySet();
minVal=(Double) left; minVal=(Double) left;
range=2.0; range=2.0;
if(!values.isEmpty()) { if(!values.isEmpty()) {
double maxVal=minVal; double maxVal=minVal;
for (IEvent[] val : entries.values()) for (EventEntry val : values)
for(IEvent e:val) { for(IEvent e:val.events) {
double v = ((DoubleVal)e).value; double v = ((DoubleVal)e).value;
if(Double.isNaN(maxVal)) if(Double.isNaN(maxVal))
maxVal=v; maxVal=v;

View File

@ -10,18 +10,17 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.ui.swt.internal; package com.minres.scviewer.database.ui.swt.internal;
import java.util.Collection; import java.util.TreeMap;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeSet;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.EventEntry;
import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.EventKind;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxEvent; import com.minres.scviewer.database.tx.ITxEvent;
@ -37,19 +36,27 @@ public class StreamPainter extends TrackPainter{
private IWaveform stream; private IWaveform stream;
private int txBase; private int txBase;
private int txHeight; private int txHeight;
private TreeSet<ITx> seenTx; // TODO: remove TreeMap usage
private TreeMap<ITx, ITxEvent> seenTx;
public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) { public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) {
super(trackEntry, even); super(trackEntry, even);
this.waveCanvas = waveCanvas; this.waveCanvas = waveCanvas;
this.stream=trackEntry.waveform; this.stream=trackEntry.waveform;
this.seenTx=new TreeSet<>(); this.seenTx=new TreeMap<>();
} }
@SuppressWarnings("unchecked")
public void paintArea(Projection proj, Rectangle area) { public void paintArea(Projection proj, Rectangle area) {
if(stream.getEvents().size()==0) return; int trackHeight=trackEntry.height/stream.getRowCount();
int trackHeight=trackEntry.height/stream.getWidth(); if(stream.getEvents().size()==0) {
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1);
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE));
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
proj.drawLine(area.x, y1, area.x+area.width, y1);
return;
}
txBase=trackHeight/5; txBase=trackHeight/5;
txHeight=trackHeight*3/5; txHeight=trackHeight*3/5;
if(trackEntry.selected) { if(trackEntry.selected) {
@ -65,10 +72,11 @@ public class StreamPainter extends TrackPainter{
long beginTime = beginPos*scaleFactor; long beginTime = beginPos*scaleFactor;
long endTime = beginTime + area.width*scaleFactor; long endTime = beginTime + area.width*scaleFactor;
Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime); IEventList events = stream.getEvents();
Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry(endTime); EventEntry firstTx = events.floorEntry(beginTime);
if(firstTx==null) firstTx = stream.getEvents().firstEntry(); EventEntry lastTx = events.ceilingEntry(endTime);
if(lastTx==null) lastTx=stream.getEvents().lastEntry(); if(firstTx==null) firstTx = events.firstEntry();
if(lastTx==null) lastTx = events.lastEntry();
proj.setFillRule(SWT.FILL_EVEN_ODD); proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.setLineStyle(SWT.LINE_SOLID); proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1); proj.setLineWidth(1);
@ -77,46 +85,50 @@ public class StreamPainter extends TrackPainter{
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight) for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
proj.drawLine(area.x, y1, area.x+area.width, y1); proj.drawLine(area.x, y1, area.x+area.width, y1);
if(firstTx==lastTx) { if(firstTx==lastTx) {
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)firstTx.getValue()) for(IEvent txEvent: firstTx.events)
drawTx(proj, area, txEvent.getTransaction(), false); drawTx(proj, area, ((ITxEvent)txEvent).getTransaction(), ((ITxEvent)txEvent).getRowIndex(), false);
}else{ }else{
seenTx.clear(); seenTx.clear();
NavigableMap<Long, IEvent[]> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); ITxEvent highlighed=null;
boolean highlighed=false;
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE));
long selectedId=waveCanvas.currentSelection!=null? waveCanvas.currentSelection.getId():-1; long selectedId=waveCanvas.currentSelection!=null? waveCanvas.currentSelection.getId():-1;
for(Entry<Long, IEvent[]> entry: entries.entrySet()) for(EventEntry entry: events.subMap(firstTx.timestamp, true, lastTx.timestamp))
for(IEvent evt:entry.getValue()){ for(IEvent e:entry.events){
ITx tx = ((ITxEvent) evt).getTransaction(); ITxEvent evt = (ITxEvent) e;
highlighed|=selectedId==tx.getId(); ITx tx = evt.getTransaction();
if(selectedId==tx.getId())
highlighed=evt;
switch(evt.getKind()) { switch(evt.getKind()) {
case BEGIN: case BEGIN:
seenTx.add(tx); seenTx.put(tx, evt);
break; break;
case END: case END:
drawTx(proj, area, tx, evt.getRowIndex(), false);
seenTx.remove(tx); seenTx.remove(tx);
break;
case SINGLE: case SINGLE:
drawTx(proj, area, tx, false); drawTx(proj, area, tx, evt.getRowIndex(), false);
break; break;
} }
} }
for(ITx tx:seenTx){ seenTx.entrySet().stream().forEach(e -> {
drawTx(proj, area, tx, false); drawTx(proj, area, e.getKey(), e.getValue().getRowIndex(), false);
} });
if(highlighed){
if(highlighed!=null){
proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE_HIGHLITE)); proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE_HIGHLITE));
drawTx(proj, area, waveCanvas.currentSelection, true); drawTx(proj, area, highlighed.getTransaction(), highlighed.getRowIndex(), true);
} }
} }
} }
protected void drawTx(Projection proj, Rectangle area, ITx tx, boolean highlighted ) { protected void drawTx(Projection proj, Rectangle area, ITx tx, int concurrencyIndex, boolean highlighted ) {
// compute colors // compute colors
Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName()); Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName());
proj.setBackground(transColor[highlighted?1:0]); proj.setBackground(transColor[highlighted?1:0]);
int offset = tx.getConcurrencyIndex()*this.waveCanvas.styleProvider.getTrackHeight(); int offset = concurrencyIndex*this.waveCanvas.styleProvider.getTrackHeight();
Rectangle bb = new Rectangle( Rectangle bb = new Rectangle(
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase, (int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase,
(int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight); (int)((tx.getEndTime()-tx.getBeginTime())/this.waveCanvas.getScaleFactor()), txHeight);
@ -143,12 +155,12 @@ public class StreamPainter extends TrackPainter{
public ITx getClicked(Point point) { public ITx getClicked(Point point) {
int lane=point.y/waveCanvas.styleProvider.getTrackHeight(); int lane=point.y/waveCanvas.styleProvider.getTrackHeight();
Entry<Long, IEvent[]> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); EventEntry firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor());
if(firstTx!=null){ if(firstTx!=null){
do { do {
ITx tx = getTxFromEntry(lane, point.x, firstTx); ITx tx = getTxFromEntry(lane, point.x, firstTx.events);
if(tx!=null) return tx; if(tx!=null) return tx;
firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); firstTx=stream.getEvents().lowerEntry(firstTx.timestamp);
}while(firstTx!=null); }while(firstTx!=null);
} }
return null; return null;
@ -162,27 +174,21 @@ public class StreamPainter extends TrackPainter{
this.stream = stream; this.stream = stream;
} }
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, IEvent[]> firstTx) { protected ITx getTxFromEntry(int lane, int offset, IEvent[] firstTx) {
long timePoint=offset*waveCanvas.getScaleFactor(); long timePoint=offset*waveCanvas.getScaleFactor();
for(IEvent evt:firstTx.getValue()){ long timePointLow=(offset-5)*waveCanvas.getScaleFactor();
if(evt instanceof ITxEvent) {
ITx tx=((ITxEvent)evt).getTransaction();
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)&&
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
return ((ITxEvent)evt).getTransaction();
}
}
}
// now with some fuzziness
timePoint=(offset-5)*waveCanvas.getScaleFactor();
long timePointHigh=(offset+5)*waveCanvas.getScaleFactor(); long timePointHigh=(offset+5)*waveCanvas.getScaleFactor();
for(IEvent evt:firstTx.getValue()){ for(IEvent e:firstTx){
if(evt instanceof ITxEvent) { if(e instanceof ITxEvent) {
ITx tx=((ITxEvent)evt).getTransaction(); ITxEvent evt = (ITxEvent) e;
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) && ITx tx=evt.getTransaction();
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){ if(
return ((ITxEvent)evt).getTransaction(); (evt.getKind()==EventKind.SINGLE && evt.getTime()==timePoint) ||
} (evt.getKind()==EventKind.SINGLE && evt.getTime()>timePointLow && evt.getTime()<timePointHigh) ||
(evt.getKind()==EventKind.BEGIN && evt.getRowIndex()==lane && evt.getTime()<=timePoint && tx.getEndTime()>=timePoint)
){
return tx;
}
} }
} }
return null; return null;

View File

@ -11,10 +11,12 @@
package com.minres.scviewer.database.ui.swt.internal; package com.minres.scviewer.database.ui.swt.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Optional;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlAdapter;
@ -32,9 +34,12 @@ import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.ScrollBar;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.minres.scviewer.database.EventEntry;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxEvent;
import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformStyleProvider;
import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
@ -174,11 +179,14 @@ public class WaveformCanvas extends Canvas {
} }
public void setZoomLevel(int level, long centerTime) { public void setZoomLevel(int level, long centerTime) {
if(level<0) {
level = findFitZoomLevel();
if(level<0) level = 0;
}
//FIXME: keep center if zoom-out and cursor is not in view //FIXME: keep center if zoom-out and cursor is not in view
long oldScaleFactor=scaleFactor; long xc=centerTime/this.scaleFactor; // cursor total x-offset
if(level<0) level = 0;
if(level<Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length){ if(level<Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length){
this.scaleFactor = (long) Math.pow(10, level/2d); this.scaleFactor = (long) Math.pow(10, level>>1);
if(level%2==1) this.scaleFactor*=3; if(level%2==1) this.scaleFactor*=3;
ITx tx = arrowPainter.getTx(); ITx tx = arrowPainter.getTx();
arrowPainter.setTx(null); arrowPainter.setTx(null);
@ -188,7 +196,6 @@ public class WaveformCanvas extends Canvas {
* xcn = tc/newScaleFactor * xcn = tc/newScaleFactor
* t0n = (xcn-xoffs)*scaleFactor * t0n = (xcn-xoffs)*scaleFactor
*/ */
long xc=centerTime/oldScaleFactor; // cursor total x-offset
long xoffs=xc+origin.x; // cursor offset relative to left border long xoffs=xc+origin.x; // cursor offset relative to left border
long xcn=centerTime/scaleFactor; // new total x-offset long xcn=centerTime/scaleFactor; // new total x-offset
long originX=xcn-xoffs; long originX=xcn-xoffs;
@ -204,6 +211,24 @@ public class WaveformCanvas extends Canvas {
} }
} }
private int findFitZoomLevel() {
//get area actually capable of displaying data, i.e. area of the receiver which is capable of displaying data
Rectangle clientArea = getClientArea();
long clientAreaWidth = clientArea.width;
//try to find existing zoomlevel where scaleFactor*clientAreaWidth >= maxTime, if one is found set it as new zoomlevel
int magnitude_factor=1;
for(int magnitude=0; magnitude<Constants.UNIT_STRING.length; magnitude++) {
for (int multiplier=0; multiplier<Constants.UNIT_MULTIPLIER.length; multiplier++){
int tempLevel = magnitude*Constants.UNIT_MULTIPLIER.length+multiplier;
long scaleFactor = Constants.UNIT_MULTIPLIER[multiplier]*magnitude_factor;
if(scaleFactor*clientAreaWidth >= maxTime)
return tempLevel;
}
magnitude_factor*=1000;
}
return -1;
}
public long getScaleFactor() { public long getScaleFactor() {
return scaleFactor; return scaleFactor;
} }
@ -424,13 +449,17 @@ public class WaveformCanvas extends Canvas {
} }
for (IWaveformPainter painter : wave2painterMap.values()) { for (IWaveformPainter painter : wave2painterMap.values()) {
if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) { if (painter instanceof StreamPainter && ((StreamPainter) painter).getStream() == tx.getStream()) {
int top = painter.getVerticalOffset() + styleProvider.getTrackHeight() * tx.getConcurrencyIndex(); EventEntry entry = tx.getStream().getEvents().floorEntry(tx.getBeginTime());
int bottom = top + styleProvider.getTrackHeight(); Optional<IEvent> res = Arrays.stream(entry.events).filter(e -> ((ITxEvent)e).getTransaction().equals(tx)).findFirst();
if (top < -origin.y) { if(res.isPresent()) {
setOrigin(origin.x, -(top-styleProvider.getTrackHeight())); int top = painter.getVerticalOffset() + styleProvider.getTrackHeight() * ((ITxEvent)res.get()).getRowIndex();
} else if (bottom > (size.y - origin.y)) { int bottom = top + styleProvider.getTrackHeight();
setOrigin(origin.x, size.y - bottom); if (top < -origin.y) {
} setOrigin(origin.x, -(top-styleProvider.getTrackHeight()));
} else if (bottom > (size.y - origin.y)) {
setOrigin(origin.x, size.y - bottom);
}
}
} }
} }
} }

View File

@ -21,7 +21,6 @@ import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Optional; import java.util.Optional;
import java.util.TreeMap; import java.util.TreeMap;
@ -77,8 +76,10 @@ import org.eclipse.wb.swt.SWTResourceManager;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.EventEntry;
import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.EventKind;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.WaveformType;
@ -255,29 +256,29 @@ public class WaveformView implements IWaveformView {
long time = waveformCanvas.getTimeForOffset(p.x); long time = waveformCanvas.getTimeForOffset(p.x);
long scaling = 5 * waveformCanvas.getScaleFactor(); long scaling = 5 * waveformCanvas.getScaleFactor();
for (Object o : waveformCanvas.getElementsAt(p)) { for (Object o : waveformCanvas.getElementsAt(p)) {
Entry<Long, IEvent[]> floorEntry = null; EventEntry floorEntry = null;
Entry<Long, IEvent[]> ceilEntry = null; EventEntry ceilEntry = null;
if (o instanceof TrackEntry) { if (o instanceof TrackEntry) {
TrackEntry entry = (TrackEntry) o; TrackEntry entry = (TrackEntry) o;
NavigableMap<Long, IEvent[]> map = entry.waveform.getEvents(); IEventList map = entry.waveform.getEvents();
floorEntry = map.floorEntry(time); floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time); ceilEntry = map.ceilingEntry(time);
} else if (o instanceof ITx) { } else if (o instanceof ITx) {
NavigableMap<Long, IEvent[]> map = ((ITx) o).getStream().getEvents(); IEventList map = ((ITx) o).getStream().getEvents();
floorEntry = map.floorEntry(time); floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time); ceilEntry = map.ceilingEntry(time);
} }
if (floorEntry != null && time - floorEntry.getKey() > scaling) if (floorEntry != null && time - floorEntry.timestamp > scaling)
floorEntry = null; floorEntry = null;
if (ceilEntry != null && ceilEntry.getKey() - time > scaling) if (ceilEntry != null && ceilEntry.timestamp - time > scaling)
ceilEntry = null; ceilEntry = null;
if (ceilEntry == null && floorEntry != null) { if (ceilEntry == null && floorEntry != null) {
time = floorEntry.getKey(); time = floorEntry.timestamp;
} else if (ceilEntry != null && floorEntry == null) { } else if (ceilEntry != null && floorEntry == null) {
time = ceilEntry.getKey(); time = ceilEntry.timestamp;
} else if (ceilEntry != null && floorEntry != null) { } else if (ceilEntry != null && floorEntry != null) {
time = time - floorEntry.getKey() < ceilEntry.getKey() - time ? floorEntry.getKey() time = time - floorEntry.timestamp < ceilEntry.timestamp - time ? floorEntry.timestamp
: ceilEntry.getKey(); : ceilEntry.timestamp;
} }
} }
return time; return time;
@ -514,7 +515,7 @@ public class WaveformView implements IWaveformView {
streamEntry.vOffset = tracksVerticalHeight; streamEntry.vOffset = tracksVerticalHeight;
if (streamEntry.waveform.getType() == WaveformType.TRANSACTION) { if (streamEntry.waveform.getType() == WaveformType.TRANSACTION) {
streamEntry.currentValue = ""; streamEntry.currentValue = "";
streamEntry.height *= streamEntry.waveform.getWidth(); streamEntry.height *= streamEntry.waveform.getRowCount();
painter = new StreamPainter(waveformCanvas, even, streamEntry); painter = new StreamPainter(waveformCanvas, even, streamEntry);
} else if (streamEntry.waveform.getType() == WaveformType.SIGNAL) { } else if (streamEntry.waveform.getType() == WaveformType.SIGNAL) {
streamEntry.currentValue = "---"; streamEntry.currentValue = "---";
@ -579,20 +580,21 @@ public class WaveformView implements IWaveformView {
entry.currentValue = Double.toString(val); entry.currentValue = Double.toString(val);
} }
} else if (entry.waveform.getType() == WaveformType.TRANSACTION) { } else if (entry.waveform.getType() == WaveformType.TRANSACTION) {
ITx[] resultsList = new ITx[entry.waveform.getWidth()]; ITx[] resultsList = new ITx[entry.waveform.getRowCount()];
Entry<Long, IEvent[]> firstTx = entry.waveform.getEvents().floorEntry(time); EventEntry firstTx = entry.waveform.getEvents().floorEntry(time);
if (firstTx != null) { if (firstTx != null) {
do { do {
for (IEvent evt : firstTx.getValue()) { for (IEvent e : firstTx.events) {
if (evt instanceof ITxEvent) { if (e instanceof ITxEvent) {
ITx tx = ((ITxEvent) evt).getTransaction(); ITxEvent evt = ((ITxEvent) e);
ITx tx = evt.getTransaction();
if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE) if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE)
&& tx.getBeginTime() <= time && tx.getEndTime() >= time && tx.getBeginTime() <= time && tx.getEndTime() >= time
&& resultsList[tx.getConcurrencyIndex()] == null) && resultsList[evt.getRowIndex()] == null)
resultsList[tx.getConcurrencyIndex()] = ((ITxEvent) evt).getTransaction(); resultsList[evt.getRowIndex()] = evt.getTransaction();
} }
} }
firstTx = entry.waveform.getEvents().lowerEntry(firstTx.getKey()); firstTx = entry.waveform.getEvents().lowerEntry(firstTx.timestamp);
} while (firstTx != null && !isArrayFull(resultsList)); } while (firstTx != null && !isArrayFull(resultsList));
boolean separator = false; boolean separator = false;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -853,11 +855,11 @@ public class WaveformView implements IWaveformView {
} }
} }
if (transaction == null) { if (transaction == null) {
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents() EventEntry entry = selectedWaveform.waveform.getEvents()
.higherEntry(currentTxSelection.getBeginTime()); .higherEntry(currentTxSelection.getBeginTime());
if (entry != null) if (entry != null)
do { do {
for (IEvent evt : entry.getValue()) { for (IEvent evt : entry.events) {
if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN
|| evt.getKind() == EventKind.SINGLE)) { || evt.getKind() == EventKind.SINGLE)) {
transaction = ((ITxEvent) evt).getTransaction(); transaction = ((ITxEvent) evt).getTransaction();
@ -865,7 +867,7 @@ public class WaveformView implements IWaveformView {
} }
} }
if (transaction == null) if (transaction == null)
entry = selectedWaveform.waveform.getEvents().higherEntry(entry.getKey()); entry = selectedWaveform.waveform.getEvents().higherEntry(entry.timestamp);
} while (entry != null && transaction == null); } while (entry != null && transaction == null);
} }
} else if (direction == GotoDirection.PREV) { } else if (direction == GotoDirection.PREV) {
@ -882,11 +884,11 @@ public class WaveformView implements IWaveformView {
} }
} }
if (transaction == null) { if (transaction == null) {
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents() EventEntry entry = selectedWaveform.waveform.getEvents()
.lowerEntry(currentTxSelection.getBeginTime()); .lowerEntry(currentTxSelection.getBeginTime());
if (entry != null) if (entry != null)
do { do {
for (IEvent evt : Lists.reverse(Arrays.asList(entry.getValue()))) { for (IEvent evt : Lists.reverse(Arrays.asList(entry.events))) {
if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN
|| evt.getKind() == EventKind.SINGLE)) { || evt.getKind() == EventKind.SINGLE)) {
transaction = ((ITxEvent) evt).getTransaction(); transaction = ((ITxEvent) evt).getTransaction();
@ -894,7 +896,7 @@ public class WaveformView implements IWaveformView {
} }
} }
if (transaction == null) if (transaction == null)
entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey()); entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.timestamp);
} while (entry != null && transaction == null); } while (entry != null && transaction == null);
} }
} }
@ -957,14 +959,14 @@ public class WaveformView implements IWaveformView {
return; return;
TrackEntry sel = currentWaveformSelection.get(0); TrackEntry sel = currentWaveformSelection.get(0);
long time = getCursorTime(); long time = getCursorTime();
NavigableMap<Long, ?> map = null; IEventList map = null;
if (sel.waveform.getType() == WaveformType.TRANSACTION || sel.waveform.getType() == WaveformType.SIGNAL) { if (sel.waveform.getType() == WaveformType.TRANSACTION || sel.waveform.getType() == WaveformType.SIGNAL) {
map = sel.waveform.getEvents(); map = sel.waveform.getEvents();
} }
if (map != null) { if (map != null) {
Entry<Long, ?> entry = direction == GotoDirection.PREV ? map.lowerEntry(time) : map.higherEntry(time); EventEntry entry = direction == GotoDirection.PREV ? map.lowerEntry(time) : map.higherEntry(time);
if (entry != null) { if (entry != null) {
time = entry.getKey(); time = entry.timestamp;
setCursorTime(time); setCursorTime(time);
waveformCanvas.reveal(time); waveformCanvas.reveal(time);
waveformCanvas.redraw(); waveformCanvas.redraw();
@ -1036,7 +1038,7 @@ public class WaveformView implements IWaveformView {
TrackEntry trackEntry = trackVerticalOffset.get(firstKey); TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
IWaveform w = trackEntry.waveform; IWaveform w = trackEntry.waveform;
if (w.getType() == WaveformType.TRANSACTION) if (w.getType() == WaveformType.TRANSACTION)
subArea.height *= w.getWidth(); subArea.height *= w.getRowCount();
drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected); drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected);
} else { } else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
@ -1044,7 +1046,7 @@ public class WaveformView implements IWaveformView {
IWaveform w = entry.getValue().waveform; IWaveform w = entry.getValue().waveform;
subArea.height = styleProvider.getTrackHeight(); subArea.height = styleProvider.getTrackHeight();
if (w.getType() == WaveformType.TRANSACTION) if (w.getType() == WaveformType.TRANSACTION)
subArea.height *= w.getWidth(); subArea.height *= w.getRowCount();
drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected); drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected);
} }
} }
@ -1065,7 +1067,7 @@ public class WaveformView implements IWaveformView {
TrackEntry trackEntry = trackVerticalOffset.get(firstKey); TrackEntry trackEntry = trackVerticalOffset.get(firstKey);
IWaveform w = trackEntry.waveform; IWaveform w = trackEntry.waveform;
if (w.getType() == WaveformType.TRANSACTION) if (w.getType() == WaveformType.TRANSACTION)
subArea.height *= w.getWidth(); subArea.height *= w.getRowCount();
drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected); drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected);
} else { } else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
@ -1073,7 +1075,7 @@ public class WaveformView implements IWaveformView {
IWaveform w = entry.getValue().waveform; IWaveform w = entry.getValue().waveform;
subArea.height = styleProvider.getTrackHeight(); subArea.height = styleProvider.getTrackHeight();
if (w.getType() == WaveformType.TRANSACTION) if (w.getType() == WaveformType.TRANSACTION)
subArea.height *= w.getWidth(); subArea.height *= w.getRowCount();
drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue,
entry.getValue().selected); entry.getValue().selected);
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>

View File

@ -1,8 +1,10 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11

View File

@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: VCD signal database Bundle-Name: VCD signal database
Bundle-SymbolicName: com.minres.scviewer.database.vcd Bundle-SymbolicName: com.minres.scviewer.database.vcd
Bundle-Version: 2.2.0.qualifier Bundle-Version: 4.0.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH 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", Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0",
org.eclipse.osgi.services;bundle-version="3.4.0", org.eclipse.osgi.services;bundle-version="3.4.0",
com.google.guava;bundle-version="15.0.0" com.google.guava;bundle-version="15.0.0"

View File

@ -1,11 +1,11 @@
<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"> <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> <modelVersion>4.0.0</modelVersion>
<artifactId>com.minres.scviewer.database.vcd</artifactId> <artifactId>com.minres.scviewer.database.vcd</artifactId>
<version>2.2.0-SNAPSHOT</version> <version>4.0.0-SNAPSHOT</version>
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View File

@ -20,15 +20,13 @@ import java.util.ArrayDeque;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.NavigableMap;
import java.util.TreeMap;
import java.util.Vector; import java.util.Vector;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbLoader; import com.minres.scviewer.database.IWaveformDbLoader;
@ -115,19 +113,20 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
moduleStack=null; moduleStack=null;
throw new InputFormatException(e.toString()); throw new InputFormatException(e.toString());
} }
if(!res) throw new InputFormatException("Could not parse VCD file"); if(!res)
throw new InputFormatException("Could not parse VCD file");
// calculate max time of this database // calculate max time of this database
for(IWaveform waveform:signals) { for(IWaveform waveform:signals) {
NavigableMap<Long, IEvent[]> events =waveform.getEvents(); IEventList events =waveform.getEvents();
if(!events.isEmpty()) if(!events.isEmpty())
maxTime= Math.max(maxTime, events.lastKey()); maxTime= Math.max(maxTime, events.lastKey());
} }
// extend signals to have a last value set at max time // extend signals to have a last value set at max time
for(IWaveform s:signals){ for(IWaveform s:signals){
if(s instanceof VCDSignal<?>) { if(s instanceof VCDSignal<?>) {
TreeMap<Long,?> events = (TreeMap<Long, ?>) ((VCDSignal<?>)s).getEvents(); IEventList events = ((VCDSignal<?>)s).getEvents();
if(events.size()>0 && events.lastKey()<maxTime){ if(events.size()>0 && events.lastKey()<maxTime){
Object val = events.lastEntry().getValue(); Object val = events.lastEntry().events[0];
if(val instanceof BitVector) { if(val instanceof BitVector) {
((VCDSignal<BitVector>)s).addSignalChange(maxTime, (BitVector) val); ((VCDSignal<BitVector>)s).addSignalChange(maxTime, (BitVector) val);
} else if(val instanceof DoubleVal) } else if(val instanceof DoubleVal)
@ -147,7 +146,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
* @see com.minres.scviewer.database.ITrDb#getMaxTime() * @see com.minres.scviewer.database.ITrDb#getMaxTime()
*/ */
@Override @Override
public Long getMaxTime() { public long getMaxTime() {
return maxTime; return maxTime;
} }
@ -204,7 +203,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
@Override @Override
public int getNetWidth(int intValue) { public int getNetWidth(int intValue) {
VCDSignal<?> signal = (VCDSignal<?>) signals.get(intValue); VCDSignal<?> signal = (VCDSignal<?>) signals.get(intValue);
return signal.getWidth(); return signal.getRowCount();
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@ -10,12 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database.vcd; package com.minres.scviewer.database.vcd;
import java.util.Map.Entry; import com.minres.scviewer.database.EventEntry;
import java.util.NavigableMap; import com.minres.scviewer.database.EventList;
import java.util.TreeMap;
import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IEventList;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.WaveformType;
@ -27,7 +26,7 @@ public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
private final int width; private final int width;
private NavigableMap<Long, IEvent[]> values; private IEventList values;
public VCDSignal(String name) { public VCDSignal(String name) {
this(0, name, 1); this(0, name, 1);
@ -42,7 +41,7 @@ public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
fullName=name; fullName=name;
this.id=id; this.id=id;
this.width=width; this.width=width;
this.values=new TreeMap<>(); this.values=new EventList();
} }
public VCDSignal(VCDSignal<T> o, int id, String name) { public VCDSignal(VCDSignal<T> o, int id, String name) {
@ -63,44 +62,36 @@ public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
} }
@Override @Override
public Long getId() { public long getId() {
return id; return id;
} }
public void addSignalChange(Long time, T value){ public void addSignalChange(Long time, T value){
if(values.containsKey(time)) { values.put(time, value);
IEvent[] oldV = values.get(time);
IEvent[] newV = new IEvent[oldV.length+1];
System.arraycopy(oldV, 0, newV, 0, oldV.length);
newV[oldV.length]=value;
values.put(time, newV);
} else {
values.put(time, new IEvent[] {value});
}
} }
@Override @Override
public NavigableMap<Long, IEvent[]> getEvents() { public IEventList getEvents() {
return values; return values;
} }
@Override @Override
public IEvent[] getEventsAtTime(Long time) { public IEvent[] getEventsAtTime(long time) {
return values.get(time); return values.get(time);
} }
@Override @Override
public IEvent[] getEventsBeforeTime(Long time) { public IEvent[] getEventsBeforeTime(long time) {
Entry<Long, IEvent[]> e = values.floorEntry(time); EventEntry e = values.floorEntry(time);
if(e==null) if(e==null)
return new IEvent[] {}; return new IEvent[] {};
else else
return values.floorEntry(time).getValue(); return values.floorEntry(time).events;
} }
@Override @Override
public boolean isSame(IWaveform other) { public boolean isSame(IWaveform other) {
return( other instanceof VCDSignal<?> && this.getId().equals(other.getId())); return( other instanceof VCDSignal<?> && this.getId() == other.getId());
} }
@Override @Override
@ -109,7 +100,7 @@ public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
} }
@Override @Override
public int getWidth() { public int getRowCount() {
return width; return width;
} }

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src/"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>
</classpath> </classpath>

View File

@ -1,9 +1,16 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=11

View File

@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: Waveform database Bundle-Name: Waveform database
Bundle-SymbolicName: com.minres.scviewer.database Bundle-SymbolicName: com.minres.scviewer.database
Bundle-Version: 3.0.0.qualifier Bundle-Version: 4.0.0.qualifier
Bundle-Vendor: MINRES Technologies GmbH Bundle-Vendor: MINRES Technologies GmbH
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-RequiredExecutionEnvironment: JavaSE-11
Export-Package: com.minres.scviewer.database, Export-Package: com.minres.scviewer.database,
com.minres.scviewer.database.tx com.minres.scviewer.database.tx
Bundle-ActivationPolicy: lazy Bundle-ActivationPolicy: lazy

View File

@ -4,9 +4,9 @@
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>
<version>3.0.0-SNAPSHOT</version> <version>4.0.0-SNAPSHOT</version>
</project> </project>

View File

@ -0,0 +1,41 @@
package com.minres.scviewer.database;
import java.util.Arrays;
public class EventEntry implements Comparable<EventEntry>{
public long timestamp; // unsigned
public IEvent[] events = null;
public EventEntry(long timestamp) {
this.timestamp = timestamp;
}
public EventEntry(long timestamp, IEvent[] events) {
this.timestamp = timestamp;
this.events = events;
}
@Override
public int compareTo(EventEntry o) {
return Long.compareUnsigned(timestamp, o.timestamp);
}
@Override
public String toString() {
return String.format("e.%d@%d", events.length,timestamp);
}
public void append(IEvent value) {
if(events.length==0)
events = new IEvent[] {value};
else {
int idx = events.length;
events = Arrays.copyOf(events, idx+1);
events[idx]=value;
}
}
}

View File

@ -0,0 +1,195 @@
package com.minres.scviewer.database;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class EventList implements IEventList {
ArrayList<EventEntry> store = new ArrayList<>();
int start = 0;
int end = store.size();
boolean unmodifiable = false;
public class Iterator implements java.util.Iterator<EventEntry> {
EventList list;
private int pos;
public Iterator(EventList list) {
this.list=list;
this.pos=-1;
}
@Override
public boolean hasNext() {
return pos<(list.end-1);
}
@Override
public EventEntry next() {
if(hasNext()) {
pos++;
return list.store.get(pos);
} else
return null;
}
@Override
public void remove() {
list.store.remove(pos);
}
}
public EventList() {
}
private EventList(ArrayList<EventEntry> store , int start, int end) {
this.store=store;
this.start=start;
this.end=end;
this.unmodifiable=true;
}
@Override
public IEventList subMap(long from, boolean includeFrom, long to) {
//the index of the first element greater than the key, or list.size()
int beginIndex = Collections.binarySearch(store, new EventEntry(from));
int startIndex = beginIndex < 0? -(beginIndex + 1): beginIndex;
int endIndex = Collections.binarySearch(store, new EventEntry(to));
endIndex = endIndex < 0? -(endIndex + 1): endIndex+1;
if(beginIndex>0 && !includeFrom)
return new EventList(store, startIndex+1, endIndex);
else
return new EventList(store, startIndex, endIndex);
}
@Override
public int size() {
return end-start;
}
@Override
public boolean containsKey(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
return index>=0 && index>=start && index<end;
}
@Override
public IEvent[] get(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
if(index<0) return null;
return index>=start && index<end? store.get(index).events: null;
}
@Override
public void put(long key, IEvent value) {
if(unmodifiable) throw new UnsupportedOperationException();
if(store.size()==0 || store.get(store.size()-1).timestamp < key) {
store.add(new EventEntry(key, new IEvent[] {value}));
} else {
int index = Collections.binarySearch(store, new EventEntry(key));
// < 0 if element is not in the list, see Collections.binarySearch
if (index < 0) {
EventEntry e = new EventEntry(key, new IEvent[] {value});
index = -(index + 1);
store.add(index, e);
} else {
// Insertion index is index of existing element, to add new element behind it increase index
store.get(index).append(value);
}
}
end=store.size();
}
@Override
public Collection<EventEntry> entrySet() {
if(start != 0 || end != store.size())
return Collections.unmodifiableList(store.subList(start, end));
else
return Collections.unmodifiableList(store);
}
@Override
public boolean isEmpty() {
return start==end || store.isEmpty();
}
@Override
public long firstKey() {
return store.get(start).timestamp;
}
@Override
public long lastKey() {
return store.get(end-1).timestamp;
}
// Navigable map functions
@Override
public EventEntry firstEntry() {
return store.get(start);
}
@Override
public EventEntry lastEntry() {
return store.get(end-1);
}
@Override
public EventEntry floorEntry(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
if(index==-1) return null;
// < 0 if element is not in the list, see Collections.binarySearch
if (index < 0) {
index = -(index + 2);
}
if(index>=end)
return store.get(end-1);
return index<start? null: store.get(index);
}
@Override
public EventEntry ceilingEntry(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
// < 0 if element is not in the list, see Collections.binarySearch
if (index < 0)
index = -(index + 1);
if(index<start)
return store.get(start);
return index>=end? null: store.get(index);
}
@Override
public EventEntry lowerEntry(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
// < 0 if element is not in the list, see Collections.binarySearch
if (index < 0)
index = -(index + 1);
index--;
if(index>=end)
return store.get(end-1);
return index>=end || index<start ?null:store.get(index);
}
@Override
public EventEntry higherEntry(long key) {
int index = Collections.binarySearch(store, new EventEntry(key));
// < 0 if element is not in the list, see Collections.binarySearch
if (index < 0)
index = -(index + 1);
else
index++;
if(index<start)
return store.get(start);
return index>=end || index<start ?null:store.get(index);
}
@Override
public java.util.Iterator<EventEntry> iterator() {
return new Iterator(this);
}
}

View File

@ -80,7 +80,7 @@ public class HierNode implements IHierNode {
} }
/** /**
* Gets the full name. * Gets the full hierarchical name.
* *
* @return the full name * @return the full name
*/ */

View File

@ -0,0 +1,84 @@
package com.minres.scviewer.database;
import java.util.Collection;
public interface IEventList extends Iterable<EventEntry> {
int size();
Collection<EventEntry> entrySet();
boolean containsKey(long key);
IEvent[] get(long key);
void put(long key, IEvent value);
long firstKey();
long lastKey();
boolean isEmpty();
/**
* Returns a key-value mapping associated with the greatest key less
* than or equal to the given key, or null if there is no such key.
*
* @param key
* @return
*/
EventEntry floorEntry(long key);
/**
* Returns a key-value mapping associated with the least key greater
* than or equal to the given key, or null if there is no such key.
*
* @param key
* @return
*/
EventEntry ceilingEntry(long key);
/**
* Returns a key-value mapping associated with the least key in this map,
* or null if the map is empty.
*
* @return
*/
EventEntry firstEntry();
/**
* Returns a key-value mapping associated with the least key in this map,
* or null if the map is empty.
*
* @return
*/
EventEntry lastEntry();
/**
* Returns a key-value mapping associated with the least key strictly greater
* than the given key, or null if there is no such key.
*
* @param key
* @return
*/
EventEntry higherEntry(long key);
/**
* Returns a key-value mapping associated with the greatest key strictly less
* than the given key, or null if there is no such key.
*
* @param key
* @return
*/
EventEntry lowerEntry(long key);
/**
* Returns a view of the portion of this map whose keys range from
* {@code fromKey} to {@code toKey}. If {@code fromKey} and
* {@code toKey} are equal, the returned map is empty unless
* {@code fromInclusive} is true. The
* returned map is backed by this map, so changes in the returned map are
* reflected in this map, and vice-versa. The returned map supports all
* optional map operations that this map supports.
*
* @param fromKey low endpoint of the keys in the returned map
* @param fromInclusive {@code true} if the low endpoint
* is to be included in the returned view
* @param toKey high endpoint of the keys in the returned map (inclusive)
*/
IEventList subMap(long key, boolean b, long key2);
}

View File

@ -10,8 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package com.minres.scviewer.database; package com.minres.scviewer.database;
import java.util.NavigableMap;
// TODO: Auto-generated Javadoc
/** /**
* The Interface IWaveform. * The Interface IWaveform.
* *
@ -24,7 +24,7 @@ public interface IWaveform extends IHierNode {
* *
* @return the id * @return the id
*/ */
public Long getId(); public long getId();
/** /**
* Checks if is same. * Checks if is same.
@ -39,7 +39,7 @@ public interface IWaveform extends IHierNode {
* *
* @return the events * @return the events
*/ */
public NavigableMap<Long, IEvent[]> getEvents(); public IEventList getEvents();
/** /**
* Gets the events at time. * Gets the events at time.
@ -47,7 +47,7 @@ public interface IWaveform extends IHierNode {
* @param time the time * @param time the time
* @return the events at time * @return the events at time
*/ */
public IEvent[] getEventsAtTime(Long time); public IEvent[] getEventsAtTime(long time);
/** /**
* Gets the events before time. * Gets the events before time.
@ -55,7 +55,7 @@ public interface IWaveform extends IHierNode {
* @param time the time * @param time the time
* @return the events before time * @return the events before time
*/ */
public IEvent[] getEventsBeforeTime(Long time); public IEvent[] getEventsBeforeTime(long time);
/** /**
* Gets the type. * Gets the type.
@ -76,6 +76,6 @@ public interface IWaveform extends IHierNode {
* *
* @return the width * @return the width
*/ */
public int getWidth(); public int getRowCount();
} }

View File

@ -23,7 +23,7 @@ public interface IWaveformDb extends IHierNode {
* *
* @return the max time * @return the max time
*/ */
public Long getMaxTime(); public long getMaxTime();
/** /**
* Gets the stream by name. * Gets the stream by name.

View File

@ -69,7 +69,7 @@ public interface IWaveformDbLoader {
* *
* @return the max time * @return the max time
*/ */
public Long getMaxTime(); public long getMaxTime();
/** /**
* Gets the all waves. * Gets the all waves.

View File

@ -45,7 +45,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL
private Map<String, IWaveform> waveforms; private Map<String, IWaveform> waveforms;
/** The max time. */ /** The max time. */
private Long maxTime; private long maxTime = -1;
/** /**
* Bind. * Bind.
@ -90,7 +90,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL
* @return the max time * @return the max time
*/ */
@Override @Override
public Long getMaxTime() { public long getMaxTime() {
return maxTime; return maxTime;
} }
@ -123,31 +123,31 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL
*/ */
@Override @Override
public boolean load(File inp) { public boolean load(File inp) {
boolean retval = true;
for (IWaveformDbLoader loader : loaders) { for (IWaveformDbLoader loader : loaders) {
if (loader.canLoad(inp)) { if (loader.canLoad(inp)) {
loader.addPropertyChangeListener(this);
try { try {
loader.addPropertyChangeListener(this);
loader.load(this, inp); loader.load(this, inp);
loader.removePropertyChangeListener(this);
for (IWaveform w : loader.getAllWaves()) {
waveforms.put(w.getFullName(), w);
}
if (loader.getMaxTime() > maxTime) {
maxTime = loader.getMaxTime();
}
if (name == null)
name = getFileBasename(inp.getName());
buildHierarchyNodes();
relationTypes.addAll(loader.getAllRelationTypes());
pcs.firePropertyChange(IHierNode.LOADING_FINISHED, null, null);
loaded = true;
return true;
} catch (Exception e) { } catch (Exception e) {
return false; retval=false;
} }
loader.removePropertyChangeListener(this);
for (IWaveform w : loader.getAllWaves()) {
waveforms.put(w.getFullName(), w);
}
if (loader.getMaxTime() > maxTime) {
maxTime = loader.getMaxTime();
}
if (name == null)
name = getFileBasename(inp.getName());
buildHierarchyNodes();
relationTypes.addAll(loader.getAllRelationTypes());
} }
} }
return false; pcs.firePropertyChange(IHierNode.LOADING_FINISHED, null, null);
loaded = true;
return retval;
} }
/** /**
@ -189,6 +189,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL
if (IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName()) if (IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName())
|| IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) { || IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) {
IWaveform waveform = (IWaveform) evt.getNewValue(); IWaveform waveform = (IWaveform) evt.getNewValue();
waveforms.put(waveform.getFullName(), waveform);
putInHierarchy(waveform); putInHierarchy(waveform);
pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms); pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms);
pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes);
@ -226,14 +227,13 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL
break; break;
} }
} }
if (childNode != null) { if (childNode == null) {
HierNode newNode = new HierNode(name, node);
node.addChild(newNode);
node = newNode;
} else {
node = childNode; node = childNode;
break;
} }
HierNode newNode = new HierNode(name, node);
node.addChild(newNode);
node = newNode;
} }
node.addChild(waveform); node.addChild(waveform);
waveform.setParent(node); waveform.setParent(node);

View File

@ -25,7 +25,7 @@ public interface ITx extends Comparable<ITx> {
* *
* @return the id * @return the id
*/ */
public Long getId(); public long getId();
/** /**
* Gets the stream. * Gets the stream.
@ -39,28 +39,21 @@ public interface ITx extends Comparable<ITx> {
* *
* @return the generator * @return the generator
*/ */
public ITxGenerator getGenerator(); public IWaveform getGenerator();
/** /**
* Gets the begin time. * Gets the begin time.
* *
* @return the begin time * @return the begin time
*/ */
public Long getBeginTime(); public long getBeginTime();
/** /**
* Gets the end time. * Gets the end time.
* *
* @return the end time * @return the end time
*/ */
public Long getEndTime(); public long getEndTime();
/**
* Gets the concurrency index.
*
* @return the concurrency index
*/
public int getConcurrencyIndex();
/** /**
* Gets the attributes. * Gets the attributes.

View File

@ -22,7 +22,7 @@ public interface ITxEvent extends IEvent {
* *
* @return the time * @return the time
*/ */
public Long getTime(); public long getTime();
/** /**
* Gets the transaction. * Gets the transaction.
@ -30,4 +30,12 @@ public interface ITxEvent extends IEvent {
* @return the transaction * @return the transaction
*/ */
public ITx getTransaction(); public ITx getTransaction();
/**
* Gets the concurrency index.
*
* @return the concurrency index
*/
public int getRowIndex();
} }

View File

@ -1,27 +0,0 @@
/*******************************************************************************
* Copyright (c) 2015-2021 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.tx;
import com.minres.scviewer.database.IWaveform;
/**
* The Interface ITxGenerator.
*/
public interface ITxGenerator extends IWaveform {
/**
* Gets the stream.
*
* @return the stream
*/
public IWaveform getStream();
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <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="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>

View File

@ -1,13 +1,15 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 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.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11

View File

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name Bundle-Name: %Bundle-Name
Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true
Bundle-Version: 2.11.0.qualifier Bundle-Version: 2.13.1
Bundle-Vendor: %Bundle-Vendor Bundle-Vendor: %Bundle-Vendor
Require-Bundle: javax.inject;bundle-version="1.0.0", Require-Bundle: javax.inject;bundle-version="1.0.0",
org.eclipse.core.runtime;bundle-version="3.11.1", org.eclipse.core.runtime;bundle-version="3.11.1",
@ -36,7 +36,7 @@ Require-Bundle: javax.inject;bundle-version="1.0.0",
org.eclipse.equinox.p2.engine;bundle-version="2.6.600", org.eclipse.equinox.p2.engine;bundle-version="2.6.600",
org.eclipse.equinox.p2.operations;bundle-version="2.5.700", org.eclipse.equinox.p2.operations;bundle-version="2.5.700",
org.eclipse.equinox.p2.metadata.repository;bundle-version="1.3.400" org.eclipse.equinox.p2.metadata.repository;bundle-version="1.3.400"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: com.minres.scviewer.database, Import-Package: com.minres.scviewer.database,
javax.inject;version="1.0.0" javax.inject;version="1.0.0"
Automatic-Module-Name: com.minres.scviewer.e4.application Automatic-Module-Name: com.minres.scviewer.e4.application

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 B

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

View File

@ -3,11 +3,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 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> <modelVersion>4.0.0</modelVersion>
<artifactId>com.minres.scviewer.e4.application</artifactId> <artifactId>com.minres.scviewer.e4.application</artifactId>
<version>2.11.0-SNAPSHOT</version>
<parent> <parent>
<groupId>com.minres.scviewer</groupId> <groupId>com.minres.scviewer</groupId>
<artifactId>com.minres.scviewer.parent</artifactId> <artifactId>com.minres.scviewer.parent</artifactId>
<version>2.11.0</version> <version>2.13.1</version>
<relativePath>../..</relativePath> <relativePath>../..</relativePath>
</parent> </parent>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View File

@ -61,6 +61,8 @@ public class E4LifeCycle {
final Options opt = new Options(args, 0, Integer.MAX_VALUE); final Options opt = new Options(args, 0, Integer.MAX_VALUE);
opt.getSet() opt.getSet()
.addOption("clearPersistedState", Multiplicity.ZERO_OR_ONE) .addOption("clearPersistedState", Multiplicity.ZERO_OR_ONE)
.addOption("launcher.defaultAction", Separator.BLANK, Multiplicity.ZERO_OR_ONE)
.addOption("launcher.openFile", Multiplicity.ZERO_OR_ONE)
.addOption("c", Separator.BLANK, Multiplicity.ZERO_OR_ONE); .addOption("c", Separator.BLANK, Multiplicity.ZERO_OR_ONE);
if (!opt.check(Options.DEFAULT_SET, true, false)) { if (!opt.check(Options.DEFAULT_SET, true, false)) {
logger.error(opt.getCheckErrors()); logger.error(opt.getCheckErrors());

View File

@ -40,7 +40,7 @@ public class WaveformPopupMenuContribution {
if(elem instanceof TrackEntry) { if(elem instanceof TrackEntry) {
TrackEntry e = (TrackEntry) elem; TrackEntry e = (TrackEntry) elem;
if(e.waveform.getType() == WaveformType.SIGNAL) { if(e.waveform.getType() == WaveformType.SIGNAL) {
Object o = e.waveform.getEvents().firstEntry().getValue()[0]; Object o = e.waveform.getEvents().firstEntry().events[0];
if(checkForDouble && o instanceof DoubleVal) if(checkForDouble && o instanceof DoubleVal)
return true; return true;
else if(o instanceof BitVector && ((BitVector)o).getWidth()>1) else if(o instanceof BitVector && ((BitVector)o).getWidth()>1)

View File

@ -482,6 +482,7 @@ public class HeapStatus extends Composite {
}); });
} }
}; };
t.setDaemon(true);
t.start(); t.start();
} }

View File

@ -9,7 +9,7 @@ DesignBrowser_8=Insert before
LoadingWaveformDb_0=Database loading... LoadingWaveformDb_0=Database loading...
LoadStoreSettingsHandler_2=*.scview LoadStoreSettingsHandler_2=*.scview
LoadStoreSettingsHandler_3=SCViewer.scview LoadStoreSettingsHandler_3=SCViewer.scview
OpenHandler_0=*.vcd;*.txdb;*.txlog;*.fbrdb OpenHandler_0=*.vcd;*.vcd.gz;*.txdb;*.txdb.gz;*.txlog;*.fbrdb
QuitHandler_0=Confirmation QuitHandler_0=Confirmation
QuitHandler_1=Do you want to exit? QuitHandler_1=Do you want to exit?
RelationTypeToolControl_0=------------ RelationTypeToolControl_0=------------

View File

@ -133,10 +133,11 @@ public class DesignBrowser {
treeViewer.refresh(); treeViewer.refresh();
}); });
} else if(IHierNode.LOADING_FINISHED.equals(evt.getPropertyName())) { } else if(IHierNode.LOADING_FINISHED.equals(evt.getPropertyName())) {
treeViewer.getTree().getDisplay().asyncExec(() -> { if(!treeViewer.getControl().isDisposed())
treeViewer.update(waveformViewerPart.getDatabase(), null); treeViewer.getTree().getDisplay().asyncExec(() -> {
DesignBrowser.this.updateButtons(); treeViewer.update(waveformViewerPart.getDatabase(), null);
}); DesignBrowser.this.updateButtons();
});
} }
}; };
@ -206,7 +207,7 @@ public class DesignBrowser {
updateButtons(); updateButtons();
} }
}); });
treeViewer.setLabelProvider(new TxDbLabelProvider()); treeViewer.setLabelProvider(new TxDbLabelProvider(true));
treeViewer.addFilter(treeAttributeFilter); treeViewer.addFilter(treeAttributeFilter);
treeViewer.setUseHashlookup(true); treeViewer.setUseHashlookup(true);
treeViewer.setAutoExpandLevel(2); treeViewer.setAutoExpandLevel(2);
@ -252,7 +253,7 @@ public class DesignBrowser {
updateButtons(); updateButtons();
} }
}); });
txTableViewer.setLabelProvider(new TxDbLabelProvider()); txTableViewer.setLabelProvider(new TxDbLabelProvider(false));
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
txTableViewer.addFilter(tableAttributeFilter); txTableViewer.addFilter(tableAttributeFilter);
txTableViewer.addDoubleClickListener(event -> { txTableViewer.addDoubleClickListener(event -> {
@ -596,6 +597,7 @@ public class DesignBrowser {
* Apply. * Apply.
*/ */
public void apply() { public void apply() {
if(treeViewer.getControl().isDisposed()) return;
treeViewer.setExpandedElements(expandedElements); treeViewer.setExpandedElements(expandedElements);
treeViewer.setSelection(treeSelection, true); treeViewer.setSelection(treeSelection, true);
txTableViewer.setSelection(tableSelection, true); txTableViewer.setSelection(tableSelection, true);

View File

@ -337,7 +337,11 @@ public class FileBrowserDialog extends TrayDialog {
if(f instanceof File) { if(f instanceof File) {
if(matchers.isEmpty()) return true; if(matchers.isEmpty()) return true;
for (PathMatcher m : matchers) { for (PathMatcher m : matchers) {
try {
if(m.matches(((File)f).toPath())) return true; if(m.matches(((File)f).toPath())) return true;
} catch (Exception e) {
return false;
}
} }
} }
return false; return false;

View File

@ -32,12 +32,11 @@ import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Text;
import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.DataType;
import com.minres.scviewer.database.EventEntry;
import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.EventKind;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.WaveformType;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxAttribute;
import com.minres.scviewer.database.tx.ITxEvent; import com.minres.scviewer.database.tx.ITxEvent;
import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider; import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider;
@ -78,6 +77,8 @@ public class TransactionList extends Composite {
private TableViewer tableViewer = null; private TableViewer tableViewer = null;
Thread updateThread = null;
private TableColumn valueColumn = null; private TableColumn valueColumn = null;
private AttributeLabelProvider valueLabelProvider = null; private AttributeLabelProvider valueLabelProvider = null;
@ -86,8 +87,6 @@ public class TransactionList extends Composite {
private ObservableList<AttributeNameBean> attrNames = new WritableList<>(); private ObservableList<AttributeNameBean> attrNames = new WritableList<>();
private List<ITx> eventList = new ArrayList<>();
private List<ITx> emptyList = new ArrayList<>(); private List<ITx> emptyList = new ArrayList<>();
TxFilter txFilter; TxFilter txFilter;
@ -244,56 +243,50 @@ public class TransactionList extends Composite {
} else if(stream != trackEntry.waveform) { } else if(stream != trackEntry.waveform) {
stream=trackEntry.waveform; stream=trackEntry.waveform;
tableViewer.setInput(emptyList); tableViewer.setInput(emptyList);
new Thread() { try{
private ConcurrentHashMap<String, DataType> propNames=new ConcurrentHashMap<>(); if(updateThread!=null)
updateThread.interrupt();
private List<AttributeNameBean> getEntries() { }catch(SecurityException e){}
return propNames.entrySet().stream() updateThread = new Thread(()-> {
.sorted((e1,e2)->e1.getKey().compareTo(e2.getKey())) final ConcurrentHashMap<String, DataType> propNames=new ConcurrentHashMap<>();
.map(e -> new AttributeNameBean(e.getKey(), e.getValue())) Collection<EventEntry> values = stream.getEvents().entrySet();
.collect(Collectors.toList()); final List<ITx> txList = values.parallelStream()
} .map(e->e.events)
.map(Arrays::asList)
@Override .flatMap(List::stream)
public void run() { .filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)
Collection<IEvent[]> values = stream.getEvents().values(); .map(evt-> {
eventList = values.parallelStream().map(Arrays::asList) ITx tx = ((ITxEvent)evt).getTransaction();
.flatMap(List::stream) tx.getAttributes().forEach(attr -> propNames.put(attr.getName(), attr.getDataType()));
.filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) return tx;
.map(evt-> { })
ITx tx = ((ITxEvent)evt).getTransaction(); .sorted((t1, t2)-> Long.compare(t1.getBeginTime(),t2.getBeginTime()))
for(ITxAttribute attr: tx.getAttributes()) { .collect(Collectors.toList());
propNames.put(attr.getName(), attr.getDataType()); final List<AttributeNameBean> newAttrNames=propNames.entrySet().stream()
} .sorted((e1,e2)->e1.getKey().compareTo(e2.getKey()))
return tx; .map(e -> new AttributeNameBean(e.getKey(), e.getValue()))
}) .collect(Collectors.toList());
.sorted((t1, t2)-> t1.getBeginTime().compareTo(t2.getBeginTime())) getDisplay().asyncExec(() -> {
.collect(Collectors.toList()); tableViewer.setInput(txList);
getDisplay().asyncExec(new Runnable() { attrNames.clear();
@Override attrNames.addAll(newAttrNames);
public void run() { if(!attrNames.isEmpty())
tableViewer.setInput(eventList); txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
attrNames.clear(); if (searchPropComboViewer!=null)
attrNames.addAll(getEntries()); searchPropComboViewer.refresh();
if(!attrNames.isEmpty()) if (viewPropComboViewer!=null)
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType()); viewPropComboViewer.refresh();
if (searchPropComboViewer!=null) { });
searchPropComboViewer.setInput(attrNames); updateThread=null;
Object sel = searchPropComboViewer.getElementAt(0); });
if(sel!=null) searchPropComboViewer.setSelection(new StructuredSelection(sel)); updateThread.start();
}
tableViewer.refresh(true);
}
});
}
}.start();
} }
} }
public void setSearchProps(String propName, DataType type, String propValue) { public void setSearchProps(String propName, DataType type, String propValue) {
for(int i=0; i<attrNames.size(); ++i) { for(int i=0; i<searchPropComboViewer.getCombo().getItemCount(); ++i) {
AttributeNameBean e = attrNames.get(i); String itemName = searchPropComboViewer.getCombo().getItem(i);
if(propName.equals(e.getName()) && type.equals(e.getType())) { if(propName.equals(itemName)) {
searchPropComboViewer.getCombo().select(i); searchPropComboViewer.getCombo().select(i);
break; break;
} }

View File

@ -570,6 +570,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
(result.isMultiStatus() && result.getChildren().length > 0 && result.getChildren()[0].getCode() != Status.OK_STATUS.getCode() ) ){ (result.isMultiStatus() && result.getChildren().length > 0 && result.getChildren()[0].getCode() != Status.OK_STATUS.getCode() ) ){
// kill editor and pop up warning for user // kill editor and pop up warning for user
sync.asyncExec(() -> { sync.asyncExec(() -> {
if(myParent.isDisposed()) return;
final Display display = myParent.getDisplay(); final Display display = myParent.getDisplay();
MessageDialog.openWarning(display.getActiveShell(), "Error loading database", "Database cannot be loaded. Aborting..."); MessageDialog.openWarning(display.getActiveShell(), "Error loading database", "Database cannot be loaded. Aborting...");
ePartService.hidePart(myPart, true); ePartService.hidePart(myPart, true);
@ -577,7 +578,9 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
} else } else
sync.asyncExec(()->{ sync.asyncExec(()->{
waveformPane.setMaxTime(database.getMaxTime()); waveformPane.setMaxTime(database.getMaxTime());
if (state != null) if(partConfig!=null && !partConfig.isEmpty())
loadState(partConfig);
if (state != null && !state.isEmpty())
restoreWaveformViewerState(state); restoreWaveformViewerState(state);
fileChecker = null; fileChecker = null;
if (checkForUpdates) if (checkForUpdates)
@ -630,13 +633,9 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
if (file.exists()) if (file.exists())
filesToLoad.add(file); filesToLoad.add(file);
} }
if(partConfig!=null) { this.partConfig=partConfig;
this.partConfig=partConfig;
}
if (!filesToLoad.isEmpty()) if (!filesToLoad.isEmpty())
loadDatabase(persistedState); loadDatabase(persistedState);
if(partConfig!=null && !partConfig.isEmpty())
loadState(partConfig);
} }
/** /**
@ -815,9 +814,18 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
String trackentryName = state.get(SELECTED_TRACKENTRY_NAME); String trackentryName = state.get(SELECTED_TRACKENTRY_NAME);
//get TrackEntry Object based on name and TX Object by id and put into selectionList //get TrackEntry Object based on name and TX Object by id and put into selectionList
trackEntries.stream().filter(e->trackentryName.equals(e.waveform.getFullName())).forEach(trackEntry -> trackEntries.stream().filter(e->trackentryName.equals(e.waveform.getFullName())).forEach(trackEntry ->
trackEntry.waveform.getEvents().values().stream().filter(Objects::nonNull).forEach(entries-> trackEntry.waveform.getEvents().entrySet().stream()
Arrays.stream(entries).filter(e->e instanceof ITxEvent && txId.equals(((ITxEvent)e).getTransaction().getId())).forEach(event -> .map(e->e.events)
waveformPane.setSelection(new StructuredSelection(new Object[] {((ITxEvent)event).getTransaction(), trackEntry}))))); .filter(Objects::nonNull)
.forEach(entries->
Arrays.stream(entries)
.filter(e->e instanceof ITxEvent && txId.equals(((ITxEvent)e).getTransaction().getId()))
.forEach(event ->
waveformPane.setSelection(new StructuredSelection(
new Object[] {((ITxEvent)event).getTransaction(), trackEntry}))
)
)
);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
} }
} }
@ -1019,27 +1027,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
* Sets the zoom fit. * Sets the zoom fit.
*/ */
public void setZoomFit() { public void setZoomFit() {
//actual max time of signal waveformPane.setZoomLevel(-1);
long maxTime = waveformPane.getMaxTime();
//get area actually capable of displaying data, i.e. area of the receiver which is capable of displaying data
Rectangle clientArea = myParent.getClientArea();
long clientAreaWidth = clientArea.width;
boolean foundZoom=false;
//try to find existing zoomlevel where scaleFactor*clientAreaWidth >= maxTime, if one is found set it as new zoomlevel
for (int level=0; level<Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length; level++){
long scaleFactor = (long) Math.pow(10, level/2d);
if(level%2==1) scaleFactor*=3;
if(scaleFactor*clientAreaWidth >= maxTime) {
setZoomLevel(level);
foundZoom=true;
break;
}
}
//if no zoom level is found, set biggest one available
if(!foundZoom) setZoomLevel(Constants.UNIT_MULTIPLIER.length*Constants.UNIT_STRING.length-1);
updateAll(); updateAll();
} }

View File

@ -69,7 +69,7 @@ public class AttributeLabelProvider extends LabelProvider implements IStyledLabe
ITx iTx = (ITx) element; ITx iTx = (ITx) element;
switch(field){ switch(field){
case NAME: case NAME:
return new StyledString(iTx.getId().toString()); return new StyledString(String.format("%d", iTx.getId()));
case TX_TIME: case TX_TIME:
return new StyledString(waveformViewerPart.getScaledTime(iTx.getBeginTime())); return new StyledString(waveformViewerPart.getScaledTime(iTx.getBeginTime()));
case TYPE: case TYPE:

View File

@ -52,9 +52,7 @@ public class TxDbContentProvider implements ITreeContentProvider {
*/ */
@Override @Override
public Object[] getElements(Object inputElement) { public Object[] getElements(Object inputElement) {
if(tableEntries && inputElement instanceof IWaveformDb){ if(inputElement instanceof IHierNode){
return new Object[]{};
}else if(inputElement instanceof IHierNode){
// make a copy as the laoder might continue to add waveforms // make a copy as the laoder might continue to add waveforms
ArrayList<IHierNode> nodes = new ArrayList<>(((IHierNode)inputElement).getChildNodes()); ArrayList<IHierNode> nodes = new ArrayList<>(((IHierNode)inputElement).getChildNodes());
return nodes.stream().filter(n -> return nodes.stream().filter(n ->

Some files were not shown because too many files have changed in this diff Show More