package org.erlide.cover.core;
import java.util.LinkedList;
import java.util.List;
import org.erlide.backend.api.IBackend;
import org.erlide.cover.api.AbstractCoverRunner;
import org.erlide.cover.api.CoverException;
import org.erlide.cover.api.ICoverBackend;
import org.erlide.cover.runtime.launch.CoverLaunchData;
import org.erlide.cover.runtime.launch.CoverLaunchSettings;
import org.erlide.cover.views.model.TestTreeModel;
/**
* Core backend for Cover-plugin
*
* @author Aleksandra Lipiec <aleksandra.lipiec@erlang.solutions.com>
*
*/
public class CoverBackend implements ICoverBackend {
public static final String NODE_NAME = "cover_internal";
public static CoverBackend instance;
private IBackend backend;
private CoverEventHandler handler;
private CoverLaunchSettings settings;
private final List<ICoverObserver> listeners = new LinkedList<>();
private ICoverAnnotationMarker annotationMarker;
private final Logger log; // logger
private EUnitEventHandler testHandler;
private final List<IEUnitObserver> testListeners = new LinkedList<>();
public static synchronized CoverBackend getInstance() {
if (instance == null) {
instance = new CoverBackend();
}
return instance;
}
private CoverBackend() {
log = Activator.getDefault();
}
@Override
public void startBackend() {
if (getBackend() != null && getBackend().isRunning()) {
log.info("is started");
return;
}
handler = new CoverEventHandler(this);
getBackend().getRuntime().registerEventListener(handler);
testHandler = new EUnitEventHandler(TestTreeModel.getInstance(), this);
getBackend().getRuntime().registerEventListener(testHandler);
}
/**
* Initializes cover backend from launch configuration
*
* @param coverData
* @param backend2
* @throws CoverException
*/
public void initialize(/* final ErlLaunchData data, */
final CoverLaunchData coverData) throws CoverException {
// this.coverData = coverData;
try {
settings = new CoverLaunchSettings(coverData.getType(), coverData);
} catch (final CoverException e1) {
settings = null;
throw e1;
}
startBackend();
}
/**
* Run coverage analysis
*/
@Override
public synchronized void runCoverageAnalysis(final AbstractCoverRunner runner) {
runner.start();
}
/**
* Get event handler that handles Erlang events
*
* @return
*/
public CoverEventHandler getHandler() {
return handler;
}
/**
* Get access to cover node
*
* @return
*/
public IBackend getBackend() {
return backend;
}
/**
* Add listener for coverage events
*
* @param listener
*/
public void addListener(final ICoverObserver listener) {
log.info("adding listener");
listeners.add(listener);
}
/**
* Get all listeners
*
* @return
*/
public List<ICoverObserver> getListeners() {
return listeners;
}
/**
* Add listener for coverage events
*
* @param listener
*/
public void addEUnitListener(final IEUnitObserver listener) {
log.info("adding eunit listener");
testListeners.add(listener);
}
/**
* Get all eunit listeners
*
* @return
*/
public List<IEUnitObserver> getEUnitListeners() {
return testListeners;
}
/**
* Set annotation marker for marking coverage in the editor
*
* @param am
*/
public void addAnnotationMaker(final ICoverAnnotationMarker am) {
annotationMarker = am;
}
/**
* Get annotation marker
*
* @return
*/
public ICoverAnnotationMarker getAnnotationMaker() {
return annotationMarker;
}
/**
* Handle all errors, provides graphical representation for final user.
*
* @param msg
*/
public void handleError(final String msg) {
for (final ICoverObserver obs : getListeners()) {
obs.eventOccured(new CoverEvent(CoverStatus.ERROR, msg));
}
}
/**
* Check coverage settings
*
* @return
*/
public CoverLaunchSettings getSettings() {
return settings;
}
public void setBackend(final IBackend backend) {
this.backend = backend;
}
}