SCViewer/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java

253 lines
5.7 KiB
Java
Raw Normal View History

/*******************************************************************************
2021-01-09 14:26:49 +01:00
* Copyright (c) 2015-2021 MINRES Technologies GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
package com.minres.scviewer.database.internal;
2021-01-09 20:10:58 +01:00
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
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;
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.RelationType;
/**
* The Class WaveformDb.
*/
2021-01-09 20:10:58 +01:00
public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeListener {
/** The loaders. */
private static List<IWaveformDbLoader> loaders = new LinkedList<>();
/** The loaded. */
private boolean loaded;
/** The relation types. */
private List<RelationType> relationTypes;
/** The waveforms. */
private Map<String, IWaveform> waveforms;
/** The max time. */
2021-02-27 14:59:00 +01:00
private long maxTime = -1;
/**
* Bind.
*
* @param loader the loader
*/
public synchronized void bind(IWaveformDbLoader loader) {
loaders.add(loader);
}
/**
* Unbind.
*
* @param loader the loader
*/
public synchronized void unbind(IWaveformDbLoader loader) {
loaders.remove(loader);
}
/**
* Gets the loaders.
*
* @return the loaders
*/
public static List<IWaveformDbLoader> getLoaders() {
return Collections.unmodifiableList(loaders);
}
/**
* Instantiates a new waveform db.
*/
public WaveformDb() {
super();
waveforms = new HashMap<>();
relationTypes = new ArrayList<>();
maxTime = 0L;
}
/**
* Gets the max time.
*
* @return the max time
*/
@Override
2021-02-27 14:59:00 +01:00
public long getMaxTime() {
return maxTime;
}
/**
* Gets the stream by name.
*
* @param name the name
* @return the stream by name
*/
@Override
public IWaveform getStreamByName(String name) {
return waveforms.get(name);
}
/**
* Gets the all waves.
*
* @return the all waves
*/
@Override
public List<IWaveform> getAllWaves() {
return new ArrayList<>(waveforms.values());
}
/**
* Load.
*
* @param inp the inp
* @return true, if successful
*/
@Override
public boolean load(File inp) {
2021-01-14 23:13:11 +01:00
boolean retval = true;
for (IWaveformDbLoader loader : loaders) {
2021-01-09 22:23:38 +01:00
if (loader.canLoad(inp)) {
2021-01-14 23:13:11 +01:00
loader.addPropertyChangeListener(this);
2021-01-09 20:10:58 +01:00
try {
loader.load(this, inp);
} catch (Exception e) {
2021-01-14 23:13:11 +01:00
retval=false;
2015-01-20 18:50:15 +01:00
}
2021-01-14 23:13:11 +01:00
loader.removePropertyChangeListener(this);
for (IWaveform w : loader.getAllWaves()) {
waveforms.put(w.getFullName(), w);
}
if (loader.getMaxTime() > maxTime) {
maxTime = loader.getMaxTime();
}
if (name == null)
name = getFileBasename(inp.getName());
buildHierarchyNodes();
relationTypes.addAll(loader.getAllRelationTypes());
}
}
2021-01-14 23:13:11 +01:00
pcs.firePropertyChange(IHierNode.LOADING_FINISHED, null, null);
loaded = true;
return retval;
}
/**
* Gets the file basename.
*
* @param f the f
* @return the file basename
*/
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;
}
/**
* Clear.
*/
@Override
public void clear() {
waveforms.clear();
2021-01-09 20:10:58 +01:00
childNodes.clear();
loaded = false;
}
/**
* Checks if is loaded.
*
* @return true, if is loaded
*/
public boolean isLoaded() {
return loaded;
}
2021-01-09 20:10:58 +01:00
@Override
public void propertyChange(PropertyChangeEvent evt) {
2021-01-09 22:23:38 +01:00
if (IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName())
|| IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) {
2021-01-09 20:10:58 +01:00
IWaveform waveform = (IWaveform) evt.getNewValue();
putInHierarchy(waveform);
pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms);
pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes);
2021-01-09 22:23:38 +01:00
} else if (IWaveformDbLoader.GENERATOR_ADDED.equals(evt.getPropertyName())) {
pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes);
2021-01-09 20:10:58 +01:00
}
}
/**
* Builds the hierarchy nodes.
*/
private void buildHierarchyNodes() {
2021-01-09 22:23:38 +01:00
boolean needsSorting = false;
for (IWaveform stream : getAllWaves()) {
2021-01-09 22:23:38 +01:00
if (stream.getParent() == null) {
2021-01-09 20:10:58 +01:00
putInHierarchy(stream);
2021-01-09 22:23:38 +01:00
needsSorting = true;
}
}
2021-01-09 22:23:38 +01:00
if (needsSorting) {
2021-01-09 20:10:58 +01:00
pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms);
pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes);
}
}
2021-01-09 20:10:58 +01:00
private synchronized void putInHierarchy(IWaveform waveform) {
String[] hier = waveform.getName().split("\\.");
IHierNode node = this;
for (int i = 0; i < hier.length - 1; ++i) {
String name = hier[i];
IHierNode childNode = null;
for (IHierNode n : node.getChildNodes()) {
if (n.getName().equals(name)) {
childNode = n;
break;
}
}
2021-02-17 22:14:28 +01:00
if (childNode == null) {
HierNode newNode = new HierNode(name, node);
node.addChild(newNode);
node = newNode;
} else {
2021-01-09 20:10:58 +01:00
node = childNode;
}
2020-11-28 19:41:00 +01:00
}
2021-01-09 20:10:58 +01:00
node.addChild(waveform);
waveform.setParent(node);
waveform.setName(hier[hier.length - 1]);
2015-10-22 22:12:18 +02:00
}
/**
* Gets the all relation types.
*
* @return the all relation types
*/
@Override
public List<RelationType> getAllRelationTypes() {
return relationTypes;
}
2021-01-09 20:10:58 +01:00
}