Skip to content
Snippets Groups Projects
Commit 3485e378 authored by Pierre Falez's avatar Pierre Falez
Browse files

Init commit

parents
No related branches found
No related tags found
No related merge requests found
Showing
with 708 additions and 0 deletions
/**
* SBT project description
*
* Uses the sbt-assembly plugin to create a fat jar containing the library and all dependencies.
* See: https://github.com/sbt/sbt-assembly
*/
name := "N2S3"
test in assembly := {}
/*********************************************************************************************************************
* Dependencies
*******************************************************************************************************************/
libraryDependencies ++= {
val scalaXmlV = "1.0.2"
val akkaV = "2.3.7"
val scalatestV = "2.2.1"
Seq(
"javax.activation" % "activation" % "1.1.1",
"commons-io" % "commons-io" % "2.4",
"org.scala-lang.modules" %% "scala-xml" % scalaXmlV,
"com.typesafe.akka" %% "akka-actor" % akkaV,
"com.typesafe.akka" %% "akka-testkit" % akkaV,
"com.typesafe.akka" %% "akka-cluster" % akkaV,
"org.scalatest" %% "scalatest" % scalatestV % "test",
"com.squants" %% "squants" % "0.5.3",
"com.storm-enroute" %% "scalameter" % "0.7",
"org.knowm.xchart" % "xchart" % "3.3.1" exclude("de.erichseifert.vectorgraphics2d", "VectorGraphics2D"),
"net.sf" %% "jaer" % "1.0" from "https://sourcesup.renater.fr/frs/download.php/file/5047/jaer.jar"
)
}
File added
File added
File added
File added
File added
This diff is collapsed.
File added
package fr.univ_lille.cristal.emeraude.n2s3;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import java.awt.*;
public class Graph extends ApplicationFrame {
/**
*
*/
private static final long serialVersionUID = 1352234752863184258L;
// chart data
private XYSeriesCollection _dataset;
private XYSeries firstSerie, secondSerie;
// abscissa of the next point
private int time;
private final String time_name = "time";
/**
* Main constructor
*
* @param title
* title of the frame
*/
public Graph(String title, String first_title, String second_title) {
super(title);
this.time = 1;
this.firstSerie = new XYSeries(first_title);
this.secondSerie = new XYSeries(second_title);
this._dataset = new XYSeriesCollection();
this._dataset.addSeries(firstSerie);
this._dataset.addSeries(secondSerie);
final JFreeChart chart = createChart(_dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
this.setVisible(true);
}
/**
* Creation of the chart
*
* @param dataset
* data to display on the graph
* @return the chart initialized
*/
private JFreeChart createChart(final XYDataset dataset) {
// create the chart...
final JFreeChart chart = ChartFactory.createXYLineChart(
this.getTitle(), // chart title
this.time_name, // x axis label
"Entity number", // y axis label
dataset, // data
PlotOrientation.VERTICAL, true, // include legend
true, // tooltips
false // urls
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
chart.setBackgroundPaint(Color.white);
// get a reference to the plot for further customisation...
final XYPlot plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesShapesVisible(0, false);
renderer.setSeriesShapesVisible(1, false);
plot.setRenderer(renderer);
// change the auto tick unit selection to integer units only...
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// OPTIONAL CUSTOMISATION COMPLETED.
return chart;
}
@Override
public void paint(Graphics grphcs) {
super.paint(grphcs);
}
public void addall(double x, double y) {
this.secondSerie.add(this.time, y);
this.firstSerie.add(this.time, x);
XYSeriesCollection xs = new XYSeriesCollection();
xs.addSeries(firstSerie);
xs.addSeries(secondSerie);
this.time++;
this._dataset = xs;
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging
import akka.actor.{ActorRef, Props}
import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{N2S3, NeuronGroupObserverRef, NeuronGroupRef}
import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
/**
* Created by guille on 6/16/16.
*/
case class InputOutputGraphNetworkObserver(tuples: Seq[(NeuronGroupRef, Int, Int)]) extends NeuronGroupObserverRef {
var actor: Option[ActorRef] = None
var rateRefresh : Int = 1000/24
def getActors : Seq[ActorRef] = this.actor.toSeq
override protected def deploy(n2S3: N2S3): Unit = {
val newActor = n2S3.system.actorOf(Props(new NeuronInputOutputGraph(tuples.map(each => (each._1.getIdentifier, each._2, each._1.neurons.map(_.actorPath.get), each._3)))), LocalActorDeploymentStrategy)
this.actor = Some(newActor)
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging.graph;
import org.knowm.xchart.XChartPanel;
import javax.swing.*;
/**
*
* @author bdanglot Abstract class which all Graph will extends
*
*/
public abstract class AbstractGraph {
/**
* The framework
*/
//protected Chart chart;
/**
* The panel
*/
protected XChartPanel pan;
private boolean run;
/**
* Constuctor Init the framework 800x600, add it to the panel
*/
public AbstractGraph() {
// Create Chart
//this.chart = new Chart(800, 600);
// Customize Chart
//this.chart.getStyleManager().setChartTitleVisible(false);
//this.chart.getStyleManager().setLegendPosition(LegendPosition.OutsideE);
// Add Chart to Pan
//this.pan = new XChartPanel(this.chart);
// isn't running
this.run = false;
}
public boolean isRunning() {
return this.run;
}
/**
* Create a JFrame and add the panel to It
*/
public void launch() {
this.run = true;
// Create and set up the window.
JFrame frame = new JFrame("XChart");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pan);
// Display the window.
frame.pack();
frame.setVisible(true);
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging.graph;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author bdanglot
*
* Class to display a Scatter graph of Activities of Neurons (When they
* fire)
*
*/
public class NeuronsActivitiesGraph extends AbstractGraph {
/**
* Index of neurons : more it is deeper, more its index is high (N0,1 : 1,
* for example)
*/
private final List<Integer> indexOfActivNeurons = new CopyOnWriteArrayList<Integer>();
private final List<Integer> time = new CopyOnWriteArrayList<Integer>();
/**
* Constructor Call the super() constructor and change the ChartType to
* Scatter
*/
public NeuronsActivitiesGraph() {
super();
//this.chart.getStyleManager().setChartType(ChartType.Scatter);
}
/**
* Method to refresh the framework while simuling
*
* @param t
* new timestamps
* @param n
* index of active neurons
*/
public synchronized void refreshSerie(int t, int n) {
this.addSerie(t, n);
/*if (!this.chart.getSeriesMap().containsKey("Activity of Neurons"))
this.chart.addSeries("Activity of Neurons", time,
indexOfActivNeurons);*/
while (t - this.time.get(0) > 10000) {
this.time.remove(0);
this.indexOfActivNeurons.remove(0);
}
//this.pan.updateSeries("Activity of Neurons", time, indexOfActivNeurons);
}
/**
* add a new content to the framework
*
* @param t
* new timestamps
* @param n
* index of active neurons
*/
public synchronized void addSerie(int t, int n) {
this.time.add(t);
this.indexOfActivNeurons.add(n);
}
/**
* Method to launch in offLine (no simulation) It will add contents to the
* framework (Beware to add some contents before using it) And then call the
* super Launch()
*/
public void launchOffline() {
//this.chart.addSeries("Activity of Neurons", time, indexOfActivNeurons);
this.launch();
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging.graph;
import java.awt.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author bdanglot
* Class to display weights of Synapses. Cannot run during simulation.
*/
public class SynapticsConductancesGraph extends AbstractGraph {
/**
* List of weights of Synapses
*/
private final List<Float> weights = new CopyOnWriteArrayList<Float>();
/**
* List full of 0 in order to add the couple (w,0)
*/
private final List<Integer> listZero = new CopyOnWriteArrayList<Integer>();
/**
* Constructor Call the super() constructor and change the ChartType to
* Scatter
*/
public SynapticsConductancesGraph() {
super();
//this.chart.getStyleManager().setChartType(ChartType.Scatter);
}
/**
* Add content
* @param val the value of weights
*/
public void addSerie(float val) {
this.weights.add(val);
this.listZero.add(0);
}
/**
* @Overriding the superLaunch()
*/
public void launch() {
//this.chart.addSeries("Synapses", weights, listZero);
//this.chart.getSeriesMap().get("Synapses").setMarkerColor(new Color(0,0,255,32));
super.launch();
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging.graph;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* @author bdanglot Class to display Weights of Synapses using BarChart
*/
public class SynapticsWeightsBarGraph extends AbstractGraph {
/**
* Map which associate the name of synapses to their weights
*/
private final Map<String, Float> test = new ConcurrentHashMap<String, Float>();
/**
* Constructor Set the chart type at Bar
*/
public SynapticsWeightsBarGraph() {
super();
//this.chart.getStyleManager().setChartType(ChartType.Bar);
}
/**
* Method to refresh the framework while simuling
*
* @param name
* of the synapses to refresh
* @param value
* the new weight of this synapse
*/
public synchronized void refreshSerie(String name, float value) {
this.addSerie(name, value);
/*
if (!this.chart.getSeriesMap().containsKey("Weight"))
this.chart.addSeries("Weight", this.test.keySet(),
this.test.values());
List<Float> tmp = new ArrayList<Float>(this.test.values());
this.pan.updateSeries("Weight", this.test.keySet(), tmp);*/
}
/**
* add content as couple (name,weight)
*
* @param name
* of the synapses to refresh
* @param value
* the new weight of this synapse
*/
public synchronized void addSerie(String name, float value) {
this.test.put(name, value);
}
/**
* Method to launch in offLine (no simulation) It will add contents to the
* framework (Beware to add some contents before using it) And then call the
* super Launch()
*/
public void launchOffline() {
//this.chart.addSeries("Weight", this.test.keySet(), this.test.values());
super.launch();
}
}
package fr.univ_lille.cristal.emeraude.n2s3.features.logging.graph;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author bdanglot Class to display potentials of neurons or weights of
* synapses. It can be used in both case. For clarity, neurons and
* synapses will be call "entities" and potential and weight "values"
*/
public class ValuesOfNetworkGraph extends AbstractGraph {
/**
* Map which associate name of entity and a list of timestamp
*/
private final Map<String, List<Integer>> time = new ConcurrentHashMap<String, List<Integer>>();
/**
* Map which associate name of entity and a list of values
*/
private final Map<String, List<Float>> values = new ConcurrentHashMap<String, List<Float>>();
/**
* Constructor Set the chart type to line
*/
public ValuesOfNetworkGraph() {
super();
//this.chart.getStyleManager().setChartType(ChartType.Line);
}
/**
* Method to refresh the framework while simuling
*
* @param name
* of the entity to refresh
* @param time
* the timestamp of the event
* @param value
* the new value of this entity
*/
public synchronized void refreshSerie(String name, int time, float value) {
this.addSerie(name, time, value);
/* if (!this.chart.getSeriesMap().containsKey(name))
this.chart.addSeries(name, this.time.get(name),
this.values.get(name));*/
while (time - this.time.get(name).get(0) > 5000) {
this.time.get(name).remove(0);
this.values.get(name).remove(0);
}
/*this.chart.getSeriesMap().get(name).setMarker(SeriesMarker.NONE);
this.pan.updateSeries(name, this.time.get(name), this.values.get(name));
*/
}
/**
* add a new content to the framework
*
* @param name
* of the entity to refresh
* @param time
* the timestamp of the event
* @param value
* the new value of this entity
*/
public synchronized void addSerie(String name, int time, float value) {
if (values.containsKey(name)) {
this.values.get(name).add(value);
this.time.get(name).add(time);
} else {
// Create the new list
List<Float> listPot = new CopyOnWriteArrayList<Float>();
listPot.add(value);
this.values.put(name, listPot);
// Create the new list
List<Integer> listTime = new CopyOnWriteArrayList<Integer>();
listTime.add(time);
this.time.put(name, listTime);
}
}
/**
* Method to launch in offLine (no simulation) It will add contents to the
* framework (Beware to add some contents before using it) And then call the
* super Launch()
*/
public void launchOffline() {
for (String key : this.values.keySet()) {
//this.chart.addSeries(key, this.time.get(key), this.values.get(key));
}
super.launch();
}
}
Manifest-Version: 1.0
Class-Path: squants_2.11-0.5.3.jar akka-testkit_2.11-2.3.7.jar xchart-
3.3.1.jar jfreechart-1.0.17.jar nd4j-common-0.7.2.jar nd4j-native-0.7
.2-android-x86.jar asm-5.0.4.jar protobuf-java-2.5.0.jar nd4j-native-
platform-0.7.2.jar akka-cluster_2.11-2.3.7.jar commons-io-2.4.jar nd4
j-native-0.7.2-android-arm.jar openblas-0.2.19-1.3-android-arm.jar ne
tty-3.8.0.Final.jar commons-math3-3.2.jar scalameter-core_2.11-0.7.ja
r scalameter_2.11-0.7.jar lombok-1.16.10.jar jackson-core-2.5.2.jar s
tax2-api-3.1.4.jar openblas-0.2.19-1.3-linux-x86_64.jar scala-parser-
combinators_2.11-1.0.1.jar scala-parser-combinators_2.11-1.0.3.jar ja
ckson-module-scala_2.11-2.5.2.jar scala-swing_2.11-1.0.1.jar uncommon
s-maths-1.2.2a.jar openblas-0.2.19-1.3-windows-x86_64.jar nd4j-contex
t-0.7.2.jar nd4j-native-0.7.2-windows-x86_64.jar annotations-2.0.1.ja
r nd4j-native-0.7.2-linux-ppc64le.jar nd4j-native-0.7.2.jar scala-xml
_2.11-1.0.2.jar commons-math3-3.4.1.jar nd4s_2.11-0.7.2.jar openblas-
0.2.19-1.3-linux-ppc64le.jar openblas-0.2.19-1.3-macosx-x86_64.jar sl
f4j-api-1.7.10.jar scalaxy-loops_2.11-0.3.4.jar openblas-0.2.19-1.3-a
ndroid-x86.jar ascii-graphs_2.10-0.0.3.jar gpg-library_2.10-0.8.3.jar
commons-codec-1.4.jar commons-logging-1.1.1.jar jsr250-api-1.0.jar c
di-api-1.0.jar javax.inject-1.jar dispatch-core_2.10-0.8.10.jar dispa
tch-futures_2.10-0.8.10.jar dispatch-http_2.10-0.8.10.jar ant-launche
r-1.9.6.jar ant-1.9.6.jar httpclient-4.1.3.jar httpcore-4.1.4.jar mav
en-artifact-3.3.3.jar maven-model-3.3.3.jar maven-plugin-api-3.3.3.ja
r bcpg-jdk15on-1.49.jar bcprov-jdk15on-1.49.jar plexus-classworlds-2.
5.2.jar plexus-component-annotations-1.5.5.jar plexus-utils-3.0.20.ja
r org.eclipse.sisu.inject-0.3.0.jar org.eclipse.sisu.plexus-0.3.0.jar
asm-commons-5.0.4.jar asm-tree-5.0.4.jar asm-5.0.4.jar jarjar-1.6.0.
jar scala-actors-2.10.6.jar scalactic_2.10-2.2.1.jar scalaz-core_2.10
-7.0.2.jar scalaz-effect_2.10-7.0.2.jar sbt-assembly-0.14.3.jar sbt-m
ulti-jvm-0.3.11.jar sbt-pgp-0.8.3.jar sbteclipse-core-2.5.0.jar sbtec
lipse-plugin-2.5.0.jar sbt-dependency-graph-0.8.2.jar jansi.jar jline
.jar scala-compiler.jar scala-library.jar scala-reflect.jar actions-0
.13.13.jar api-0.13.13.jar apply-macro-0.13.13.jar cache-0.13.13.jar
classfile-0.13.13.jar classpath-0.13.13.jar collections-0.13.13.jar c
ommand-0.13.13.jar compile-0.13.13.jar compiler-integration-0.13.13.j
ar compiler-interface-0.13.13.jar compiler-ivy-integration-0.13.13.ja
r completion-0.13.13.jar control-0.13.13.jar cross-0.13.13.jar increm
ental-compiler-0.13.13.jar io-0.13.13.jar ivy-0.13.13.jar ivy-2.3.0-s
bt-2cf13e211b2cb31f0d3b317289dca70eca3362f6.jar jansi-1.11.jar jawn-p
arser_2.10-0.6.0.jar jline-2.13.jar jsch-0.1.50.jar json4s-ast_2.10-3
.2.10.jar json4s-core_2.10-3.2.10.jar json4s-support_2.10-0.6.0.jar l
auncher-interface-1.0.0-M1.jar logging-0.13.13.jar logic-0.13.13.jar
main-0.13.13.jar main-settings-0.13.13.jar paranamer-2.6.jar persist-
0.13.13.jar process-0.13.13.jar quasiquotes_2.10-2.0.1.jar relation-0
.13.13.jar run-0.13.13.jar sbinary_2.10-0.4.2.jar sbt-0.13.13.jar sca
la-pickling_2.10-0.10.1.jar scala-reflect-2.10.6.jar serialization_2.
10-0.1.2.jar task-system-0.13.13.jar tasks-0.13.13.jar template-resol
ver-0.1.jar test-agent-0.13.13.jar test-interface-1.0.jar testing-0.1
3.13.jar tracking-0.13.13.jar interface-0.13.13.jar nd4j-native-0.7.2
-linux-x86_64.jar guava-18.0.jar config-1.2.1.jar openblas-0.2.19-1.3
.jar nd4j-api-0.7.2.jar nd4j-buffer-0.7.2.jar nd4j-native-0.7.2-macos
x-x86_64.jar commons-lang3-3.4.jar reflections-0.9.10.jar test-interf
ace-0.5.jar jcommon-1.0.21.jar scala-compiler-2.11.6.jar joda-time-2.
2.jar nd4j-native-api-0.7.2.jar akka-remote_2.11-2.3.7.jar paranamer-
2.6.jar snakeyaml-1.12.jar javacpp-1.3.1.jar javassist-3.18.2-GA.jar
jackson-databind-2.5.2.jar scala-reflect-2.11.6.jar scala-library-2.1
1.6.jar scala-chart_2.11-0.4.2.jar jackson-0.7.2.jar akka-actor_2.11-
2.3.7.jar scala-xml_2.11-1.0.3.jar jackson-annotations-2.5.2.jar xml-
apis-1.3.04.jar jaer_2.11-1.0.jar scalaxy-streams_2.11-0.3.4.jar
Main-Class: apps.xperium.Mnist1
This diff is collapsed.
akka.log-config-on-start=on
akka.actor.deployment {
/NeuronialRouter {
/Download
router = round-robin
nr-of-instances = 10
}
}
\ No newline at end of file
package fr.univ_lille.cristal.emeraude.n2s3.core
import fr.univ_lille.cristal.emeraude.n2s3.core.actors.Config
import fr.univ_lille.cristal.emeraude.n2s3.features.builder.NeuronGroupRef
import scala.concurrent.{Await, Future}
/**
* Created by pfalez on 13/06/17.
*/
class ConnectionIndex(inputLayer : NeuronGroupRef, outputLayer : NeuronGroupRef) {
val index = outputLayer.neuronPaths.map{ output =>
output -> ExternalSender.askFuture(output, GetAllConnectionProperty(ConnectionClassName))
.asInstanceOf[Future[ConnectionPropertyValues[String]]]
}.map{ case (output, future) =>
output -> Await.result(future, Config.longTimeout.duration).values.groupBy(_._2).map { case(input, list) =>
input -> list.map{case(id, _, _) => ConnectionPath(output, id)}
}
}.toMap
def getConnectionsBetween(input : NetworkEntityPath, output : NetworkEntityPath) : Seq[ConnectionPath] = {
index.getOrElse(output, Map()).getOrElse(input, Seq())
}
}
package fr.univ_lille.cristal.emeraude.n2s3.core
import akka.actor.ActorRef
import akka.util.Timeout
import fr.univ_lille.cristal.emeraude.n2s3.core.Neuron.ConnectionID
import fr.univ_lille.cristal.emeraude.n2s3.core.actors.Config
import fr.univ_lille.cristal.emeraude.n2s3.support.actors.Message
import scala.concurrent.Future
/**
* Created by falezp on 20/03/17.
*/
/********************************************************************************************************
* Represent an absolute path of a connection
*******************************************************************************************************/
case class ConnectionPath(outputNeuron : NetworkEntityPath, connectionID: ConnectionID) {
override def toString : String = outputNeuron+":"+connectionID
}
/**
* Connection references
*/
abstract class ConnectionReference {
def send(message: Message) : Unit
def ask(message : Message) : Message
}
class LocalConnectionReference(entityRef : LocalNetworkEntityReference, connectionID: ConnectionID) extends ConnectionReference {
def send(message: Message) : Unit = {
entityRef.send(RoutedConnectionMessage(connectionID, message))
}
def ask(message : Message) : Message = {
entityRef.ask(RoutedConnectionMessage(connectionID, message))
}
}
class RemoteConnectionReference(path : ConnectionPath) extends ConnectionReference {
def send(message: Message) : Unit = {
ExternalConnectionSender.sendTo(path, message)
}
def ask(message : Message) : Message = {
ExternalConnectionSender.askTo(path, message).asInstanceOf[Message]
}
}
case class RoutedConnectionMessage(connectionID: ConnectionID, message: Message) extends Message
/**
* Helper for interact with connections. Extends ExternalSender
*/
object ExternalConnectionSender {
implicit val timeout: Timeout = Config.longTimeout
def sendTo(path : ConnectionPath, message: Message) : Unit = {
ExternalSender.sendTo(path.outputNeuron, RoutedConnectionMessage(path.connectionID, message))
}
def askTo(path : ConnectionPath, message: Message, timeout: Timeout = timeout) : Any = {
ExternalSender.askTo(path.outputNeuron, RoutedConnectionMessage(path.connectionID, message), timeout)
}
def askFuture(path : ConnectionPath, message: Message) : Future[Any] = {
ExternalSender.askFuture(path.outputNeuron, RoutedConnectionMessage(path.connectionID, message))
}
def getReference(actor: ActorRef) : NetworkEntityReference = new ExternalActorReference(actor)
}
object ConnectionPathHelper {
def getConnectionsBetween(input : NetworkEntityPath, output : NetworkEntityPath) : Seq[ConnectionPath] = {
ExternalSender.askTo(output, GetAllConnectionProperty(ConnectionClassName))
.asInstanceOf[ConnectionPropertyValues[String]].values.filter(_._2 == input).map(e => ConnectionPath(output, e._1))
}
def getConnectionsBetweenAsync(input : NetworkEntityPath, output : NetworkEntityPath) : Future[Seq[ConnectionPath]] = {
import scala.concurrent.ExecutionContext.Implicits.global
ExternalSender.askFuture(output, GetAllConnectionProperty(ConnectionClassName))
.asInstanceOf[Future[ConnectionPropertyValues[String]]].map(f => f.values.filter(_._2 == input).map(e => ConnectionPath(output, e._1)))
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment