Initial version
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
package com.itjw.txviewer.database.text;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.Constants;
|
||||
import java.util.Dictionary
|
||||
import java.util.Hashtable
|
||||
import com.itjw.txviewer.database.ITrDb;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
|
||||
private static BundleContext context;
|
||||
|
||||
static BundleContext getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
|
||||
*/
|
||||
public void start(BundleContext bundleContext) throws Exception {
|
||||
Activator.context = bundleContext;
|
||||
Dictionary<String, ?> dict = new Hashtable<String, ?>();
|
||||
dict.putAt(Constants.SERVICE_RANKING, 1);
|
||||
context.registerService(ITrDb.class, new TrTextDb(), dict);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
|
||||
*/
|
||||
public void stop(BundleContext bundleContext) throws Exception {
|
||||
Activator.context = null;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
|
||||
import com.itjw.txviewer.database.ITrAttrType;
|
||||
|
||||
class TrAttrType implements ITrAttrType {
|
||||
String name
|
||||
String type
|
||||
|
||||
static TrAttrType getAttrType(String name, String type){
|
||||
TrAttrTypeFactory.instance.getAttrType(name, type)
|
||||
}
|
||||
|
||||
TrAttrType(String name, String type){
|
||||
this.name=name
|
||||
this.type=type
|
||||
}
|
||||
}
|
@@ -0,0 +1,26 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
|
||||
import com.itjw.txviewer.database.ITrAttrType
|
||||
import com.itjw.txviewer.database.ITrAttribute
|
||||
|
||||
class TrAttrTypeFactory {
|
||||
private static final instance = new TrAttrTypeFactory()
|
||||
|
||||
def attributes = [:]
|
||||
|
||||
private TrAttrTypeFactory() {
|
||||
TrAttrTypeFactory.metaClass.constructor = {-> instance }
|
||||
}
|
||||
|
||||
ITrAttrType getAttrType(String name, String type){
|
||||
def key = name+":"+type
|
||||
ITrAttrType res
|
||||
if(attributes.containsKey(key)){
|
||||
res=attributes[key]
|
||||
} else {
|
||||
res=new TrAttrType(name, type)
|
||||
attributes[key]=res
|
||||
}
|
||||
return res
|
||||
}
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
|
||||
import com.itjw.txviewer.database.ITrAttribute
|
||||
|
||||
class TrAttribute implements ITrAttribute{
|
||||
|
||||
TrAttrType attributeType
|
||||
def value
|
||||
|
||||
TrAttribute(String name, String type, value){
|
||||
attributeType = TrAttrTypeFactory.instance.getAttrType(name, type)
|
||||
switch(type){
|
||||
case "STRING":
|
||||
case "ENUMERATION":
|
||||
this.value=value[1..-2]
|
||||
break;
|
||||
default:
|
||||
this.value=value
|
||||
}
|
||||
}
|
||||
|
||||
TrAttribute(TrAttrType other){
|
||||
attributeType=other
|
||||
}
|
||||
|
||||
TrAttribute(TrAttrType other, value){
|
||||
this(other.name, other.type, value)
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return attributeType.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return attributeType.getType();
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.itjw.txviewer.database.ITrAttrType
|
||||
import com.itjw.txviewer.database.ITrAttribute;
|
||||
import com.itjw.txviewer.database.ITrGenerator;
|
||||
import com.itjw.txviewer.database.ITrStream;
|
||||
import com.itjw.txviewer.database.ITransaction;
|
||||
|
||||
class TrGenerator implements ITrGenerator{
|
||||
Long id
|
||||
TrStream stream
|
||||
String name
|
||||
Boolean active = false
|
||||
ArrayList<ITransaction> transactions=[]
|
||||
|
||||
ArrayList<ITrAttrType> begin_attrs = []
|
||||
int begin_attrs_idx = 0
|
||||
ArrayList<ITrAttrType> end_attrs= []
|
||||
int end_attrs_idx = 0
|
||||
|
||||
TrGenerator(int id, TrStream stream, name){
|
||||
this.id=id
|
||||
this.stream=stream
|
||||
this.name=name
|
||||
}
|
||||
|
||||
ITrStream getStream(){
|
||||
return stream;
|
||||
}
|
||||
|
||||
List<ITransaction> getTransactions(){
|
||||
return transactions
|
||||
}
|
||||
|
||||
Boolean isActive() {return active};
|
||||
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
package com.itjw.txviewer.database.text;
|
||||
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.itjw.txviewer.database.ITrHierNode;
|
||||
|
||||
class TrHierNode implements ITrHierNode {
|
||||
|
||||
String name
|
||||
def childs = []
|
||||
|
||||
public TrHierNode(){
|
||||
}
|
||||
|
||||
public TrHierNode(String name){
|
||||
this.name=name
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITrHierNode> getChildNodes() {
|
||||
return childs.sort{it.name}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
// TODO Auto-generated method stub
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener l) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener l) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.itjw.txviewer.database.ITrDb
|
||||
import com.itjw.txviewer.database.ITrGenerator
|
||||
import com.itjw.txviewer.database.ITrHierNode
|
||||
import com.itjw.txviewer.database.ITrStream
|
||||
import com.itjw.txviewer.database.ITransaction
|
||||
|
||||
class TrStream extends TrHierNode implements ITrStream {
|
||||
Long id;
|
||||
TrTextDb database
|
||||
String name;
|
||||
String fullName;
|
||||
String kind;
|
||||
def generators = [];
|
||||
def childs = []
|
||||
private allTransactions;
|
||||
|
||||
public TrHierNode(String name){
|
||||
this.name=name
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITrHierNode> getChildNodes() {
|
||||
return childs.sort{it.name};
|
||||
}
|
||||
|
||||
|
||||
TrStream(int id, TrTextDb db, String name, String kind){
|
||||
this.id=id
|
||||
this.database=db
|
||||
this.name=name
|
||||
this.fullName=name
|
||||
this.kind=kind
|
||||
}
|
||||
|
||||
List<ITrGenerator> getGenerators(){
|
||||
return generators as List<ITrGenerator>
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITrDb getDb() {
|
||||
return database;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxConcurrrentTx() {
|
||||
def rowendtime = [0]
|
||||
getTransactions().each{Transaction tx ->
|
||||
def rowIdx = 0
|
||||
for(rowIdx=0; rowendtime.size()<rowIdx || rowendtime[rowIdx]>tx.beginTime.value; rowIdx++);
|
||||
if(rowendtime.size<=rowIdx){
|
||||
rowendtime<<tx.endTime?.value?:tx.beginTime.value+1
|
||||
} else {
|
||||
rowendtime[rowIdx]=tx.endTime?.value?:tx.beginTime.value+1
|
||||
}
|
||||
}
|
||||
return rowendtime.size()
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ITransaction> getTransactions() {
|
||||
if(!allTransactions)
|
||||
allTransactions=generators.transactions.flatten().sort{it.beginTime.value}
|
||||
return allTransactions
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,201 @@
|
||||
package com.itjw.txviewer.database.text;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.itjw.txviewer.database.ITrDb;
|
||||
import com.itjw.txviewer.database.ITrGenerator;
|
||||
import com.itjw.txviewer.database.ITrHierNode;
|
||||
import com.itjw.txviewer.database.ITrStream;
|
||||
import com.itjw.txviewer.database.InputFormatException;
|
||||
import com.itjw.txviewer.database.EventTime
|
||||
|
||||
public class TrTextDb extends TrHierNode implements ITrDb{
|
||||
|
||||
private EventTime maxTime;
|
||||
def streams = []
|
||||
def childs = []
|
||||
|
||||
public String getFullName() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EventTime getMaxTime() {
|
||||
return maxTime;
|
||||
}
|
||||
|
||||
public List<ITrStream> getAllStreams() {
|
||||
return new LinkedList<ITrStream>(streams);
|
||||
}
|
||||
|
||||
public List<ITrHierNode> getChildNodes() {
|
||||
return childs.sort{it.name};
|
||||
}
|
||||
|
||||
public Map<Long, ITrGenerator> getGeneratorsById() {
|
||||
TreeMap<Long, ITrGenerator> res = new TreeMap<Long, ITrGenerator>();
|
||||
streams.each{TrStream stream -> stream.generators.each{res.put(it.id, id)} }
|
||||
return res;
|
||||
}
|
||||
|
||||
void clear(){
|
||||
streams = []
|
||||
maxTime=new EventTime(0, "ns")
|
||||
}
|
||||
|
||||
void load(InputStream inp) throws InputFormatException {
|
||||
parseInput(inp)
|
||||
}
|
||||
|
||||
void parseFromTextFile(filename){
|
||||
def file = new File(filename);
|
||||
this.databaseName = filname;
|
||||
parseInput(file)
|
||||
}
|
||||
|
||||
private def parseInput(input){
|
||||
def streamsById = [:]
|
||||
def generatorsById = [:]
|
||||
def transactionsById = [:]
|
||||
TrGenerator generator
|
||||
Transaction transaction
|
||||
boolean endTransaction=false
|
||||
def matcher
|
||||
input.eachLine { line ->
|
||||
def tokens = line.split(/\s+/)
|
||||
switch(tokens[0]){
|
||||
case "scv_tr_stream":
|
||||
case "scv_tr_generator":
|
||||
case "begin_attribute":
|
||||
case "end_attribute":
|
||||
if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) {
|
||||
def id = Integer.parseInt(matcher[0][1])
|
||||
def stream = new TrStream(id, this, matcher[0][2], matcher[0][3])
|
||||
streams<<stream
|
||||
streamsById[id]=stream
|
||||
} else if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) {
|
||||
def id = Integer.parseInt(matcher[0][1])
|
||||
TrStream stream=streamsById[Integer.parseInt(matcher[0][3])]
|
||||
generator=new TrGenerator(id, stream, matcher[0][2])
|
||||
stream.generators<<generator
|
||||
generatorsById[id]=generator
|
||||
} else if ((matcher = line =~ /^begin_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) {
|
||||
generator.begin_attrs << TrAttrType.getAttrType(matcher[0][2], matcher[0][3])
|
||||
} else if ((matcher = line =~ /^end_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) {
|
||||
generator.end_attrs << TrAttrType.getAttrType(matcher[0][2], matcher[0][3])
|
||||
}
|
||||
break;
|
||||
case ")":
|
||||
generator=null
|
||||
break
|
||||
case "tx_begin"://matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
|
||||
def id = Integer.parseInt(tokens[1])
|
||||
TrGenerator gen=generatorsById[Integer.parseInt(tokens[2])]
|
||||
transaction = new Transaction(id, gen,new EventTime(Integer.parseInt(tokens[3]), tokens[4]))
|
||||
gen.transactions << transaction
|
||||
transactionsById[id]= transaction
|
||||
gen.begin_attrs_idx=0;
|
||||
maxTime = maxTime>transaction.beginTime?maxTime:transaction.beginTime
|
||||
endTransaction=false
|
||||
break
|
||||
case "tx_end"://matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
|
||||
def id = Integer.parseInt(tokens[1])
|
||||
transaction = transactionsById[id]
|
||||
assert Integer.parseInt(tokens[2])==transaction.generator.id
|
||||
transaction.endTime = new EventTime(Integer.parseInt(tokens[3]), tokens[4])
|
||||
transaction.generator.end_attrs_idx=0;
|
||||
maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime
|
||||
endTransaction=true
|
||||
break
|
||||
case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/
|
||||
def id = Integer.parseInt(tokens[1])
|
||||
transactionsById[id].attributes.add(new TrAttribute(tokens[2][1..-2], tokens[3], tokens[5..-1].join(' ')))
|
||||
break
|
||||
case "a"://matcher = line =~ /^a\s+(.+)$/
|
||||
if(endTransaction){
|
||||
transaction.end_attrs << new TrAttribute(transaction.generator.end_attrs[0], tokens[1])
|
||||
} else {
|
||||
transaction.begin_attrs << new TrAttribute(transaction.generator.begin_attrs[0], tokens[1])
|
||||
}
|
||||
break
|
||||
case "tx_relation"://matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/
|
||||
Transaction tr1= transactionsById[Integer.parseInt(tokens[2])]
|
||||
Transaction tr2= transactionsById[Integer.parseInt(tokens[3])]
|
||||
switch(tokens[1][1..-2]){
|
||||
case "CHILD":
|
||||
tr1.child<<tr2
|
||||
tr2.parent<<tr1
|
||||
break
|
||||
case "PARENT":
|
||||
tr2.child<<tr1
|
||||
tr1.parent<<tr2
|
||||
break
|
||||
case "PREDECESSOR":
|
||||
tr2.succ<<tr1
|
||||
tr1.pred<<tr2
|
||||
break
|
||||
case "SUCCESSOR":
|
||||
tr1.succ<<tr2
|
||||
tr2.pred<<tr1
|
||||
break
|
||||
default:
|
||||
println "Relationship '${tokens[1]}' not yet implemented"
|
||||
}
|
||||
break
|
||||
default:
|
||||
println "Don't know what to do with: '$line'"
|
||||
|
||||
}
|
||||
}
|
||||
linkTransactions()
|
||||
addHierarchyNodes()
|
||||
}
|
||||
|
||||
def linkTransactions(){
|
||||
streams.generators?.flatten().each {TrGenerator gen ->
|
||||
def sortedTx = gen.transactions.sort{it.beginTime}
|
||||
if(sortedTx.size()>1)
|
||||
for(int i=1;i<sortedTx.size(); i++){
|
||||
sortedTx[i].prev= sortedTx[i-1]
|
||||
sortedTx[i-1].next = sortedTx[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def addHierarchyNodes(){
|
||||
streams.each{ TrStream stream->
|
||||
def hier = stream.fullName.split(/\./)
|
||||
ITrHierNode node = this
|
||||
hier.each { name ->
|
||||
def n1 = node.childNodes.find{it.name == name}
|
||||
if(name == hier[-1]){ //leaf
|
||||
if(n1!=null) {
|
||||
if(n1 instanceof TrHierNode){
|
||||
node.childNodes.remove(n1)
|
||||
stream.childNodes.addAll(n1.childNodes)
|
||||
} else {
|
||||
throw new InputFormatException()
|
||||
}
|
||||
}
|
||||
stream.name=name
|
||||
node.childNodes<<stream
|
||||
node=stream
|
||||
} else { // intermediate
|
||||
if(n1 != null) {
|
||||
node=n1
|
||||
} else {
|
||||
TrHierNode newNode = new TrHierNode(name)
|
||||
node.childNodes<<newNode
|
||||
node=newNode
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,93 @@
|
||||
package com.itjw.txviewer.database.text
|
||||
import java.util.Set
|
||||
import com.itjw.txviewer.database.*
|
||||
import org.eclipse.ui.views.properties.IPropertyDescriptor
|
||||
import org.eclipse.ui.views.properties.IPropertySource
|
||||
|
||||
class Transaction implements IPropertySource, ITransaction {
|
||||
Long id
|
||||
TrGenerator generator
|
||||
EventTime beginTime
|
||||
EventTime endTime
|
||||
ArrayList<ITrAttribute> begin_attrs = new ArrayList<ITrAttribute>()
|
||||
ArrayList<ITrAttribute> end_attrs = new ArrayList<ITrAttribute>()
|
||||
ArrayList<ITrAttribute> attributes = new ArrayList<ITrAttribute>()
|
||||
Transaction prev, next
|
||||
def pred =[]
|
||||
def succ =[]
|
||||
def parent =[]
|
||||
def child =[]
|
||||
|
||||
Transaction(int id, TrGenerator generator, EventTime begin){
|
||||
this.id=id
|
||||
this.generator=generator
|
||||
this.beginTime=begin
|
||||
}
|
||||
|
||||
@Override
|
||||
List<ITrAttribute> getBeginAttrs() {
|
||||
return begin_attrs
|
||||
}
|
||||
|
||||
@Override
|
||||
List<ITrAttribute> getEndAttrs() {
|
||||
return end_attrs
|
||||
}
|
||||
|
||||
List<ITrAttribute> getAttributes(){
|
||||
return attributes
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<ITransaction> getNextInRelationship(RelationType rel) {
|
||||
switch(rel){
|
||||
case RelationType.PREDECESSOR:
|
||||
return pred
|
||||
break
|
||||
case RelationType.SUCCESSOR:
|
||||
return succ
|
||||
break
|
||||
case RelationType.PREVIOUS:
|
||||
return [prev]
|
||||
break
|
||||
case RelationType.NEXT:
|
||||
return[next]
|
||||
break
|
||||
case RelationType.PARENT:
|
||||
return parent
|
||||
break
|
||||
case RelationType.CHILD:
|
||||
return child
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getEditableValue() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPropertyDescriptor[] getPropertyDescriptors() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getPropertyValue(Object id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPropertySet(Object id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetPropertyValue(Object id) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPropertyValue(Object id, Object value) {
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user