Skip to content

Commit

Permalink
JNG-6175 transfer level stack overflow (#298)
Browse files Browse the repository at this point in the history
  • Loading branch information
noherczeg authored Feb 13, 2025
1 parent 4019318 commit 4c4c52b
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,14 @@ operation JSL!ActorDeclaration getExposedTransferObjects() : Set {
var declarations = self.members.select(m | m.isKindOf(JSL!ActorAccessDeclaration)).collect(m | m.referenceType).asSet();

var collected = new Set();
collected.addAll(declarations);

for (vd in declarations) {
collected.addAll(vd.getExposedTransferObjects());
collected.addAll(vd.getExposedTransferObjects(collected));
}

var identity = self.getIdentityTransferDeclaration();

if (identity.isDefined()) {
if (identity.isDefined() and not collected.includes(identity)) {
// Principal Transfers are not required to be present in the view graph
collected.add(identity);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,71 +8,49 @@ operation JSL!TransferDeclaration getFqName(): String {
return self.eContainer.getFqName() + "::" + self.name;
}

@cached
operation JSL!TransferDeclaration getExposedTransferObjects(): Set {
var transfers = new Set();
operation JSL!TransferDeclaration getExposedTransferObjects(transfers: Set): Set {
if (transfers.includes(self)) {
return transfers;
}

transfers.add(self);

var relations = self.getExposedRelations();
var actions = self.getAllActions();

transfers.addAll(relations.collect(r | r.referenceType));

for (relation in relations) {
transfers.addAll(relation.referenceType.getExposedTransferObjects());
//var targetCreateEvent = relation.referenceType.getCreateEventDeclaration();
//if (targetCreateEvent.isDefined() and targetCreateEvent.parameterType.isKindOf(JSL!TransferDeclaration)) {
// transfers.add(targetCreateEvent.parameterType);
//}
if (not transfers.includes(relation.referenceType)) {
transfers.addAll(relation.referenceType.getExposedTransferObjects(transfers));
}
}

for (action in actions) {
transfers.addAll(action.errors);
if (action.parameterType.isDefined()) {
for (error in action.errors) {
if (not transfers.includes(error)) {
transfers.add(error);
}
}
if (action.parameterType.isDefined() and not transfers.includes(action.parameterType)) {
transfers.add(action.parameterType);
}
if (action.`return`.isDefined()) {
if (action.`return`.isDefined() and not transfers.includes(action.`return`)) {
transfers.add(action.`return`);
}
}

return transfers;
}

/*
@cached
operation JSL!TransferDeclaration getReferencingCreateEvent(): JSL!TransferCreateDeclaration {
return JSL!TransferCreateDeclaration.all.selectOne(s | s.parameterType == self);
}

@cached
operation JSL!TransferDeclaration isCreateEventParameter(): Boolean {
return self.getReferencingCreateEvent().isDefined();
}
*/

@cached
operation JSL!TransferDeclaration getExposedRelations(): Set {
return self.collectExposedRelations(new Set());
}

operation JSL!TransferDeclaration collectExposedRelations(collected: Set): Set {
var relations = self.getAllRelations();
// var operations = self.getAllOperations().select(op | not op.hasQueryParameters());
/*relations.addAll(operations
.select(o | o.input.isDefined())
.collect(o | o.input.target)
.collect(i | i.getAllRelations().select(r | not r.isQuery)).flatten());
relations.addAll(operations
.select(o | o.output.isDefined())
.collect(o | o.output.target)
.collect(o | o.getAllRelations().select(r | not r.isQuery)).flatten());
*/
var relations = self.members.select(m | m.isKindOf(JSL!TransferRelationDeclaration));
for (relation in relations) {
if ((not collected.includes(relation)) and relation.referenceType.isKindOf(JSL!TransferDeclaration)) {
collected.add(relation);
relation.referenceType.collectExposedRelations(collected);
}
collected.addAll(relation.collectExposedRelations(collected));
}

return collected;
}

Expand All @@ -81,35 +59,6 @@ operation JSL!TransferDeclaration getAllActions(): Set {
return self.members.select(m | m.isKindOf(JSL!TransferActionDeclaration));
}

@cached
operation JSL!TransferDeclaration getAllRelations(): Set {
var relations = new Set();
var ownRelations = self.members.select(m | m.isKindOf(JSL!TransferRelationDeclaration));
relations.addAll(ownRelations);
/*
if (self.isKindOf(JSL!ActorDeclaration)) {
var linkRelations = self.getAllMenuDeclarations();
relations.addAll(linkRelations);

for (ref in linkRelations) {
if (ref.referenceType.isKindOf(JSL!TransferDeclaration)) {
relations.addAll(ref.referenceType.getAllRelations());
}
}
}

for (member in self.members.select(m | m.isKindOf(JSL!UIViewPanelDeclaration))) {
relations.addAll(member.getAllRelations());
}
*/
// also add relations of relations to complete the trees
for (member in ownRelations) {
relations.addAll(member.referenceType.getAllRelations());
}

return relations;
}

@cached
operation JSL!TransferDeclaration getDirectRelations(): Set {
var relations = new Set();
Expand Down Expand Up @@ -186,30 +135,8 @@ operation JSL!TransferDeclaration isRefreshSupported(): Boolean {

@cached
operation JSL!TransferDeclaration isGenerated() : Boolean {
return actorDeclaration.getExposedTransferObjects().includes(self);
}

/*
@cached
operation JSL!TransferDeclaration getCreateEventDeclaration() : JSL!TransferCreateDeclaration {
return self.members.selectOne(m | m.isKindOf(JSL!TransferCreateDeclaration));
}

@cached
operation JSL!TransferDeclaration getFetchEventDeclaration() : JSL!TransferFetchDeclaration {
return self.members.selectOne(m | m.isKindOf(JSL!TransferFetchDeclaration));
}

@cached
operation JSL!TransferDeclaration getUpdateEventDeclaration() : JSL!TransferUpdateDeclaration {
return self.members.selectOne(m | m.isKindOf(JSL!TransferUpdateDeclaration));
}

@cached
operation JSL!TransferDeclaration getDeleteEventDeclaration() : JSL!TransferDeleteDeclaration {
return self.members.selectOne(m | m.isKindOf(JSL!TransferDeleteDeclaration));
return actorDeclaration.getExposedTransferObjects(new Set()).includes(self);
}
*/

@cached
operation JSL!TransferDeclaration hasSortableField(): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,18 @@ operation JSL!TransferRelationDeclaration getContainerEquivalentClassType(): UI!
}
return null;
}

operation JSL!TransferRelationDeclaration collectExposedRelations(collected: Set): Set {
if (collected.includes(self)) {
return collected;
}
collected.add(self);

if (self.referenceType.isDefined() and self.referenceType.isKindOf(JSL!TransferDeclaration)) {
for (nested in self.referenceType.members.select(m | m.isKindOf(JSL!TransferRelationDeclaration))) {
collected.addAll(nested.collectExposedRelations(collected));
}
}

return collected;
}
Original file line number Diff line number Diff line change
Expand Up @@ -488,9 +488,7 @@ menu ActorApp(Actor usr) {

}


@Test
@Disabled("https://blackbelt.atlassian.net/browse/JNG-6175")
void testMenuStackOverFlow() throws Exception {
jslModel = JslParser.getModelFromStrings("StackOverFlowTestModel", List.of("""
model StackOverFlowTestModel;
Expand Down Expand Up @@ -540,7 +538,7 @@ transfer CTransfer(C c) {
}
transfer DTransfer(D d) {
relation CTransfer c <= d.c create:true delete:true update:true; // if this relation is commented the recursion is gone
relation CTransfer c <= d.c create:true delete:true update:true;
event create createOn;
event update updateOn;
Expand Down

0 comments on commit 4c4c52b

Please sign in to comment.