From dc861722c4b8fbc2863997a6d7548ab4f4b0ded2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2015 00:23:46 +0100 Subject: [PATCH] Unified databases so that signals and transactions can be loaded into same database --- .../OSGI-INF/component.xml | 6 +- .../database/sqlite/SQLiteDbFactory.java | 36 ----- .../{SQLiteDb.java => SQLiteDbLoader.java} | 96 +++--------- .../minres/scviewer/database/sqlite/Tx.java | 24 +-- .../scviewer/database/sqlite/TxStream.java | 27 ++-- .../database/sqlite/db/IDatabase.java | 3 + .../database/sqlite/db/SQLiteDatabase.java | 14 ++ .../database/test/DatabaseServicesTest.java | 65 +++----- .../OSGI-INF/component.xml | 6 +- .../database/text/TextDbFactory.groovy | 31 ---- .../{TextDb.groovy => TextDbLoader.groovy} | 86 ++++------- .../scviewer/database/text/TxStream.groovy | 5 +- com.minres.scviewer.database.vcd/.classpath | 7 + com.minres.scviewer.database.vcd/.gitignore | 1 + com.minres.scviewer.database.vcd/.project | 33 +++++ .../.settings/org.eclipse.jdt.core.prefs | 7 + .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 13 ++ .../OSGI-INF/component.xml | 7 + .../build.properties | 4 + .../database/vcd/IVCDDatabaseBuilder.java | 0 .../scviewer/database/vcd/VCDDbLoader.java | 90 +++-------- .../scviewer/database/vcd/VCDFileParser.java | 0 .../scviewer/database/vcd/VCDSignal.java | 18 ++- .../database/vcd/VCDSignalChangeMulti.java | 0 .../database/vcd/VCDSignalChangeSingle.java | 0 .../META-INF/MANIFEST.MF | 5 +- .../OSGI-INF/component.xml | 8 +- com.minres.scviewer.database/build.properties | 1 + .../minres/scviewer/database/EventTime.java | 8 +- .../minres/scviewer/database/HierNode.java | 21 ++- .../minres/scviewer/database/IHierNode.java | 2 +- .../minres/scviewer/database/IWaveformDb.java | 2 +- .../scviewer/database/IWaveformDbFactory.java | 9 -- .../scviewer/database/IWaveformDbLoader.java | 14 ++ .../minres/scviewer/database/WaveformDb.java | 140 ++++++++++++++++++ .../scviewer/database/vcd/VCDDbFactory.java | 37 ----- com.minres.scviewer.ui/META-INF/MANIFEST.MF | 6 +- com.minres.scviewer.ui/SilkCompanion1.txt | 56 +++++++ com.minres.scviewer.ui/plugin.xml | 99 +++++++++++++ .../res/images/next-green-d.png | Bin 0 -> 337 bytes .../res/images/next-green.png | Bin 0 -> 519 bytes .../res/images/previous-green-d.png | Bin 0 -> 345 bytes .../res/images/previous-green.png | Bin 0 -> 524 bytes .../com/minres/scviewer/ui/TxEditorPart.java | 121 ++++++++------- .../minres/scviewer/ui/TxEditorPlugin.java | 2 - .../scviewer/ui/handler/GotoDirection.java | 3 + .../minres/scviewer/ui/handler/GotoNext.java | 23 +++ .../minres/scviewer/ui/handler/GotoPrev.java | 22 +++ .../src/com/minres/scviewer/ui/swt/Track.java | 1 - .../com/minres/scviewer/ui/swt/TxDisplay.java | 15 +- .../ui/views/sections/RelatedProperty.java | 4 +- 52 files changed, 703 insertions(+), 478 deletions(-) delete mode 100644 com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbFactory.java rename com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/{SQLiteDb.java => SQLiteDbLoader.java} (60%) delete mode 100644 com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbFactory.groovy rename com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/{TextDb.groovy => TextDbLoader.groovy} (78%) create mode 100644 com.minres.scviewer.database.vcd/.classpath create mode 100644 com.minres.scviewer.database.vcd/.gitignore create mode 100644 com.minres.scviewer.database.vcd/.project create mode 100644 com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.minres.scviewer.database.vcd/.settings/org.eclipse.pde.core.prefs create mode 100644 com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF create mode 100644 com.minres.scviewer.database.vcd/OSGI-INF/component.xml create mode 100644 com.minres.scviewer.database.vcd/build.properties rename {com.minres.scviewer.database => com.minres.scviewer.database.vcd}/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java (100%) rename com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDb.java => com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java (70%) rename {com.minres.scviewer.database => com.minres.scviewer.database.vcd}/src/com/minres/scviewer/database/vcd/VCDFileParser.java (100%) rename {com.minres.scviewer.database => com.minres.scviewer.database.vcd}/src/com/minres/scviewer/database/vcd/VCDSignal.java (86%) rename {com.minres.scviewer.database => com.minres.scviewer.database.vcd}/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java (100%) rename {com.minres.scviewer.database => com.minres.scviewer.database.vcd}/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java (100%) delete mode 100644 com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java create mode 100644 com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java create mode 100644 com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java delete mode 100644 com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDbFactory.java create mode 100644 com.minres.scviewer.ui/SilkCompanion1.txt create mode 100644 com.minres.scviewer.ui/res/images/next-green-d.png create mode 100644 com.minres.scviewer.ui/res/images/next-green.png create mode 100644 com.minres.scviewer.ui/res/images/previous-green-d.png create mode 100644 com.minres.scviewer.ui/res/images/previous-green.png create mode 100644 com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoDirection.java create mode 100644 com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoNext.java create mode 100644 com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoPrev.java diff --git a/com.minres.scviewer.database.sqlite/OSGI-INF/component.xml b/com.minres.scviewer.database.sqlite/OSGI-INF/component.xml index e4c54e9..071954e 100644 --- a/com.minres.scviewer.database.sqlite/OSGI-INF/component.xml +++ b/com.minres.scviewer.database.sqlite/OSGI-INF/component.xml @@ -1,7 +1,7 @@ - - + + - + diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbFactory.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbFactory.java deleted file mode 100644 index 6ca6274..0000000 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.minres.scviewer.database.sqlite; - -import java.io.File; -import java.io.FileInputStream; - -import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.IWaveformDbFactory; - -public class SQLiteDbFactory implements IWaveformDbFactory { - - private byte[] x = "SQLite format 3".getBytes(); - - public SQLiteDbFactory() { - } - - @Override - public IWaveformDb createDatabase(File file) { - try { - FileInputStream fis = new FileInputStream(file); - byte[] buffer = new byte[x.length]; - int read = fis.read(buffer, 0, x.length); - fis.close(); - if (read == x.length) - for (int i = 0; i < x.length; i++) - if (buffer[i] != x[i]) - return null; - SQLiteDb db = new SQLiteDb(); - db.load(file); - return db; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - -} diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDb.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java similarity index 60% rename from com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDb.java rename to com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java index fd5c6ab..d252028 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDb.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java @@ -2,6 +2,7 @@ package com.minres.scviewer.database.sqlite; import java.beans.IntrospectionException; import java.io.File; +import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.ArrayList; @@ -9,12 +10,9 @@ import java.util.HashMap; import java.util.List; import com.minres.scviewer.database.EventTime; -import com.minres.scviewer.database.HierNode; -import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.InputFormatException; +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformDbLoader; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabase; @@ -23,7 +21,7 @@ import com.minres.scviewer.database.sqlite.tables.ScvSimProps; import com.minres.scviewer.database.sqlite.tables.ScvStream; import com.minres.scviewer.database.sqlite.tables.ScvTxEvent; -public class SQLiteDb extends HierNode implements IWaveformDb { +public class SQLiteDbLoader implements IWaveformDbLoader { protected IDatabase database; @@ -32,13 +30,10 @@ public class SQLiteDb extends HierNode implements IWaveformDb { long timeResolution=1; private HashMap relationMap = new HashMap(); + + private IWaveformDb db; - IDatabase getDb(){ - return database; - } - - public SQLiteDb() { - super("SQLiteDb"); + public SQLiteDbLoader() { } @Override @@ -63,7 +58,7 @@ public class SQLiteDb extends HierNode implements IWaveformDb { streams=new ArrayList(); try { for(ScvStream scvStream:handler.selectObjects()){ - streams.add(new TxStream(this, scvStream)); + streams.add(new TxStream(database, db, scvStream)); } } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { @@ -73,77 +68,34 @@ public class SQLiteDb extends HierNode implements IWaveformDb { return streams; } + private byte[] x = "SQLite format 3".getBytes(); + @Override - public void load(File file) throws InputFormatException { + public boolean load(IWaveformDb db, File file) throws Exception { + this.db=db; + FileInputStream fis = new FileInputStream(file); + byte[] buffer = new byte[x.length]; + int read = fis.read(buffer, 0, x.length); + fis.close(); + if (read == x.length) + for (int i = 0; i < x.length; i++) + if (buffer[i] != x[i]) return false; + database=new SQLiteDatabase(file.getAbsolutePath()); + database.setData("TIMERESOLUTION", 1L); SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvSimProps.class, database); try { for(ScvSimProps scvSimProps:handler.selectObjects()){ - timeResolution=scvSimProps.getTime_resolution(); + database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution()); } + return true; } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { e.printStackTrace(); } - buildHierarchyNodes(); + return false; } - @Override - public void clear() { - database=null; - } - - @Override - public IWaveform getStreamByName(String name) { - for (IWaveform n : getAllWaves()) - if (n.getFullName().equals(name)) - return n; - return null; - } - - public ITxStream getStreamById(long id) { - for (IWaveform n : getAllWaves()) - if (n.getId().equals(id)) - return (ITxStream) n; - return null; - } - - private void buildHierarchyNodes() throws InputFormatException{ - for(IWaveform stream:getAllWaves()){ - String[] hier = stream.getFullName().split("\\."); - IHierNode node = this; - for(String name:hier){ - IHierNode n1 = null; - for (IHierNode n : node.getChildNodes()) { - if (n.getName().equals(name)) { - n1=n; - break; - } - } - if(name == hier[hier.length-1]){ //leaf - if(n1!=null) { - if(n1 instanceof HierNode){ - node.getChildNodes().remove(n1); - stream.getChildNodes().addAll(n1.getChildNodes()); - } else { - throw new InputFormatException(); - } - } - stream.setName(name); - node.getChildNodes().add(stream); - node=stream; - } else { // intermediate - if(n1 != null) { - node=n1; - } else { - HierNode newNode = new HierNode(name); - node.getChildNodes().add(newNode); - node=newNode; - } - } - } - } - } public RelationType getRelationType(String relationName) { if(relationMap.containsKey(relationName)) return relationMap.get(relationName); diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java index 33d6979..dc8e31e 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/Tx.java @@ -14,6 +14,7 @@ import com.minres.scviewer.database.ITxGenerator; import com.minres.scviewer.database.ITxRelation; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; import com.minres.scviewer.database.sqlite.tables.ScvTx; import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute; @@ -22,6 +23,7 @@ import com.minres.scviewer.database.sqlite.tables.ScvTxRelation; public class Tx implements ITx { + private IDatabase database; private TxStream trStream; private TxGenerator trGenerator; private ScvTx scvTx; @@ -29,7 +31,8 @@ public class Tx implements ITx { private EventTime begin, end; private List incoming, outgoing; - public Tx(TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) { + public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) { + this.database=database; this.trStream=trStream; this.trGenerator=trGenerator; this.scvTx=scvTx; @@ -54,10 +57,10 @@ public class Tx implements ITx { public EventTime getBeginTime() { if(begin==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTxEvent.class, - trStream.getDb().getDb(), "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal()); + database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal()); try { for(ScvTxEvent scvEvent:handler.selectObjects()){ - begin= new EventTime(scvEvent.getTime()*trStream.getDb().timeResolution); + begin= new EventTime(scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION")); } } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { @@ -70,10 +73,10 @@ public class Tx implements ITx { public EventTime getEndTime() { if(end==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTxEvent.class, - trStream.getDb().getDb(), "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal()); + database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal()); try { for(ScvTxEvent scvEvent:handler.selectObjects()){ - end = new EventTime(scvEvent.getTime()*trStream.getDb().timeResolution); + end = new EventTime(scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION")); } } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { @@ -86,7 +89,7 @@ public class Tx implements ITx { public List getAttributes() { if(attributes==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( - ScvTxAttribute.class, trStream.getDb().getDb(), "tx="+scvTx.getId()); + ScvTxAttribute.class, database, "tx="+scvTx.getId()); try { attributes = new ArrayList(); for(ScvTxAttribute scvAttribute:handler.selectObjects()){ @@ -104,7 +107,7 @@ public class Tx implements ITx { public Collection getIncomingRelations() { if(incoming==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( - ScvTxRelation.class, trStream.getDb().getDb(), "sink="+scvTx.getId()); + ScvTxRelation.class, database, "sink="+scvTx.getId()); try { incoming = new ArrayList(); for(ScvTxRelation scvRelation:handler.selectObjects()){ @@ -121,7 +124,7 @@ public class Tx implements ITx { public Collection getOutgoingRelations() { if(outgoing==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( - ScvTxRelation.class, trStream.getDb().getDb(), "src="+scvTx.getId()); + ScvTxRelation.class, database, "src="+scvTx.getId()); try { outgoing = new ArrayList(); for(ScvTxRelation scvRelation:handler.selectObjects()){ @@ -136,8 +139,9 @@ public class Tx implements ITx { private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) { long otherId = outgoing?rel.getSink():rel.getSrc(); +/*FIXME: try { - List scvTx=new SQLiteDatabaseSelectHandler(ScvTx.class, trStream.getDb().getDb(), "id="+otherId).selectObjects(); + List scvTx=new SQLiteDatabaseSelectHandler(ScvTx.class, database, "id="+otherId).selectObjects(); assert(scvTx.size()==1); ITxStream stream = trStream.getDb().getStreamById(scvTx.get(0).getStream()); Tx that=(Tx) stream.getTransactionById(otherId); @@ -147,7 +151,7 @@ public class Tx implements ITx { return new TxRelation(trStream.getDb().getRelationType(rel.getName()), that, this); } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { - } + }*/ return null; } diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java index 5c95ecc..2c720b4 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java @@ -13,6 +13,8 @@ import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.ITxGenerator; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; import com.minres.scviewer.database.sqlite.tables.ScvGenerator; import com.minres.scviewer.database.sqlite.tables.ScvStream; @@ -20,9 +22,11 @@ import com.minres.scviewer.database.sqlite.tables.ScvTx; public class TxStream extends HierNode implements ITxStream { + private IDatabase database; + private String fullName; - private SQLiteDb db; + private IWaveformDb db; private ScvStream scvStream; @@ -30,11 +34,17 @@ public class TxStream extends HierNode implements ITxStream { private NavigableSet transactions; - public TxStream(SQLiteDb trSQLiteDb, ScvStream scvStream) { + public TxStream(IDatabase database, IWaveformDb waveformDb, ScvStream scvStream) { super(scvStream.getName()); + this.database=database; fullName=scvStream.getName(); this.scvStream=scvStream; - db=trSQLiteDb; + db=waveformDb; + } + + @Override + public IWaveformDb getDb() { + return db; } @Override @@ -52,16 +62,11 @@ public class TxStream extends HierNode implements ITxStream { return scvStream.getKind(); } - @Override - public SQLiteDb getDb() { - return db; - } - @Override public List getGenerators() { if(generators==null){ SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler( - ScvGenerator.class, db.getDb(), "stream="+scvStream.getId()); + ScvGenerator.class, database, "stream="+scvStream.getId()); generators=new HashMap(); try { for(ScvGenerator scvGenerator:handler.selectObjects()){ @@ -94,12 +99,12 @@ public class TxStream extends HierNode implements ITxStream { protected void checkTransactions() { if(transactions==null){ if(generators==null) getGenerators(); - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTx.class, db.getDb(), + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvTx.class, database, "stream="+scvStream.getId()); transactions=new TreeSet(); try { for(ScvTx scvTx:handler.selectObjects()){ - transactions.add(new Tx(this, generators.get(scvTx.getGenerator()), scvTx)); + transactions.add(new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx)); } } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException | SQLException | IntrospectionException e) { diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/IDatabase.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/IDatabase.java index 872ed45..8d61b73 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/IDatabase.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/IDatabase.java @@ -45,4 +45,7 @@ public interface IDatabase { */ public void close(PreparedStatement preparedStatement, Connection connection); + public void setData(String name, Object value); + + public Object getData(String name); } \ No newline at end of file diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/SQLiteDatabase.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/SQLiteDatabase.java index 5a86ada..b91c848 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/SQLiteDatabase.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/db/SQLiteDatabase.java @@ -6,14 +6,18 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.HashMap; public class SQLiteDatabase implements IDatabase { protected String dbFileName; + protected HashMap props; + public SQLiteDatabase(String dbFileName) { super(); this.dbFileName = dbFileName; + props = new HashMap(); } @Override @@ -50,4 +54,14 @@ public class SQLiteDatabase implements IDatabase { } catch (SQLException e) {} } + @Override + public void setData(String name, Object value){ + props.put(name, value); + } + + @Override + public Object getData(String name){ + return props.get(name); + } + } diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index f67edbe..a7489f7 100644 --- a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -17,33 +17,20 @@ import org.junit.Before; import org.junit.Test; import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.IWaveformDbFactory; +import com.minres.scviewer.database.IWaveformDbLoader; +import com.minres.scviewer.database.WaveformDb; public class DatabaseServicesTest { - private static CountDownLatch dependencyLatch = new CountDownLatch(3);// 1 = number of dependencies required - - private static List services=new LinkedList(); - - public void bind(IWaveformDbFactory factory){ - services.add(factory); - dependencyLatch.countDown(); - // System.out.println("service added"); - } - - public void unbind(IWaveformDbFactory factory){ - services.remove(factory); - } - @Before public void setUp() throws Exception { - // Wait for OSGi dependencies - try { - dependencyLatch.await(10, TimeUnit.SECONDS); - // Dependencies fulfilled - } catch (InterruptedException ex) { - fail("OSGi dependencies unfulfilled"); - } + // Wait for OSGi dependencies + for (int i = 0; i < 10; i++) { + if (WaveformDb.getLoaders().size() == 3) // Dependencies fulfilled + return; + Thread.sleep(1000); + } + fail("OSGi dependencies unfulfilled"); } @After @@ -51,48 +38,36 @@ public class DatabaseServicesTest { } @Test - public void testVCD() throws URISyntaxException { + public void testVCD() throws Exception { File f = new File("inputs/my_db.vcd").getAbsoluteFile(); assertTrue(f.exists()); - IWaveformDb database=null; - for(IWaveformDbFactory factory:services){ - database = factory.createDatabase(f); - if(database!=null) break; - } + IWaveformDb database=new WaveformDb(); + database.load(f); assertNotNull(database); - assertEquals(3, services.size()); assertEquals(14, database.getAllWaves().size()); assertEquals(2, database.getChildNodes().size()); } @Test - public void testTxSQLite() throws URISyntaxException { + public void testTxSQLite() throws Exception { File f = new File("inputs/my_db.txdb").getAbsoluteFile(); assertTrue(f.exists()); - IWaveformDb database=null; - for(IWaveformDbFactory factory:services){ - database = factory.createDatabase(f); - if(database!=null) break; - } + IWaveformDb database=new WaveformDb(); + database.load(f); assertNotNull(database); - assertEquals(3, services.size()); assertEquals(3, database.getAllWaves().size()); - assertEquals(3, database.getChildNodes().size()); + assertEquals(1, database.getChildNodes().size()); } @Test - public void testTxText() throws URISyntaxException { + public void testTxText() throws Exception { File f = new File("inputs/my_db.txlog").getAbsoluteFile(); assertTrue(f.exists()); - IWaveformDb database=null; - for(IWaveformDbFactory factory:services){ - database = factory.createDatabase(f); - if(database!=null) break; - } + IWaveformDb database=new WaveformDb(); + database.load(f); assertNotNull(database); - assertEquals(3, services.size()); assertEquals(3, database.getAllWaves().size()); - assertEquals(3, database.getChildNodes().size()); + assertEquals(1, database.getChildNodes().size()); } diff --git a/com.minres.scviewer.database.text/OSGI-INF/component.xml b/com.minres.scviewer.database.text/OSGI-INF/component.xml index 0dc6bed..2d260e4 100644 --- a/com.minres.scviewer.database.text/OSGI-INF/component.xml +++ b/com.minres.scviewer.database.text/OSGI-INF/component.xml @@ -1,7 +1,7 @@ - - + + - + diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbFactory.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbFactory.groovy deleted file mode 100644 index 2ffa0ee..0000000 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbFactory.groovy +++ /dev/null @@ -1,31 +0,0 @@ -package com.minres.scviewer.database.text - -import java.io.FileInputStream; - -import com.minres.scviewer.database.IWaveformDb -import com.minres.scviewer.database.IWaveformDbFactory; - -class TextDbFactory implements IWaveformDbFactory { - - byte[] x = "scv_tr_stream".bytes - - @Override - public IWaveformDb createDatabase(File file) { - try { - FileInputStream fis = new FileInputStream(file); - byte[] buffer = new byte[x.size()]; - def read = fis.read(buffer, 0, x.size()); - fis.close(); - if(read==x.size()) - for(int i=0; i stream.fullName == name } - } - - public List getAllWaves() { - return new LinkedList(streams); - } - - public List getChildNodes() { - return childs.sort{it.name}; + @Override + public List getAllWaves() { + return new LinkedList(streams); } public Map getGeneratorsById() { @@ -69,14 +61,20 @@ public class TextDb extends HierNode implements IWaveformDb{ return res; } - void clear(){ - streams = [] - maxTime=new EventTime(0, "ns") - } - - void load(File file) throws InputFormatException { - this.name = file.name; + static final byte[] x = "scv_tr_stream".bytes + + @Override + boolean load(IWaveformDb db, File file) throws Exception { + this.db=db + FileInputStream fis = new FileInputStream(file) + byte[] buffer = new byte[x.size()] + def readCnt = fis.read(buffer, 0, x.size()) + fis.close() + if(readCnt==x.size()) + for(int i=0; itransaction.endTime?maxTime:transaction.endTime endTransaction=true @@ -158,38 +156,6 @@ public class TextDb extends HierNode implements IWaveformDb{ } } - addHierarchyNodes() - } - - def addHierarchyNodes(){ - streams.each{ TxStream stream-> - def hier = stream.fullName.split(/\./) - IHierNode node = this - hier.each { name -> - def n1 = node.childNodes.find{it.name == name} - if(name == hier[-1]){ //leaf - if(n1!=null) { - if(n1 instanceof HierNode){ - node.childNodes.remove(n1) - stream.childNodes.addAll(n1.childNodes) - } else { - throw new InputFormatException() - } - } - stream.name=name - node.childNodes< allTransactions; - TxStream(int id, TextDb db, String name, String kind){ + TxStream(IWaveformDb db, int id, String name, String kind){ super(name) this.id=id this.database=db diff --git a/com.minres.scviewer.database.vcd/.classpath b/com.minres.scviewer.database.vcd/.classpath new file mode 100644 index 0000000..098194c --- /dev/null +++ b/com.minres.scviewer.database.vcd/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/com.minres.scviewer.database.vcd/.gitignore b/com.minres.scviewer.database.vcd/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/com.minres.scviewer.database.vcd/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/com.minres.scviewer.database.vcd/.project b/com.minres.scviewer.database.vcd/.project new file mode 100644 index 0000000..2e4e1b2 --- /dev/null +++ b/com.minres.scviewer.database.vcd/.project @@ -0,0 +1,33 @@ + + + com.minres.scviewer.database.vcd + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs b/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f42de36 --- /dev/null +++ b/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/com.minres.scviewer.database.vcd/.settings/org.eclipse.pde.core.prefs b/com.minres.scviewer.database.vcd/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000..f29e940 --- /dev/null +++ b/com.minres.scviewer.database.vcd/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF b/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF new file mode 100644 index 0000000..3fff43f --- /dev/null +++ b/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Vcd +Bundle-SymbolicName: com.minres.scviewer.database.vcd +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: MINRES Technologies GmbH +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", + org.eclipse.equinox.util;bundle-version="1.0.500", + org.eclipse.equinox.ds;bundle-version="1.4.200", + org.eclipse.osgi.services;bundle-version="3.4.0" +Service-Component: OSGI-INF/component.xml +Bundle-ActivationPolicy: lazy diff --git a/com.minres.scviewer.database.vcd/OSGI-INF/component.xml b/com.minres.scviewer.database.vcd/OSGI-INF/component.xml new file mode 100644 index 0000000..a7d284e --- /dev/null +++ b/com.minres.scviewer.database.vcd/OSGI-INF/component.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/com.minres.scviewer.database.vcd/build.properties b/com.minres.scviewer.database.vcd/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/com.minres.scviewer.database.vcd/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java similarity index 100% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDb.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java similarity index 70% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDb.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java index 177280f..5ceecb8 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDb.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java @@ -18,6 +18,7 @@ import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IHierNode; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.IWaveformDbLoader; import com.minres.scviewer.database.InputFormatException; import com.minres.scviewer.database.SignalChange; @@ -25,19 +26,19 @@ import com.minres.scviewer.database.SignalChange; /** * The Class VCDDb. */ -public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder { +public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { private static final EventTime.Unit TIME_RES = EventTime.Unit.PS; + private IWaveformDb db; + /** The module stack. */ private Stack moduleStack; /** The signals. */ private List signals; - private HashMap waveformLookup; - private long maxTime; /** @@ -45,28 +46,29 @@ public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder * * @param netName the net name */ - public VCDDb() { - super("VCDDb"); - signals = new Vector(); - waveformLookup = new HashMap(); + public VCDDbLoader() { } - /* (non-Javadoc) - * @see com.minres.scviewer.database.ITrDb#getStreamByName(java.lang.String) - */ - @Override - public IWaveform getStreamByName(String name) { - return waveformLookup.get(name); - } + private byte[] x = "$date".getBytes(); /* (non-Javadoc) * @see com.minres.scviewer.database.ITrDb#load(java.io.File) */ - @SuppressWarnings("unchecked") @Override - public void load(File inp) throws Exception { + public boolean load(IWaveformDb db, File file) throws Exception { + this.db=db; + FileInputStream fis = new FileInputStream(file); + byte[] buffer = new byte[x.length]; + int read = fis.read(buffer, 0, x.length); + fis.close(); + if (read == x.length) + for (int i = 0; i < x.length; i++) + if (buffer[i] != x[i]) + return false; + + signals = new Vector(); moduleStack= new Stack(); - boolean res = new VCDFileParser(false).load(new FileInputStream(inp), this); + boolean res = new VCDFileParser(false).load(new FileInputStream(file), this); moduleStack=null; if(!res) throw new InputFormatException(); EventTime lastTime=new EventTime(maxTime, TIME_RES); @@ -78,15 +80,7 @@ public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder ((ISignal)signal).getSignalChanges().add(lastChange); } } - buildHierarchyNodes(); - } - - /* (non-Javadoc) - * @see com.minres.scviewer.database.ITrDb#clear() - */ - @Override - public void clear() { - signals.clear(); + return true; } /* (non-Javadoc) @@ -133,10 +127,10 @@ public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder int id = signals.size(); VCDSignal signal; if(width==1){ - signal = i<0 ? new VCDSignal(id, netName) : + signal = i<0 ? new VCDSignal(db, id, netName) : new VCDSignal(signals.get(i), id, netName); } else { - signal = i<0 ? new VCDSignal(id, netName, width) : + signal = i<0 ? new VCDSignal(db, id, netName, width) : new VCDSignal(signals.get(i), id, netName); }; signals.add(signal); @@ -146,6 +140,7 @@ public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder /* (non-Javadoc) * @see com.minres.scviewer.database.vcd.ITraceBuilder#getNetWidth(int) */ + @SuppressWarnings("unchecked") @Override public int getNetWidth(int intValue) { VCDSignal signal = (VCDSignal) signals.get(intValue); @@ -170,43 +165,4 @@ public class VCDDb extends HierNode implements IWaveformDb, IVCDDatabaseBuilder maxTime= Math.max(maxTime, fCurrentTime); } - private void buildHierarchyNodes() throws InputFormatException{ - for(IWaveform stream:getAllWaves()){ - waveformLookup.put(stream.getFullName(), stream); - String[] hier = stream.getFullName().split("\\."); - IHierNode node = this; - for(String name:hier){ - IHierNode n1 = null; - for (IHierNode n : node.getChildNodes()) { - if (n.getName().equals(name)) { - n1=n; - break; - } - } - if(name == hier[hier.length-1]){ //leaf - if(n1!=null) { - if(n1 instanceof HierNode){ - node.getChildNodes().remove(n1); - stream.getChildNodes().addAll(n1.getChildNodes()); - } else { - throw new InputFormatException(); - } - } - stream.setName(name); - node.getChildNodes().add(stream); - node=stream; - } else { // intermediate - if(n1 != null) { - node=n1; - } else { - HierNode newNode = new HierNode(name); - node.getChildNodes().add(newNode); - node=newNode; - } - } - } - } - } - - } diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDFileParser.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java similarity index 100% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDFileParser.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignal.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java similarity index 86% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignal.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java index ab78038..1ba95dc 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignal.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java @@ -1,6 +1,5 @@ package com.minres.scviewer.database.vcd; -import java.util.Collections; import java.util.NavigableSet; import java.util.TreeSet; @@ -8,8 +7,8 @@ import com.minres.scviewer.database.EventTime; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.ISignal; import com.minres.scviewer.database.ISignalChange; -import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.SignalChange; public class VCDSignal extends HierNode implements ISignal { @@ -22,20 +21,21 @@ public class VCDSignal extends HierNode implements ISig private final int width; - private VCDDb db; + private IWaveformDb db; TreeSet values; - public VCDSignal(String name) { - this(0, name, 1); + public VCDSignal(IWaveformDb db, String name) { + this(db, 0, name, 1); } - public VCDSignal(int id, String name) { - this(id,name,1); + public VCDSignal(IWaveformDb db, int id, String name) { + this(db, id,name,1); } - public VCDSignal(int id, String name, int width) { + public VCDSignal(IWaveformDb db, int id, String name, int width) { super(name); + this.db=db; fullName=name; this.id=id; this.width=width; @@ -50,6 +50,7 @@ public class VCDSignal extends HierNode implements ISig assert(other instanceof VCDSignal); this.width=((VCDSignal)other).width; this.values=((VCDSignal)other).values; + this.db=other.getDb(); } @Override @@ -89,6 +90,7 @@ public class VCDSignal extends HierNode implements ISig return values; } + @SuppressWarnings("unchecked") @Override public T getSignalChangeByTime(EventTime time) { return (T) values.floor(new SignalChange(time)); diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java similarity index 100% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java similarity index 100% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java diff --git a/com.minres.scviewer.database/META-INF/MANIFEST.MF b/com.minres.scviewer.database/META-INF/MANIFEST.MF index 1956fc0..4f5e81c 100644 --- a/com.minres.scviewer.database/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.database/META-INF/MANIFEST.MF @@ -5,7 +5,6 @@ Bundle-SymbolicName: com.minres.scviewer.database Bundle-Version: 1.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.7 -Export-Package: com.minres.scviewer.database, - com.minres.scviewer.database.vcd -Service-Component: OSGI-INF/component.xml +Export-Package: com.minres.scviewer.database Bundle-ActivationPolicy: lazy +Service-Component: OSGI-INF/component.xml diff --git a/com.minres.scviewer.database/OSGI-INF/component.xml b/com.minres.scviewer.database/OSGI-INF/component.xml index 99dd8e1..315ead5 100644 --- a/com.minres.scviewer.database/OSGI-INF/component.xml +++ b/com.minres.scviewer.database/OSGI-INF/component.xml @@ -1,7 +1,5 @@ - - - - - + + + diff --git a/com.minres.scviewer.database/build.properties b/com.minres.scviewer.database/build.properties index fc8c47c..37fc20b 100644 --- a/com.minres.scviewer.database/build.properties +++ b/com.minres.scviewer.database/build.properties @@ -1,5 +1,6 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ + OSGI-INF/component.xml,\ OSGI-INF/component.xml source.. = src/ diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/EventTime.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/EventTime.java index 334604f..e06f3bb 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/EventTime.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/EventTime.java @@ -28,7 +28,13 @@ public class EventTime implements Comparable{ } } - static final double[] scales = {1,1000.0,1000000.0,1000000000.0,1000000000000.0}; + static final double[] scales = { + 1, + 1000.0, + 1000000.0, + 1000000000.0, + 1000000000000.0, + 1000000000000000.0}; public static final EventTime ZERO = new EventTime(0L); diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java index 8429c05..7ec484e 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java @@ -1,7 +1,9 @@ package com.minres.scviewer.database; import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class HierNode implements IHierNode { @@ -10,19 +12,29 @@ public class HierNode implements IHierNode { protected ArrayList childs; - public HierNode(String name) { - this.name=name; + protected PropertyChangeSupport pcs; + + public HierNode() { childs = new ArrayList(); + pcs=new PropertyChangeSupport(this); + } + + public HierNode(String name) { + this(); + this.name=name; } @Override public void addPropertyChangeListener(PropertyChangeListener l) { + pcs.addPropertyChangeListener(l); } @Override public void removePropertyChangeListener(PropertyChangeListener l) { + pcs.removePropertyChangeListener(l); } + @Override public String getFullName() { return name; @@ -43,4 +55,9 @@ public class HierNode implements IHierNode { return childs; } + @Override + public int compareTo(IHierNode o) { + return name.compareTo(o.getName()); + } + } diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java index 4204b37..623b451 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java @@ -13,7 +13,7 @@ package com.minres.scviewer.database; import java.beans.PropertyChangeListener; import java.util.List; -public interface IHierNode { +public interface IHierNode extends Comparable{ /** * Attach a non-null PropertyChangeListener to this object. diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java index fa456aa..91aae8d 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java @@ -22,7 +22,7 @@ public interface IWaveformDb extends IHierNode { public List getAllWaves(); - public void load(File inp) throws Exception; + public boolean load(File inp) throws Exception; public void clear(); diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java deleted file mode 100644 index 370b971..0000000 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.minres.scviewer.database; - -import java.io.File; - -public interface IWaveformDbFactory { - - IWaveformDb createDatabase(File file); - -} diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java new file mode 100644 index 0000000..256bb63 --- /dev/null +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbLoader.java @@ -0,0 +1,14 @@ +package com.minres.scviewer.database; + +import java.io.File; +import java.util.List; + +public interface IWaveformDbLoader { + + public boolean load(IWaveformDb db, File inp) throws Exception; + + public EventTime getMaxTime(); + + public List getAllWaves() ; + +} diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java new file mode 100644 index 0000000..c245992 --- /dev/null +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java @@ -0,0 +1,140 @@ +package com.minres.scviewer.database; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class WaveformDb extends HierNode implements IWaveformDb { + + private static List loaders=new LinkedList(); + + private List childNodes; + + private Map waveforms; + + private EventTime maxTime; + + + public void bind(IWaveformDbLoader loader){ + loaders.add(loader); + } + + public void unbind(IWaveformDbLoader loader){ + loaders.remove(loader); + } + + + public static List getLoaders() { + return Collections.unmodifiableList(loaders); + } + + public WaveformDb() { + super(); + waveforms = new HashMap(); + maxTime=EventTime.ZERO; + } + + @Override + public EventTime getMaxTime() { + return maxTime; + } + + @Override + public IWaveform getStreamByName(String name) { + return waveforms.get(name); + } + + @Override + public List getAllWaves() { + return new ArrayList(waveforms.values()); + } + + @Override + public boolean load(File inp) throws Exception { + for(IWaveformDbLoader loader:loaders){ + if(loader.load(this, inp)){ + for(IWaveform w:loader.getAllWaves()) + waveforms.put(w.getFullName(),w); + buildHierarchyNodes() ; + if(name==null) name=getFileBasename(inp.getName()); + pcs.firePropertyChange("WAVEFORMS", null, waveforms); + pcs.firePropertyChange("CHILDS", null, childNodes); + return true; + } + } + return false; + } + + protected static String getFileBasename(String f) { + String ext = ""; + int i = f.lastIndexOf('.'); + if (i > 0 && i < f.length() - 1) { + ext = f.substring(0, i); + } + return ext; + } + + @Override + public void clear() { + waveforms.clear(); + childNodes.clear(); + } + + private void buildHierarchyNodes() throws InputFormatException{ + childNodes= new ArrayList(); + for(IWaveform stream:getAllWaves()){ + updateMaxTime(stream); + String[] hier = stream.getFullName().split("\\."); + IHierNode node = this; + for(String name:hier){ + IHierNode n1 = null; + for (IHierNode n : node.getChildNodes()) { + if (n.getName().equals(name)) { + n1=n; + break; + } + } + if(name == hier[hier.length-1]){ //leaf + if(n1!=null) { + if(n1 instanceof HierNode){ + node.getChildNodes().remove(n1); + stream.getChildNodes().addAll(n1.getChildNodes()); + Collections.sort(stream.getChildNodes()); + } else { + throw new InputFormatException(); + } + } + stream.setName(name); + node.getChildNodes().add(stream); + Collections.sort(node.getChildNodes()); + node=stream; + } else { // intermediate + if(n1 != null) { + node=n1; + } else { + HierNode newNode = new HierNode(name); + node.getChildNodes().add(newNode); + Collections.sort(node.getChildNodes()); + node=newNode; + } + } + } + } + } + + private void updateMaxTime(IWaveform stream) { + EventTime last=null; + if(stream instanceof ITxStream){ + last=((ITxStream)stream).getTransactions().last().getEndTime(); + } else if(stream instanceof ISignal){ + last=((ISignal)stream).getSignalChanges().last().getTime(); + } + if(last.getValue()>maxTime.getValue()) + maxTime=last; + } + +} diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDbFactory.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDbFactory.java deleted file mode 100644 index c9aa307..0000000 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/vcd/VCDDbFactory.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.minres.scviewer.database.vcd; - -import java.io.File; -import java.io.FileInputStream; - -import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.IWaveformDbFactory; - -public class VCDDbFactory implements IWaveformDbFactory { - - private byte[] x = "$date".getBytes(); - - public VCDDbFactory(){ - - } - - @Override - public IWaveformDb createDatabase(File file) { - try { - FileInputStream fis = new FileInputStream(file); - byte[] buffer = new byte[x.length]; - int read = fis.read(buffer, 0, x.length); - fis.close(); - if (read == x.length) - for (int i = 0; i < x.length; i++) - if (buffer[i] != x[i]) - return null; - VCDDb db = new VCDDb(); - db.load(file); - return db; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - -} diff --git a/com.minres.scviewer.ui/META-INF/MANIFEST.MF b/com.minres.scviewer.ui/META-INF/MANIFEST.MF index 3fa1844..2f87e75 100644 --- a/com.minres.scviewer.ui/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.ui/META-INF/MANIFEST.MF @@ -5,7 +5,8 @@ Bundle-SymbolicName: com.minres.scviewer.ui;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.minres.scviewer.ui.TxEditorPlugin Bundle-Vendor: MINRES Technologies GmbH -Require-Bundle: org.eclipse.core.runtime, +Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", + org.eclipse.core.runtime, org.eclipse.core.resources, org.eclipse.jface.text, org.eclipse.ui, @@ -14,9 +15,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.ui.views.properties.tabbed, org.eclipse.swt, org.eclipse.osgi, - com.minres.scviewer.database;bundle-version="1.0.0" + org.eclipse.core.expressions;bundle-version="3.4.600" Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy -Import-Package: org.eclipse.ui.views.contentoutline Bundle-ClassPath: ., swing2swt.jar diff --git a/com.minres.scviewer.ui/SilkCompanion1.txt b/com.minres.scviewer.ui/SilkCompanion1.txt new file mode 100644 index 0000000..ad94df0 --- /dev/null +++ b/com.minres.scviewer.ui/SilkCompanion1.txt @@ -0,0 +1,56 @@ +Silk companion icon set #1 - "More Silk!" +Last updated: 19 November 2007 + +_________________________________________ +Damien Guard +http://www.damieng.com/icons/silkcompanion +_________________________________________ + +This work is licensed under a +Creative Commons Attribution 2.5 License. +[ http://creativecommons.org/licenses/by/2.5/ ] + +The FamFamFam Silk icon set is a very large, +consistent set of well-drawn icons that has +proven to be popular with both applications +and web sites. + +On a number of occasions I have found myself +wanting more icons in the same style. This +companion set represents what I needed but also +what I felt like adding. + +Some are new icons in the same style, some are +alternative sizes/colours of the existing icons +and some are new compositions of the elements. + +Any questions about this companion set please +contact damieng@gmail.com. + + + +The Original Silk readme this work is based upon: + + +Silk icon set 1.3 + +_________________________________________ +Mark James +http://www.famfamfam.com/lab/icons/silk/ +_________________________________________ + +This work is licensed under a +Creative Commons Attribution 2.5 License. +[ http://creativecommons.org/licenses/by/2.5/ ] + +This means you may use it for any purpose, +and make any changes you like. +All I ask is that you include a link back +to this page in your credits. + +Are you using this icon set? Send me an email +(including a link or picture if available) to +mjames@gmail.com + +Any other questions about this icon set please +contact mjames@gmail.com \ No newline at end of file diff --git a/com.minres.scviewer.ui/plugin.xml b/com.minres.scviewer.ui/plugin.xml index 9db4ff9..3b9348e 100644 --- a/com.minres.scviewer.ui/plugin.xml +++ b/com.minres.scviewer.ui/plugin.xml @@ -107,5 +107,104 @@ id="com.minres.scviewer.ui.TxEditorInputFactory"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.minres.scviewer.ui/res/images/next-green-d.png b/com.minres.scviewer.ui/res/images/next-green-d.png new file mode 100644 index 0000000000000000000000000000000000000000..d3509b1dc7eeedf23c59f777ceab9a2dccead3bd GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah4nJ z$Q=Y>#>1H*!9YRw5>H=O_WO*S0;0;#6vE1YLXSLM978nDukGKP#S|#uc3!kz!Rbwq z%Leb65<9&6dHW8wkR3*ABd|v*0Dd@04 zt@G6TyU+8y7x?RA_%D-tT^S+y!ffyHlwTj) z>^NdnbaN`fJc-rO)BIeh2v{M6oEYEfobij);izw}g=v~#gcl4H06fn_ys^iK#VRL9 zH`?d&x+~#Q2QITf>;M2GLcJxLt6NcC6&@d6j3;tB2k~6Eo(1NL0zirX!c{)PY`nW^ zwA8eL+GoT4(`MuwPQs3I69CXzDYxchZe@`IF?N0bW^4A5B}os+sS z3`0F3a3-KOkRc9@>YWt>iaOxgqNEgvM#^xLe8TO?`?eZ7w_d$$L0sXGu%eii*o1l_Q1`#$-G^o_l~zmyux>Qu*&%7OUdpr`|ZJ2m`r zWv?A9r-uCN)qkMixlIKEo-VAF!^HJSfiv~h)bVQ;pbEnOI-fN9{V?d-uDbvL002ov JPDHLkV1h0i>K_0A literal 0 HcmV?d00001 diff --git a/com.minres.scviewer.ui/res/images/previous-green-d.png b/com.minres.scviewer.ui/res/images/previous-green-d.png new file mode 100644 index 0000000000000000000000000000000000000000..38be4768923d1abcf53178200cdff1afb3687d1c GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah4nJ z$Q=Y>#>1H*!9YRw5>H=O_WO*S0-{3O|AqMgg%LQ~;0yl2$TT;=g@Un=3``~)F4I8!y_9sldu36Edu*lkYx4u~Z{icmq zGSkX_7;a{+?~R(Nw>&^#9-rCi?=Lr4oDySrH8m!gwfE~ugD-1iuL(-bYhawvYju3@ ztnM9wYN`qr3fA#=;?)%F8xti?J*dh|pISa^^MQvm-LLIl%O`A?sUEOCOd@_qf5Re) zIx&t@ERy#3pPpf~tFvHiS32<}=k;5&<*oke%Q@Q=51jpW`s$DGEC(;__+Iz@tCIhM oz()5eN@nuk%+^$%us>>^_91T7q-B>Rv^8ugJA7TpsuL&iQ@Za{>N(S&WCs$s`kB$_Nll&tid# zDdYe7&9NvYY-wllrnQDOeP#B5e*R4fFM@K zL+id(ms^SqkMvtKg_wwK#)D85&1EEmUal5~)_mJ-JyO`?=><%5z$*QnK&Wb10Tq`3 zsSJWEqxTwgp|GF-d>2{o)0ZDd>DxE3Ijr@FSZ_ceZdgU7 ziVEK>9!t)=q?E&Kq5$@0D^Tv}`*_U`c%z2Yib~Du=~im?=|SFmye?ECG;~l=#;7_@ zL)P[] serviceReferences = context.getServiceReferences(IWaveformDbFactory.class.getName(), null); - if(serviceReferences!=null){ - for(ServiceReference serviceReference:serviceReferences){ - database = ((IWaveformDbFactory) context.getService(serviceReference)).createDatabase(file); - if(database!=null){ - if(txDisplay !=null) database.addPropertyChangeListener(txDisplay); - return; - } - } + if(input instanceof IFileEditorInput){ + if(!(input instanceof TxEditorInput)) + super.setInput(new TxEditorInput(((IFileEditorInput)input).getFile())); + IPath location = ((IFileEditorInput) input).getFile().getLocation(); + if (location != null) loadDatabases(location.toFile()); + } else if(input instanceof FileStoreEditorInput){ + File file=new File(((FileStoreEditorInput) input).getURI().getPath()); + loadDatabases(file); } } catch (Exception e) { + handleLoadException(e); } - MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), - "Error loading database", "Could not find an usable and applicable database loader implementation"); - database=null; -// if(TxEditorPlugin.getDefault().getTransactionDbFactory()!=null){ -// database = TxEditorPlugin.getDefault().getTransactionDbFactory().createDatabase(); -// if(txDisplay !=null) database.addPropertyChangeListener(txDisplay); -// } else { -// MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), -// "Error loading database", "Could not find database loader implementation"); -// database=null; -// } + if(database!=null) setPartName(database.getName()); } + protected void loadDatabases(File file) throws Exception { + database=new WaveformDb(); + if(txDisplay !=null) database.addPropertyChangeListener(txDisplay); + if(database.load(file)){ + String ext = getFileExtension(file.getName()); + if("vcd".equals(ext.toLowerCase())){ + File txFile = new File(renameFileExtension(file.getCanonicalPath(), "txdb")); + if(txFile.exists() && database.load(txFile)) return; + txFile = new File(renameFileExtension(file.getCanonicalPath(), "txlog")); + if(txFile.exists()) database.load(txFile); + } else if("txdb".equals(ext.toLowerCase()) || "txlog".equals(ext.toLowerCase())){ + File txFile = new File(renameFileExtension(file.getCanonicalPath(), "vcd")); + if(txFile.exists()) database.load(txFile); + } + } else { + MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), + "Error loading database", "Could not find an usable and applicable database loader implementation"); + database=null; + } + } + + protected static String renameFileExtension(String source, String newExt) { + String target; + String currentExt = getFileExtension(source); + if (currentExt.equals("")){ + target=source+"."+newExt; + } else { + target=source.replaceFirst(Pattern.quote("."+currentExt)+"$", Matcher.quoteReplacement("."+newExt)); + } + return target; + } + + protected static String getFileExtension(String f) { + String ext = ""; + int i = f.lastIndexOf('.'); + if (i > 0 && i < f.length() - 1) { + ext = f.substring(i + 1); + } + return ext; + } + private void handleLoadException(Exception e) { MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), "Error loading database", e.getMessage()); @@ -249,4 +244,8 @@ public class TxEditorPart extends EditorPart implements ITabbedPropertySheetPage return getSite().getId(); } + public void moveSelection(GotoDirection next) { + txDisplay.moveSelection( next); + } + } diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPlugin.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPlugin.java index a62abef..22a5bb8 100644 --- a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPlugin.java +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/TxEditorPlugin.java @@ -24,8 +24,6 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipse.wb.swt.SWTResourceManager; import org.osgi.framework.BundleContext; -import com.minres.scviewer.database.IWaveformDbFactory; - /** * The activator class controls the plug-in life cycle */ diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoDirection.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoDirection.java new file mode 100644 index 0000000..eaf250d --- /dev/null +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoDirection.java @@ -0,0 +1,3 @@ +package com.minres.scviewer.ui.handler; + +public enum GotoDirection {PREV, NEXT} \ No newline at end of file diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoNext.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoNext.java new file mode 100644 index 0000000..a86900a --- /dev/null +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoNext.java @@ -0,0 +1,23 @@ +package com.minres.scviewer.ui.handler; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.handlers.HandlerUtil; + +import com.minres.scviewer.ui.TxEditorPart; + +public class GotoNext extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + IEditorPart editor = HandlerUtil.getActiveEditor(event); + if(editor instanceof TxEditorPart){ + ((TxEditorPart)editor).moveSelection(GotoDirection.NEXT); + } + return null; + } + + +} diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoPrev.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoPrev.java new file mode 100644 index 0000000..d5c74cd --- /dev/null +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/handler/GotoPrev.java @@ -0,0 +1,22 @@ +package com.minres.scviewer.ui.handler; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.handlers.HandlerUtil; + +import com.minres.scviewer.ui.TxEditorPart; + +public class GotoPrev extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + IEditorPart editor = HandlerUtil.getActiveEditor(event); + if(editor instanceof TxEditorPart){ + ((TxEditorPart)editor).moveSelection(GotoDirection.PREV); + } + return null; + } + +} diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/Track.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/Track.java index 3f806d4..4326684 100644 --- a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/Track.java +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/Track.java @@ -1,7 +1,6 @@ package com.minres.scviewer.ui.swt; import java.util.HashMap; -import java.util.List; import java.util.NavigableSet; import java.util.Vector; diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/TxDisplay.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/TxDisplay.java index 9aa017b..c2d018f 100644 --- a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/TxDisplay.java +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/swt/TxDisplay.java @@ -56,6 +56,7 @@ import com.minres.scviewer.database.ISignalChange; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.ui.handler.GotoDirection; public class TxDisplay implements PropertyChangeListener, ISelectionProvider, MouseListener{ @@ -63,7 +64,7 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider, Mo private static final String NAMEWIDGET = "NAMEWIDGET"; private static final String WAVEFORM = "WAVEFORM"; private ListenerList listeners = new ListenerList(); - private ITxStream currentStreamSelection; + private IWaveform currentStreamSelection; private ITx currentSelection; private ScrolledComposite valueListScrolled; private ScrolledComposite nameListScrolled; @@ -416,4 +417,16 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider, Mo return res; } + public void moveSelection(GotoDirection direction) { + if(currentStreamSelection instanceof ITxStream){ + ITx transaction=null; + if(direction==GotoDirection.NEXT) + transaction = ((ITxStream)currentStreamSelection).getTransactions().higher(currentSelection); + else if(direction==GotoDirection.PREV) + transaction = ((ITxStream)currentStreamSelection).getTransactions().lower(currentSelection); + if(transaction!=null) + setSelection(new StructuredSelection(transaction)); + } + } + } diff --git a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java index d2364e3..f12acfd 100644 --- a/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java +++ b/com.minres.scviewer.ui/src/com/minres/scviewer/ui/views/sections/RelatedProperty.java @@ -12,7 +12,6 @@ package com.minres.scviewer.ui.views.sections; import java.util.Collection; import java.util.HashMap; -import java.util.Set; import java.util.TreeMap; import org.eclipse.core.runtime.Assert; @@ -49,9 +48,8 @@ import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; -import com.minres.scviewer.database.ITxRelation; import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.RelationType; +import com.minres.scviewer.database.ITxRelation; public class RelatedProperty extends AbstractPropertySection implements ISelectionProvider, ISelectionChangedListener {