Skip to content

Commit

Permalink
Merge pull request #101 from d3scomp/newgen-bures
Browse files Browse the repository at this point in the history
Added equals/hashCode tests + some devel in EnsembleTask
  • Loading branch information
mkit committed Nov 12, 2013
2 parents 063eebf + cf67976 commit 5bfbcde
Show file tree
Hide file tree
Showing 5 changed files with 265 additions and 234 deletions.
101 changes: 36 additions & 65 deletions jdeeco-core/src/cz/cuni/mff/d3s/deeco/task/EnsembleTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import cz.cuni.mff.d3s.deeco.model.runtime.api.PathNodeMember;
import cz.cuni.mff.d3s.deeco.model.runtime.api.PeriodicTrigger;
import cz.cuni.mff.d3s.deeco.model.runtime.api.Trigger;
import cz.cuni.mff.d3s.deeco.model.runtime.impl.TriggerImpl;
import cz.cuni.mff.d3s.deeco.model.runtime.meta.RuntimeMetadataFactory;
import cz.cuni.mff.d3s.deeco.scheduler.Scheduler;

Expand All @@ -31,29 +32,39 @@ public class EnsembleTask extends Task {

EnsembleController ensembleController;

private class KnowledgeManagerTriggerListenerImpl implements TriggerListener {
private static class LocalKMChangeTrigger extends TriggerImpl {
public LocalKMChangeTrigger(KnowledgeChangeTrigger knowledgeChangeTrigger) {
super();
this.knowledgeChangeTrigger = knowledgeChangeTrigger;
}

KnowledgeChangeTrigger knowledgeChangeTrigger;
}

private static class ShadowKMChangeTrigger extends TriggerImpl {
public ShadowKMChangeTrigger(ReadOnlyKnowledgeManager shadowKnowledgeManager, KnowledgeChangeTrigger knowledgeChangeTrigger) {
super();
this.knowledgeChangeTrigger = knowledgeChangeTrigger;
this.shadowKnowledgeManager = shadowKnowledgeManager;
}

KnowledgeChangeTrigger knowledgeChangeTrigger;
ReadOnlyKnowledgeManager shadowKnowledgeManager;
}

private class LocalKMTriggerListenerImpl implements TriggerListener {

/* (non-Javadoc)
* @see cz.cuni.mff.d3s.deeco.knowledge.TriggerListener#triggered(cz.cuni.mff.d3s.deeco.model.runtime.api.Trigger)
*/
@Override
public void triggered(Trigger trigger) {
if (isForCoordinatorKM(trigger)) {
// TODO: Schedule the execution of the ensemble (i.e. membership and possibly knowledge exchange) as the coordinator
// This means that we have to know what to do once the scheduler calls us in the next round.
} else if (isForMemberKM(trigger)) {
// TODO: Schedule the execution of the ensemble (i.e. membership and possibly knowledge exchange) as the member
// This means that we have to know what to do once the scheduler calls us in the next round.
} else {
assert(false);
}

if (listener != null) {
listener.triggered(EnsembleTask.this, trigger);
listener.triggered(EnsembleTask.this, new LocalKMChangeTrigger((KnowledgeChangeTrigger)trigger));
}
}
}
KnowledgeManagerTriggerListenerImpl knowledgeManagerTriggerListener = new KnowledgeManagerTriggerListenerImpl();
LocalKMTriggerListenerImpl knowledgeManagerTriggerListener = new LocalKMTriggerListenerImpl();

private class ShadowsTriggerListenerImpl implements ShadowsTriggerListener {

Expand All @@ -62,18 +73,8 @@ private class ShadowsTriggerListenerImpl implements ShadowsTriggerListener {
*/
@Override
public void triggered(ReadOnlyKnowledgeManager knowledgeManager, Trigger trigger) {
if (isForCoordinatorKM(trigger)) {
// TODO: Schedule execution of the ensemble (i.e. membership and possibly knowledge exchange) as the member
// This means that we have to know what to do once the scheduler calls us in the next round.
} else if (isForMemberKM(trigger)) {
// TODO: Schedule execution of the ensemble (i.e. membership and possibly knowledge exchange) as the coordinator
// This means that we have to know what to do once the scheduler calls us in the next round.
} else {
assert(false);
}

if (listener != null) {
listener.triggered(EnsembleTask.this, trigger);
listener.triggered(EnsembleTask.this, new ShadowKMChangeTrigger(knowledgeManager, (KnowledgeChangeTrigger)trigger));
}
}
}
Expand All @@ -85,39 +86,6 @@ public EnsembleTask(EnsembleController ensembleController, Scheduler scheduler)
this.ensembleController = ensembleController;
}

// FIXME TB: The following four methods should probably go somewhere else, as the EnsembleTask is not really supposed
// to understand internals of triggers. Maybe it would make sense to put it either to the meta-model or to knowledge package.

/**
* Helper method for methods isForCoordinatorKM and isForMemberKM.
* @param trigger Trigger to be checked. Currently only {@link KnowledgeChangeTrigger} is accepted.
* @param nodeType {@link PathNodeCoordinator}.class or {@link PathNodeMember}.class
* @return True if the trigger is to be registered in coordinator's or member's knowledge manager respectively.
*/
private boolean isForKM(Trigger trigger, Class<? extends PathNode> nodeType) {
KnowledgeChangeTrigger knowledgeChangeTrigger = (KnowledgeChangeTrigger)trigger;

List<PathNode> pathNodes = knowledgeChangeTrigger.getKnowledgePath().getNodes();

return !pathNodes.isEmpty() && (nodeType.isInstance(pathNodes.get(0)));
}

/**
* Returns true if the trigger is to be registered in the coordinator's knowledge manager.
* @param trigger
*/
private boolean isForCoordinatorKM(Trigger trigger) {
return isForKM(trigger, PathNodeCoordinator.class);
}

/**
* Returns true if the trigger is to be registered in the member's knowledge manager.
* @param trigger
*/
private boolean isForMemberKM(Trigger trigger) {
return isForKM(trigger, PathNodeMember.class);
}

/**
* Returns a trigger which can be understood by a knowledge manager. In particular this means that the knowledge path of the trigger (in case of
* the {@link KnowledgeChangeTrigger}) is striped of the coordinator/memeber prefix.
Expand Down Expand Up @@ -176,11 +144,12 @@ protected void registerTriggers() {
KnowledgeManagersView shadowsKM = componentInstance.getOtherKnowledgeManagersAccess();

for (Trigger trigger : ensembleController.getEnsembleDefinition().getTriggers()) {

// TODO: Here should come something which strips the change trigger knowledge path of the coord/member root

localKM.register(trigger, knowledgeManagerTriggerListener);
shadowsKM.register(trigger, shadowsTriggerListener);
if (trigger instanceof KnowledgeChangeTrigger) {
Trigger strippedTrigger = adaptTriggerForKM(trigger);

localKM.register(strippedTrigger, knowledgeManagerTriggerListener);
shadowsKM.register(strippedTrigger, shadowsTriggerListener);
}
}
}

Expand All @@ -195,10 +164,12 @@ protected void unregisterTriggers() {

for (Trigger trigger : ensembleController.getEnsembleDefinition().getTriggers()) {

// TODO: Here should come something which strips the change trigger knowledge path of the coord/member root
if (trigger instanceof KnowledgeChangeTrigger) {
Trigger strippedTrigger = adaptTriggerForKM(trigger);

localKM.unregister(trigger, knowledgeManagerTriggerListener);
shadowsKM.unregister(trigger, shadowsTriggerListener);
localKM.unregister(strippedTrigger, knowledgeManagerTriggerListener);
shadowsKM.unregister(strippedTrigger, shadowsTriggerListener);
}
}
}

Expand Down
3 changes: 0 additions & 3 deletions jdeeco-core/src/cz/cuni/mff/d3s/deeco/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ public Task(Scheduler scheduler) {
this.scheduler = scheduler;
}

// FIXME TB: Could we somehow know whether the scheduler is calling us because of the trigger or because of the period?
// In case of ensembles, we could take an advantage of this and when called because of a trigger, we wouldn't have to evaluate all potential pairs as we know
// which knowledge manager caused the trigger.
public abstract void invoke(Trigger trigger) throws TaskInvocationException;

protected abstract void registerTriggers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ public static KnowledgePath createKnowledgePath(
} else if ("<M>".equals(nodeName)) {
pathNode = factory.createPathNodeMember();
} else {
PathNodeField pathNodeField = factory.createPathNodeField();
pathNodeField.setName(nodeName);
pathNode = pathNodeField;
pathNode = createPathNodeField(nodeName);
}

knowledgePath.getNodes().add(pathNode);
Expand Down Expand Up @@ -70,5 +68,11 @@ public static PeriodicTrigger createPeriodicTrigger(long period) {

return trigger;
}


public static PathNodeField createPathNodeField(String name) {
RuntimeMetadataFactory factory = RuntimeMetadataFactory.eINSTANCE;
PathNodeField pn = factory.createPathNodeField();
pn.setName(new String(name));
return pn;
}
}
Loading

0 comments on commit 5bfbcde

Please sign in to comment.