Skip to content

Commit

Permalink
Merge branch 'network' into omnet-plugin
Browse files Browse the repository at this point in the history
Conflicts:
	jdeeco-network-plugin/src/cz/cuni/mff/d3s/jdeeco/publishing/DummyKnowledgePublisher.java
	jdeeco-network-plugin/test/cz/cuni/mff/d3s/jdeeco/network/demo/convoy/ConvoyTest.java
  • Loading branch information
vladamatena committed Mar 13, 2015
2 parents 0ec9701 + eaa7da8 commit bd39805
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import cz.cuni.mff.d3s.deeco.task.TimerTaskListener;
import cz.cuni.mff.d3s.deeco.timer.CurrentTimeProvider;
import cz.cuni.mff.d3s.jdeeco.network.Network;
import cz.cuni.mff.d3s.jdeeco.network.address.IPAddress;
import cz.cuni.mff.d3s.jdeeco.network.address.MANETBroadcastAddress;
import cz.cuni.mff.d3s.jdeeco.network.l2.L2Packet;
import cz.cuni.mff.d3s.jdeeco.network.l2.L2PacketType;
Expand All @@ -33,112 +34,139 @@
/**
* Dummy implementation of knowledge publishing
*
* This uses only broadcast and ignores security
* This uses only broadcast and static list of IP peers, ignores security
*
* @author Vladimir Matena <matena@d3s.mff.cuni.cz>
*
*/
public class DummyKnowledgePublisher implements DEECoPlugin, TimerTaskListener {
public class DefaultKnowledgePublisher implements DEECoPlugin, TimerTaskListener {
private final static long PUBLISH_PERIOD = Integer.getInteger(DeecoProperties.PUBLISHING_PERIOD,
PublisherTask.DEFAULT_PUBLISHING_PERIOD);

private Network network;
private KnowledgeManagerContainer knowledgeManagerContainer;
private CurrentTimeProvider timeProvider;
private DEECoContainer container;

private final static long PUBLISH_PERIOD = Integer.getInteger(DeecoProperties.PUBLISHING_PERIOD,
PublisherTask.DEFAULT_PUBLISHING_PERIOD);

@Override
public List<Class<? extends DEECoPlugin>> getDependencies() {
return Arrays.asList(Network.class);
private List<IPAddress> infrastructurePeers;
private final List<KnowledgePath> empty;

/**
* Constructs DefaultKnowledgePublisher with broadcast only publishing
*/
public DefaultKnowledgePublisher() {
this(new LinkedList<IPAddress>());
}

public DummyKnowledgePublisher() {
/**
* Constructs DefaultKnowledgePublisher with broadcast and static infrastructure publishing
*
* @param peers
* Infrastructure peers
*/
public DefaultKnowledgePublisher(List<IPAddress> peers) {
infrastructurePeers = peers;
RuntimeMetadataFactory factory = RuntimeMetadataFactoryExt.eINSTANCE;
KnowledgePath empty = factory.createKnowledgePath();
emptyPath = new LinkedList<>();
emptyPath.add(empty);
empty = new LinkedList<>(Arrays.asList(factory.createKnowledgePath()));
}

// NOTE: Taken from DefaultKnowledgeDataManager
protected final List<KnowledgePath> emptyPath;

// NOTE: Taken from DefaultKnowledgeDataManager
protected List<KnowledgeData> prepareLocalKnowledgeData() {
/**
* Gets local knowledge data from all knowledge managers
*
* @return Knowledge data set
*/
protected List<KnowledgeData> getLocalKnowledgeData() {
List<KnowledgeData> result = new LinkedList<>();
for (KnowledgeManager km : knowledgeManagerContainer.getLocals()) {
try {
KnowledgeData kd = prepareLocalKnowledgeData(km);
result.add(filterLocalKnowledgeForKnownEnsembles(kd));
result.add(getLocalKnowledgeData(km));
} catch (Exception e) {
Log.e("prepareKnowledgeData error", e);
}
}
return result;
}

// NOTE: Taken from DefaultKnowledgeDataManager
protected KnowledgeData prepareLocalKnowledgeData(KnowledgeManager km) throws KnowledgeNotFoundException {

// TODO: We are ignoring security, and host
/**
* Gets local knowledge data from specific knowledge manager
*
* @param km
* KnowledgeManager to get data from
* @return Knowledge data
* @throws KnowledgeNotFoundException
*/
protected KnowledgeData getLocalKnowledgeData(KnowledgeManager km) throws KnowledgeNotFoundException {
// TODO: version is implemented by current time
long time = timeProvider.getCurrentMilliseconds();
return new KnowledgeData(getNonLocalKnowledge(km.get(emptyPath), km), new ValueSet(), new ValueSet(), new KnowledgeMetaData(
km.getId(), time, String.valueOf(container.getId()), time, 1));
ValueSet knowledge = getTransferableKnowledge(km.get(empty), km);
String id = String.valueOf(container.getId());
return new KnowledgeData(knowledge, new ValueSet(), new ValueSet(), new KnowledgeMetaData(km.getId(), time, id,
time, 1));
}

// NOTE: Taken from DefaultKnowledgeDataManager
protected ValueSet getNonLocalKnowledge(ValueSet toFilter, KnowledgeManager km) {

/**
* Gets knowledge that can be send via network (is not @Local annotated)
*
* @param source
* Knowledge values to be stripped of non-transferable knowledge
* @param knowledgeManager
* Knowledge manager containing the source knowledge
* @return Source knowledge stripped of @Local annotated knowledge
*/
protected ValueSet getTransferableKnowledge(ValueSet source, KnowledgeManager knowledgeManager) {
ValueSet result = new ValueSet();
for (KnowledgePath kp : toFilter.getKnowledgePaths()) {
if (!km.isLocal(kp)) {
result.setValue(kp, toFilter.getValue(kp));
for (KnowledgePath kp : source.getKnowledgePaths()) {
if (!knowledgeManager.isLocal(kp)) {
result.setValue(kp, source.getValue(kp));
}
}
return result;
}

// NOTE: Taken from DefaultKnowledgeDataManager
protected KnowledgeData filterLocalKnowledgeForKnownEnsembles(KnowledgeData kd) {
// FIXME: make this generic
// now we hardcode our demo (we filter the Leader knowledge to only
// publish id, team, and position.
if (kd.getMetaData().componentId.startsWith("L")) {
ValueSet values = kd.getKnowledge();
ValueSet newValues = new ValueSet();
for (KnowledgePath kp : values.getKnowledgePaths()) {
newValues.setValue(kp, values.getValue(kp));
}
return new KnowledgeData(newValues, kd.getSecuritySet(), kd.getAuthors(), kd.getMetaData());
} else {
return kd;
}
}


@Override
public void at(long time, Object triger) {
System.out.println("Publisher called at: " + time);

for(KnowledgeData data: prepareLocalKnowledgeData()) {
network.getL2().sendL2Packet(new L2Packet(new PacketHeader(L2PacketType.KNOWLEDGE), data),
MANETBroadcastAddress.BROADCAST);
// Get knowledge and distribute it
for (KnowledgeData data : getLocalKnowledgeData()) {
L2Packet packet = new L2Packet(new PacketHeader(L2PacketType.KNOWLEDGE), data);

// Distribute via broadcast
network.getL2().sendL2Packet(packet, MANETBroadcastAddress.BROADCAST);

// Distribute via infrastructure network
for (IPAddress address : getPeers()) {
network.getL2().sendL2Packet(packet, address);
}
}

Scheduler scheduler = container.getRuntimeFramework().getScheduler();
scheduler.addTask(new CustomStepTask(scheduler, this, PUBLISH_PERIOD));
}

@Override
public TimerTask getInitialTask(Scheduler scheduler) {
return new CustomStepTask(scheduler, this, PUBLISH_PERIOD);
return new CustomStepTask(scheduler, this, Integer.getInteger(DeecoProperties.PUBLISHING_PERIOD,
PublisherTask.DEFAULT_PUBLISHING_PERIOD));
}

@Override
public List<Class<? extends DEECoPlugin>> getDependencies() {
return Arrays.asList(Network.class);
}

/**
* Gets list of infrastructure peers
*/
protected List<IPAddress> getPeers() {
return infrastructurePeers;
}

@Override
public void init(DEECoContainer container) {
// Resolve dependencies
network = container.getPluginInstance(Network.class);
knowledgeManagerContainer = container.getRuntimeFramework().getContainer();
this.container = container;
this.container = container;

timeProvider = container.getRuntimeFramework().getScheduler().getTimer();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import cz.cuni.mff.d3s.jdeeco.network.Network;
import cz.cuni.mff.d3s.jdeeco.network.device.BroadcastLoopback;
import cz.cuni.mff.d3s.jdeeco.network.l2.strategy.KnowledgeInsertingStrategy;
import cz.cuni.mff.d3s.jdeeco.publishing.DummyKnowledgePublisher;
import cz.cuni.mff.d3s.jdeeco.publishing.DefaultKnowledgePublisher;

/**
*
Expand Down Expand Up @@ -49,14 +49,14 @@ public void testConvoyLoopback() throws AnnotationProcessorException, Interrupte
BroadcastLoopback loopback = new BroadcastLoopback();

/* create first deeco node */
DEECoNode deeco1 = realm.createNode(1, new Network(), new DummyKnowledgePublisher(),
DEECoNode deeco1 = realm.createNode(1, new Network(), new DefaultKnowledgePublisher(),
new KnowledgeInsertingStrategy(), loopback);
/* deploy components and ensembles */
deeco1.deployComponent(new Leader());
deeco1.deployEnsemble(ConvoyEnsemble.class);

/* create second deeco node */
DEECoNode deeco2 = realm.createNode(2, new Network(), new DummyKnowledgePublisher(),
DEECoNode deeco2 = realm.createNode(2, new Network(), new DefaultKnowledgePublisher(),
new KnowledgeInsertingStrategy(), loopback);
/* deploy components and ensembles */
deeco2.deployComponent(new Follower());
Expand Down

0 comments on commit bd39805

Please sign in to comment.