2015-01-21 21:58:35 +01:00
|
|
|
/*******************************************************************************
|
2015-10-22 00:25:12 +02:00
|
|
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
2015-01-21 21:58:35 +01:00
|
|
|
* 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
|
|
|
|
*******************************************************************************/
|
2015-10-22 00:02:58 +02:00
|
|
|
package com.minres.scviewer.database.internal;
|
2015-01-10 00:23:46 +01:00
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.ArrayList;
|
2015-10-22 22:12:18 +02:00
|
|
|
import java.util.Collection;
|
2015-01-10 00:23:46 +01:00
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.HashMap;
|
2015-10-22 22:12:18 +02:00
|
|
|
import java.util.Iterator;
|
2015-01-10 00:23:46 +01:00
|
|
|
import java.util.LinkedList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
|
2015-10-22 00:02:58 +02:00
|
|
|
import com.minres.scviewer.database.HierNode;
|
|
|
|
import com.minres.scviewer.database.IHierNode;
|
|
|
|
import com.minres.scviewer.database.IWaveform;
|
|
|
|
import com.minres.scviewer.database.IWaveformDb;
|
|
|
|
import com.minres.scviewer.database.IWaveformDbLoader;
|
|
|
|
import com.minres.scviewer.database.InputFormatException;
|
2015-11-15 22:15:37 +01:00
|
|
|
import com.minres.scviewer.database.RelationType;
|
2015-10-22 00:02:58 +02:00
|
|
|
|
2015-01-10 00:23:46 +01:00
|
|
|
public class WaveformDb extends HierNode implements IWaveformDb {
|
|
|
|
|
|
|
|
private static List<IWaveformDbLoader> loaders=new LinkedList<IWaveformDbLoader>();
|
|
|
|
|
2015-10-27 23:39:33 +01:00
|
|
|
private boolean loaded;
|
|
|
|
|
2015-01-10 00:23:46 +01:00
|
|
|
private List<IHierNode> childNodes;
|
|
|
|
|
2015-11-15 22:15:37 +01:00
|
|
|
private List<RelationType> relationTypes;
|
|
|
|
|
2018-11-05 18:21:54 +01:00
|
|
|
private Map<String, IWaveform> waveforms;
|
2015-01-10 00:23:46 +01:00
|
|
|
|
2015-01-20 18:50:15 +01:00
|
|
|
private Long maxTime;
|
2015-01-10 00:23:46 +01:00
|
|
|
|
|
|
|
|
2015-10-22 00:02:58 +02:00
|
|
|
public synchronized void bind(IWaveformDbLoader loader){
|
2015-01-10 00:23:46 +01:00
|
|
|
loaders.add(loader);
|
|
|
|
}
|
|
|
|
|
2015-10-22 00:02:58 +02:00
|
|
|
public synchronized void unbind(IWaveformDbLoader loader){
|
2015-01-10 00:23:46 +01:00
|
|
|
loaders.remove(loader);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static List<IWaveformDbLoader> getLoaders() {
|
|
|
|
return Collections.unmodifiableList(loaders);
|
|
|
|
}
|
|
|
|
|
|
|
|
public WaveformDb() {
|
|
|
|
super();
|
2018-11-05 18:21:54 +01:00
|
|
|
waveforms = new HashMap<String, IWaveform>();
|
2015-11-15 22:15:37 +01:00
|
|
|
relationTypes=new ArrayList<>();
|
2015-01-20 18:50:15 +01:00
|
|
|
maxTime=0L;
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2015-01-20 18:50:15 +01:00
|
|
|
public Long getMaxTime() {
|
2015-01-10 00:23:46 +01:00
|
|
|
return maxTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-11-05 18:21:54 +01:00
|
|
|
public IWaveform getStreamByName(String name) {
|
2015-01-10 00:23:46 +01:00
|
|
|
return waveforms.get(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-11-05 18:21:54 +01:00
|
|
|
public List<IWaveform> getAllWaves() {
|
|
|
|
return new ArrayList<IWaveform>(waveforms.values());
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-11-06 08:24:26 +01:00
|
|
|
public boolean load(File inp){
|
2015-01-10 00:23:46 +01:00
|
|
|
for(IWaveformDbLoader loader:loaders){
|
2018-11-06 08:24:26 +01:00
|
|
|
try {
|
|
|
|
if(loader.load(this, inp)){
|
|
|
|
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("WAVEFORMS", null, waveforms);
|
|
|
|
pcs.firePropertyChange("CHILDS", null, childNodes);
|
|
|
|
loaded = true;
|
|
|
|
return true;
|
2015-01-20 18:50:15 +01:00
|
|
|
}
|
2018-11-06 08:24:26 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
return false;
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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();
|
2015-10-27 23:39:33 +01:00
|
|
|
loaded=false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isLoaded() {
|
|
|
|
return loaded;
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private void buildHierarchyNodes() throws InputFormatException{
|
|
|
|
childNodes= new ArrayList<IHierNode>();
|
2018-11-05 18:21:54 +01:00
|
|
|
for(IWaveform stream:getAllWaves()){
|
|
|
|
//updateMaxTime(stream);
|
2015-10-22 00:02:58 +02:00
|
|
|
String[] hier = stream.getName().split("\\.");
|
2015-01-10 00:23:46 +01:00
|
|
|
IHierNode node = this;
|
2015-10-22 00:02:58 +02:00
|
|
|
List<String> path=new LinkedList<String>();
|
|
|
|
path.add(name);
|
2015-01-10 00:23:46 +01:00
|
|
|
for(String name:hier){
|
|
|
|
IHierNode n1 = null;
|
2015-10-22 00:02:58 +02:00
|
|
|
for (IHierNode n : node.getChildNodes()) {
|
|
|
|
if (n.getName().equals(name)) {
|
|
|
|
n1=n;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2015-01-10 00:23:46 +01:00
|
|
|
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);
|
2015-10-22 22:12:18 +02:00
|
|
|
stream.setParentName(join(path, "."));
|
2015-01-10 00:23:46 +01:00
|
|
|
node.getChildNodes().add(stream);
|
|
|
|
Collections.sort(node.getChildNodes());
|
|
|
|
node=stream;
|
|
|
|
} else { // intermediate
|
|
|
|
if(n1 != null) {
|
|
|
|
node=n1;
|
|
|
|
} else {
|
2015-10-22 22:12:18 +02:00
|
|
|
HierNode newNode = new HierNode(name, join(path, "."));
|
2015-01-10 00:23:46 +01:00
|
|
|
node.getChildNodes().add(newNode);
|
|
|
|
Collections.sort(node.getChildNodes());
|
|
|
|
node=newNode;
|
|
|
|
}
|
|
|
|
}
|
2015-10-22 00:02:58 +02:00
|
|
|
path.add(name);
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-22 22:12:18 +02:00
|
|
|
private static String join(Collection<?> col, String delim) {
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
Iterator<?> iter = col.iterator();
|
|
|
|
if (iter.hasNext())
|
|
|
|
sb.append(iter.next().toString());
|
|
|
|
while (iter.hasNext()) {
|
|
|
|
sb.append(delim);
|
|
|
|
sb.append(iter.next().toString());
|
|
|
|
}
|
|
|
|
return sb.toString();
|
|
|
|
}
|
2015-11-15 22:15:37 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public List<RelationType> getAllRelationTypes() {
|
|
|
|
return relationTypes;
|
|
|
|
}
|
2015-01-10 00:23:46 +01:00
|
|
|
}
|