/******************************************************************************* * 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.beans.IntrospectionException; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; 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.StringTokenizer; 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.IWaveformEvent; import com.minres.scviewer.database.RelationType; public class TxStream extends HierNode implements ITxStream { private StringDBWrapper levelDb; private String fullName; private String kind; private IWaveformDb db; private long id; private TreeMap generators; private TreeMap transactions; private Integer maxConcurrency; private TreeMap> events; private List usedRelationsList; public TxStream(StringDBWrapper 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 getGenerators() { if(generators==null){ generators=new TreeMap(); SeekingIterator it = levelDb.iterator(); it.seek("sg~"+String.format("%016x", id)); while(it.hasNext()) { Entry val = it.next(); if(!val.getKey().startsWith("sg~")) break; JSONObject jVal = new JSONObject(val.getValue()); generators.put(jVal.getLong("id"), new TxGenerator(this, jVal)); } } return new ArrayList(generators.values()); } @Override public int getMaxConcurrency() { if(maxConcurrency==null){ maxConcurrency=1; } return maxConcurrency; } @Override public NavigableMap> getEvents(){ if(events==null){ events=new TreeMap>(); for(Entry entry:getTransactions().entrySet()){ putEvent(new TxEvent(TxEvent.Type.BEGIN, entry.getValue())); putEvent(new TxEvent(TxEvent.Type.END, entry.getValue())); } } return events; } private void putEvent(TxEvent ev){ Long time = ev.getTime(); if(!events.containsKey(time)){ Vector vector=new Vector(); vector.add(ev); events.put(time, vector); } else { events.get(time).add(ev); } } protected Map getTransactions() { if(transactions==null){ if(generators==null) getGenerators(); transactions = new TreeMap(); SeekingIterator it = levelDb.iterator(); it.seek("sgx~"+String.format("%016x", id)); while(it.hasNext()) { Entry val = it.next(); if(!val.getKey().startsWith("sgx~")) break; String[] token = val.getKey().split("~"); long gid = Long.parseLong(token[2], 16); // gen id long id = Long.parseLong(token[3], 16); // tx id transactions.put(id, new Tx(levelDb, this, generators.get(gid), id)); } } return transactions; } @Override public Collection getWaveformEventsAtTime(Long time) { return getEvents().get(time); } public void setRelationTypeList(List 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()); } }