From 53142b3e497e73653b393d33132d6601a63bd636 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Tue, 24 Oct 2023 21:42:43 +0200 Subject: [PATCH 01/17] + added execution feature --- .../.project | 23 ++ .../build.properties | 1 + .../feature.xml | 318 ++++++++++++++++++ .../pom.xml | 18 + 4 files changed, 360 insertions(+) create mode 100644 features/org.etsi.mts.tdl.execution.feature/.project create mode 100644 features/org.etsi.mts.tdl.execution.feature/build.properties create mode 100644 features/org.etsi.mts.tdl.execution.feature/feature.xml create mode 100644 features/org.etsi.mts.tdl.execution.feature/pom.xml diff --git a/features/org.etsi.mts.tdl.execution.feature/.project b/features/org.etsi.mts.tdl.execution.feature/.project new file mode 100644 index 00000000..64a248ec --- /dev/null +++ b/features/org.etsi.mts.tdl.execution.feature/.project @@ -0,0 +1,23 @@ + + + org.etsi.mts.tdl.execution.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.pde.FeatureNature + + diff --git a/features/org.etsi.mts.tdl.execution.feature/build.properties b/features/org.etsi.mts.tdl.execution.feature/build.properties new file mode 100644 index 00000000..64f93a9f --- /dev/null +++ b/features/org.etsi.mts.tdl.execution.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/org.etsi.mts.tdl.execution.feature/feature.xml b/features/org.etsi.mts.tdl.execution.feature/feature.xml new file mode 100644 index 00000000..cc7ae338 --- /dev/null +++ b/features/org.etsi.mts.tdl.execution.feature/feature.xml @@ -0,0 +1,318 @@ + + + + + Provides TDL execution capabilities via JUnit code generation (prototype). + + + + Eclipse Public License - v 1.0 +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS +ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION +OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. +1. DEFINITIONS +"Contribution" means: +a) in the case of the initial Contributor, the initial code and +documentation +distributed under this Agreement, and +b) in the case of each subsequent Contributor: +i) changes to the Program, and +ii) additions to the Program; +where such changes and/or additions to the Program originate +from and are +distributed by that particular Contributor. A Contribution 'originates' +from a Contributor if it was added to the Program by such Contributor +itself or anyone acting on such Contributor's behalf. Contributions +do not +include additions to the Program which: (i) are separate modules +of +software distributed in conjunction with the Program under their +own +license agreement, and (ii) are not derivative works of the Program. +"Contributor" means any person or entity that distributes the +Program. +"Licensed Patents" mean patent claims licensable by a Contributor +which are +necessarily infringed by the use or sale of its Contribution +alone or when +combined with the Program. +"Program" means the Contributions distributed in accordance with +this +Agreement. +"Recipient" means anyone who receives the Program under this +Agreement, +including all Contributors. +2. GRANT OF RIGHTS +a) Subject to the terms of this Agreement, each Contributor hereby +grants +Recipient a non-exclusive, worldwide, royalty-free copyright +license to +reproduce, prepare derivative works of, publicly display, publicly +perform, distribute and sublicense the Contribution of such Contributor, +if any, and such derivative works, in source code and object +code form. +b) Subject to the terms of this Agreement, each Contributor hereby +grants +Recipient a non-exclusive, worldwide, royalty-free patent license +under +Licensed Patents to make, use, sell, offer to sell, import and +otherwise +transfer the Contribution of such Contributor, if any, in source +code and +object code form. This patent license shall apply to the combination +of +the Contribution and the Program if, at the time the Contribution +is +added by the Contributor, such addition of the Contribution causes +such +combination to be covered by the Licensed Patents. The patent +license +shall not apply to any other combinations which include the Contribution. +No hardware per se is licensed hereunder. +c) Recipient understands that although each Contributor grants +the licenses +to its Contributions set forth herein, no assurances are provided +by any +Contributor that the Program does not infringe the patent or +other +intellectual property rights of any other entity. Each Contributor +disclaims any liability to Recipient for claims brought by any +other +entity based on infringement of intellectual property rights +or +otherwise. As a condition to exercising the rights and licenses +granted +hereunder, each Recipient hereby assumes sole responsibility +to secure +any other intellectual property rights needed, if any. For example, +if a +third party patent license is required to allow Recipient to +distribute +the Program, it is Recipient's responsibility to acquire that +license +before distributing the Program. +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright +license set forth in this Agreement. +3. REQUIREMENTS +A Contributor may choose to distribute the Program in object +code form under +its own license agreement, provided that: +a) it complies with the terms and conditions of this Agreement; +and +b) its license agreement: +i) effectively disclaims on behalf of all Contributors all warranties +and conditions, express and implied, including warranties or +conditions of title and non-infringement, and implied warranties +or +conditions of merchantability and fitness for a particular purpose; +ii) effectively excludes on behalf of all Contributors all liability +for +damages, including direct, indirect, special, incidental and +consequential damages, such as lost profits; +iii) states that any provisions which differ from this Agreement +are +offered by that Contributor alone and not by any other party; +and +iv) states that source code for the Program is available from +such +Contributor, and informs licensees how to obtain it in a reasonable +manner on or through a medium customarily used for software exchange. +When the Program is made available in source code form: +a) it must be made available under this Agreement; and +b) a copy of this Agreement must be included with each copy of +the Program. +Contributors may not remove or alter any copyright notices contained +within the Program. +Each Contributor must identify itself as the originator of its +Contribution, +if +any, in a manner that reasonably allows subsequent Recipients +to identify the +originator of the Contribution. +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain responsibilities +with +respect to end users, business partners and the like. While this +license is +intended to facilitate the commercial use of the Program, the +Contributor who +includes the Program in a commercial product offering should +do so in a manner +which does not create potential liability for other Contributors. +Therefore, +if a Contributor includes the Program in a commercial product +offering, such +Contributor ("Commercial Contributor") hereby agrees to defend +and indemnify +every other Contributor ("Indemnified Contributor") against any +losses, +damages and costs (collectively "Losses") arising from claims, +lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of +such Commercial +Contributor in connection with its distribution of the Program +in a commercial +product offering. The obligations in this section do not apply +to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor +must: +a) promptly notify the Commercial Contributor in writing of such +claim, and +b) allow the Commercial Contributor to control, and cooperate +with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in +any such claim at +its own expense. +For example, a Contributor might include the Program in a commercial +product +offering, Product X. That Contributor is then a Commercial Contributor. +If +that Commercial Contributor then makes performance claims, or +offers +warranties related to Product X, those performance claims and +warranties are +such Commercial Contributor's responsibility alone. Under this +section, the +Commercial Contributor would have to defend claims against the +other +Contributors related to those performance claims and warranties, +and if a +court requires any other Contributor to pay any damages as a +result, the +Commercial Contributor must pay those damages. +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM +IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS +OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each +Recipient is solely responsible for determining the appropriateness +of using +and distributing the Program and assumes all risks associated +with its +exercise of rights under this Agreement , including but not limited +to the +risks and costs of program errors, compliance with applicable +laws, damage to +or loss of data, programs or equipment, and unavailability or +interruption of +operations. +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT +LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM +OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF +THE POSSIBILITY +OF SUCH DAMAGES. +7. GENERAL +If any provision of this Agreement is invalid or unenforceable +under +applicable law, it shall not affect the validity or enforceability +of the +remainder of the terms of this Agreement, and without further +action by the +parties hereto, such provision shall be reformed to the minimum +extent +necessary to make such provision valid and enforceable. +If Recipient institutes patent litigation against any entity +(including a +cross-claim or counterclaim in a lawsuit) alleging that the Program +itself +(excluding combinations of the Program with other software or +hardware) +infringes such Recipient's patent(s), then such Recipient's rights +granted +under Section 2(b) shall terminate as of the date such litigation +is filed. +All Recipient's rights under this Agreement shall terminate if +it fails to +comply with any of the material terms or conditions of this Agreement +and does +not cure such failure in a reasonable period of time after becoming +aware of +such noncompliance. If all Recipient's rights under this Agreement +terminate, +Recipient agrees to cease use and distribution of the Program +as soon as +reasonably practicable. However, Recipient's obligations under +this Agreement +and any licenses granted by Recipient relating to the Program +shall continue +and survive. +Everyone is permitted to copy and distribute copies of this Agreement, +but in +order to avoid inconsistency the Agreement is copyrighted and +may only be +modified in the following manner. The Agreement Steward reserves +the right to +publish new versions (including revisions) of this Agreement +from time to +time. No one other than the Agreement Steward has the right to +modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. +The +Eclipse Foundation may assign the responsibility to serve as +the Agreement +Steward to a suitable separate entity. Each new version of the +Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version +of the +Agreement under which it was received. In addition, after a new +version of the +Agreement is published, Contributor may elect to distribute the +Program +(including its Contributions) under the new version. Except as +expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or +licenses to the intellectual property of any Contributor under +this Agreement, +whether expressly, by implication, estoppel or otherwise. All +rights in the +Program not expressly granted under this Agreement are reserved. +This Agreement is governed by the laws of the State of New York +and the +intellectual property laws of the United States of America. No +party to this +Agreement will bring a legal action under this Agreement more +than one year +after the cause of action arose. Each party waives its rights +to a jury trial in +any resulting litigation. + + + + + + + + + diff --git a/features/org.etsi.mts.tdl.execution.feature/pom.xml b/features/org.etsi.mts.tdl.execution.feature/pom.xml new file mode 100644 index 00000000..b3bf16ce --- /dev/null +++ b/features/org.etsi.mts.tdl.execution.feature/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + + org.etsi.mts.tdl + org.etsi.mts.tdl.parent + 1.0.0-SNAPSHOT + ../../org.etsi.mts.tdl.parent + + + + org.etsi.mts.tdl.execution.feature + eclipse-feature + + TDL Execution Support Feature + \ No newline at end of file -- GitLab From 516566680e9fde316c815b18cb25d653947f7d53 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Tue, 24 Oct 2023 21:44:38 +0200 Subject: [PATCH 02/17] + ttcn3 generation fixes for enums, dataelementuse, and others + debugging operation --- .../epsilon/ttcn3/debug.eol | 11 + .../epsilon/ttcn3/reusable.eol | 325 ++++++++++++------ .../epsilon/ttcn3/ttcn3mapping.etl | 22 +- 3 files changed, 242 insertions(+), 116 deletions(-) diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/debug.eol b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/debug.eol index 7d708f94..6d5e55b8 100644 --- a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/debug.eol +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/debug.eol @@ -9,6 +9,17 @@ operation Any debugAnnotations() : Boolean { (" Comments: "+self.comment).println(); return true; } +operation Any debugElement(prefix : String) { + var pattern = ".+\\.(.+)Impl.+(\\(?)"; + (prefix+self.toString().replaceAll(pattern, "$1 $2")).println(); + for (c in self.eContents()) { + c.debugElement(prefix+" "); + } + for (c in self.eCrossReferences()) { + (prefix+"->"+c.toString().replaceAll(pattern, "$1 $2")).println(); + //c.debugElement(prefix+" "); + } +} operation Any debugTimeConstraintVariables() : Boolean { var expressionConstraint = diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/reusable.eol b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/reusable.eol index 5ddd1a6e..0dd65491 100644 --- a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/reusable.eol +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/reusable.eol @@ -84,82 +84,80 @@ operation String getStringValue() : TTCN!Value { return v; } +operation TDL!DataUse getDataInstance() : TDL!DataInstance { + if (self.isKindOf(TDL!DataInstanceUse)) { + return self.dataInstance; + } else if (self.isKindOf(TDL!DataElementUse) and self.dataElement.isKindOf(TDL!DataInstance)) { + return self.dataElement; + } else { + (" TODO: "+self.~rule+" : Not Implemented Yet : "+self.type).log(1); + return null; + } +} + operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody { + ("transformSingleMemberAssignment: "+self.name+"::"+m.name).log(1); var body = new TTCN!TemplateBody(); - if (mad.isDefined() and mad.isKindOf(TDL!DataInstanceUse)) { - if (mad.dataInstance.isDefined() and mad.argument.isEmpty()) { - body.simple = new TTCN!SimpleSpec(); - body.simple.expr = new TTCN!Value(); - body.simple.expr.ref = new TTCN!ReferencedValue(); - body.simple.expr.ref.head = new TTCN!Head(); - - //Template ->target = BaseTemplate reference - //Constant ->target = SingleConstDef reference - var e = mad.dataInstance.equivalent(); - if (e.isKindOf(TTCN!TemplateDef)) { - body.simple.expr.ref.head.target = e.base; - } else if (e.isKindOf(TTCN!ConstDef)) { - body.simple.expr.ref.head.target = e.defs.list.get(0); - } else { - //what else can it be? - } - - //reduction - //use extended field references - var useEFR = mad.reduction.exists(mr|mr.collectionIndex.isDefined()); - - if (useEFR) { - for (mr in mad.reduction) { - if (mr.member.isDefined()) { - var efr = new TTCN!ExtendedFieldReference(); - efr.field = mr.member.equivalent(); - - body.simple.expr.ref.fields.add(efr); - } - if (mr.collectionIndex.isDefined() - and mr.collectionIndex.dataInstance.isDefined()) { - var efr = new TTCN!ExtendedFieldReference(); - efr.array = new TTCN!Value(); - efr.array.ref = new TTCN!ReferencedValue(); - efr.array.ref.head = new TTCN!Head(); - - var ci = mr.collectionIndex.dataInstance.equivalent(); - if (ci.isKindOf(TTCN!TemplateDef)) { - efr.array.ref.head.target = ci.base; - } else if (ci.isKindOf(TTCN!ConstDef)) { - efr.array.ref.head.target = ci.defs.list.get(0); - } else { - //what else can it be? - } - - body.simple.expr.ref.fields.add(efr); - } - } - } else { - var t = body.simple.expr.ref.head; - for (mr in mad.reduction) { - if (mr.member.isDefined()) { - t.tail = new TTCN!RefValueTail(); - t.tail.value = mr.member.equivalent(); - - } - t = t.tail; - } - } - + if (mad.isDefined()) { + var di = mad.getDataInstance(); + if (di.isDefined()) { + //TODO: add support for DataElementUse + if (mad.argument.isEmpty()) { + var e = di.equivalent(); + body.simple = new TTCN!SimpleSpec(); + body.simple.expr = new TTCN!Value(); + body.simple.expr.ref = e.getReferencedValue(); + + //reduction + //use extended field references + var useEFR = mad.reduction.exists(mr|mr.collectionIndex.isDefined()); + + if (useEFR) { + for (mr in mad.reduction) { + if (mr.member.isDefined()) { + var efr = new TTCN!ExtendedFieldReference(); + efr.field = mr.member.equivalent(); + body.simple.expr.ref.fields.add(efr); + } + if (mr.collectionIndex.isDefined() + and mr.collectionIndex.getDataInstance().isDefined()) { + var ci = mr.collectionIndex.getDataInstance().equivalent(); + var efr = new TTCN!ExtendedFieldReference(); + efr.array = new TTCN!Value(); + efr.array.ref = ci.getReferencedValue(); + body.simple.expr.ref.fields.add(efr); + } + } + } else { + var t = body.simple.expr.ref.head; + for (mr in mad.reduction) { + if (mr.member.isDefined()) { + t.tail = new TTCN!RefValueTail(); + t.tail.value = mr.member.equivalent(); + + } + t = t.tail; + } + } + + } else { + //nested anonymous definitions + //or overriding + (" : TODO: "+mad.item).log(1); + if (mad.item.isDefined()) { + body = self.transformDefaultMatchingSymbol(m, mad); + } else { + body.field = mad.transformWildcardMemberAssignment(); + } + } } else { - //nested anonymous definitions - //or overriding - (" : "+mad.item).log(1); - if (mad.item.isDefined()) { - body = self.transformDefaultMatchingSymbol(m, mad); - } else { - body.field = mad.transformWildcardMemberAssignment(); - } + body = self.transformDefaultMatchingSymbol(m, mad); } } else { body = self.transformDefaultMatchingSymbol(m, mad); } + self.debugElement("Self: "); + body.debugElement("Body: "); return body; } @@ -218,42 +216,82 @@ operation TDL!Member getFieldDef(type:TDL!StructuredDataType) : TTCN!StructField } } +operation Any getReferencedValue() : TTCN!ReferencedValue { + var v = new TTCN!ReferencedValue(); + v.head = new TTCN!Head(); + + //Template ->target = BaseTemplate reference + //Constant ->target = SingleConstDef reference + if (self.isKindOf(TTCN!TemplateDef)) { + v.head.target = self.base; + } else if (self.isKindOf(TTCN!ConstDef)) { + v.head.target = self.defs.list.get(0); + } else if (self.isKindOf(TTCN!Enumeration)) { + v.head.target = self; + } else { + (" TODO: Not implemented yet: getReferencedValue for"+self).log(1); + //what else can it be? + } + return v; +} + //TODO: deprecated? -> not at present operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!CompoundExpression { var expr; - ("transformMemberAssignment: "+self.name).println(); + ("transformMemberAssignment: "+self.name).log(1); if (not self.memberAssignment.isEmpty()) { expr = new TTCN!FieldExpressionList(); for (ma in self.memberAssignment) { var fes = new TTCN!FieldExpressionSpec(); //fes.fieldRef = ma.member.equivalent(); fes.fieldRef = ma.member.getFieldDef(self.dataType); - (" "+ma.member.name+"->"+fes.fieldRef.eContainer().eContainer().name).println(); + (" "+ma.member.name+"->"+fes.fieldRef.eContainer().eContainer().name).log(1); //ma.memberSpec fes.expr = new TTCN!Value(); - if (ma.memberSpec.isKindOf(TDL!DataInstanceUse) - and ma.memberSpec.dataInstance.isDefined()) { - fes.expr.ref = new TTCN!ReferencedValue(); - fes.expr.ref.head = new TTCN!Head(); - - //Template ->target = BaseTemplate reference - //Constant ->target = SingleConstDef reference - var e = ma.memberSpec.dataInstance.equivalent(); - if (e.isKindOf(TTCN!TemplateDef)) { - fes.expr.ref.head.target = e.base; - } else if (e.isKindOf(TTCN!ConstDef)) { - fes.expr.ref.head.target = e.defs.list.get(0); + //TODO: other data uses? + var di = ma.memberSpec.getDataInstance(); + if (di.isDefined()) { + (di).println(); + var e = di.equivalent(); + e.println(); + + if (e.isUndefined()) { + if (di.dataType.name = "Boolean") { + fes.expr.predef = new TTCN!PredefinedValue(); + fes.expr.predef.boolean = di.name.toString().toLower(); + } } else { - //what else can it be? + fes.expr.ref = e.getReferencedValue(); } //TODO: handle overriding parameters? + } else if (ma.memberSpec.isKindOf(TDL!LiteralValueUse)) { + //TODO: extract + fes.expr.predef = new TTCN!PredefinedValue(); + if (ma.memberSpec.intValue.isDefined()) { + fes.expr.predef.integer = ma.memberSpec.intValue.toString(); + } else if (ma.memberSpec.boolValue.isDefined()) { + fes.expr.predef.boolean = ma.memberSpec.boolValue.toString(); + } else { + fes.expr.predef.charString = "\""+ma.memberSpec.value+"\""; + } + } else if (ma.memberSpec.isKindOf(TDL!SpecialValueUse)) { + fes.expr.predef = new TTCN!PredefinedValue(); + if (ma.memberSpec.isKindOf(TDL!OmitValue)) { + fes.expr.predef.omit = "omit"; + } else if (ma.memberSpec.isKindOf(TDL!AnyValue)) { + fes.expr.predef.charString = "TODO: ? (AnyValue)"; + } else if (ma.memberSpec.isKindOf(TDL!AnyValueOrOmit)) { + fes.expr.predef.charString = "TODO: * (AnyValueOrOmit)"; + } + } else { //TODO: handle DataElementUse, others fes.expr.predef = new TTCN!PredefinedValue(); fes.expr.predef.charString = "\"TODO: Not Implemented Yet\""; + (" NOT IMPLEMENTED YET: "+ma.memberSpec).log(1); + } - expr.specs.add(fes); } //TODO: handle unassigned members? -> add guards to corresponding rule @@ -267,6 +305,7 @@ operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!Compound (" TODO: "+self.~rule+" : What is going on here: "+self).log(1); expr = new TTCN!ArrayExpression(); } + expr.debugElement("Expr:"); return expr; } @@ -276,6 +315,7 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec //unassignedMember? //argument -> ParameterBinding (parameter:Member, dataUse:DataUse) //reduction? -> MemberReference + ("transformWildcardMemberAssignment: "+self.name).log(1); var field = new TTCN!FieldSpecList(); var t; if (self.dataInstance.isDefined()) { @@ -306,6 +346,7 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec var ma = self.argument.selectOne(a|a.parameter = m); //default: no wildcard, defined //in case not defined, check for inherited + ma.println(); if (ma.isDefined()) { mad = ma.dataUse; } else if (ma.isUndefined() @@ -326,20 +367,37 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec return field; } +//operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList { +// ("transformWildcardMemberAssignment: "+self.name).log(1); +// var field = new TTCN!FieldSpecList(); +// for (m in self.dataType.allMembers()) { //TODO: why all? why not only assigned? +//// for (ma in self.memberAssignment) { +// var fs = new TTCN!FieldSpec(); +// fs.ref = m.equivalent(); +// +// var ma = self.memberAssignment.selectOne(ma|ma.member = m); +// var mad; +// if (ma.isDefined()) { +// mad = ma.memberSpec; +// } +// +// fs.body = new TTCN!TemplateBody(); +// fs.body = self.transformSingleMemberAssignment(m, mad); +// field.spec.add(fs); +// } +// return field; +//} + +//TODO: reactivate or differentiate above operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList { + ("transformWildcardMemberAssignmentX: "+self.name).log(1); var field = new TTCN!FieldSpecList(); - for (m in self.dataType.allMembers()) { + for (ma in self.memberAssignment) { var fs = new TTCN!FieldSpec(); - fs.ref = m.equivalent(); - - var ma = self.memberAssignment.selectOne(ma|ma.member = m); - var mad; - if (ma.isDefined()) { - mad = ma.memberSpec; - } + fs.ref = ma.member.equivalent(); fs.body = new TTCN!TemplateBody(); - fs.body = self.transformSingleMemberAssignment(m, mad); + fs.body = self.transformSingleMemberAssignment(ma.member, ma.memberSpec); field.spec.add(fs); } return field; @@ -560,6 +618,64 @@ operation TDL!DataInstanceUse getTemplateBody() : TTCN!TemplateBody { return self.getTemplateBody(false); } +operation TDL!DataElementUse getTemplateBody() : TTCN!TemplateBody { + return self.getTemplateBody(false); +} + +//TODO: refactor, copied from below +operation TDL!DataElementUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody { + var tb = new TTCN!TemplateBody(); + tb.simple = new TTCN!SimpleSpec(); + tb.simple.expr = new TTCN!Value(); + if (useDataMapping) { + var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self.dataElement).first(); //TODO: extract parameter + tb.simple.expr.predef = new TTCN!PredefinedValue(); + if (mapping.isDefined()) { + //t.ref = new TTCN!TypeReference(); + //TODO: check if defined + //t.ref.head = mapping.elementURI; + tb.simple.expr.predef.charString = mapping.elementURI.replaceAll("\"",""); + } else { + tb.simple.expr.predef.charString = "MAP_"+self.dataInstance.name; + } + } else { + if (self.dataElement.isDefined() and self.dataElement.isKindOf(TDL!DataInstance)) { + tb.simple.expr.ref = new TTCN!ReferencedValue(); + tb.simple.expr.ref.head = new TTCN!Head(); + tb.simple.expr.ref.head.target = self.dataElement.equivalent().base; + } else if (self.dataElement.isDefined() and self.dataElement.isKindOf(TDL!DataType)) { //TODO:differentiate structured vs simple vs collection + if (flat) { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + tb.simple.expr.predef = new TTCN!PredefinedValue(); + tb.simple.expr.predef.charString = "\"TODO_INLINE_DATA_ELEMENT_FOR_"+self.dataElement.name+"\""; + } else if (self.argument.isEmpty()) { + //TODO: make sure type is present + tb.simple.expr = new TTCN!ArrayExpression(); + } else { + tb.simple=null; + tb.~type = self.dataElement.getTTCNType(); + tb.field = new TTCN!FieldSpecList(); + + for (a in self.argument) { + var fs = new TTCN!FieldSpec(); + fs.ref = a.parameter.equivalent(); + fs.body = a.dataUse.getTemplateBody(true); //TODO: expand? + tb.field.spec.add(fs); + } + } + + } else if (self.item.isDefined()) { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + tb.simple.expr.predef = new TTCN!PredefinedValue(); + tb.simple.expr.predef.charString = "\"TODO_INLINE_COLLECTION\""; + } else { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + } + } + return tb; + +} + operation TDL!DataInstanceUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody { var tb = new TTCN!TemplateBody(); tb.simple = new TTCN!SimpleSpec(); @@ -673,24 +789,15 @@ operation String getVerdictStatement() : TTCN!FunctionStatement { } operation TDL!DataUse getVerdictStatement() : TTCN!FunctionStatement { - var sfs = new TTCN!FunctionStatement(); - sfs.verdict = new TTCN!SetLocalVerdict(); - sfs.verdict.expression = new TTCN!Value(); + var verdictName = "pass"; //TODO: more reasonable default? //TODO: handle corresponding verdict properly if (self.isKindOf(TDL!DataInstanceUse)) { - sfs.verdict.expression.predef = new TTCN!PredefinedValue(); - if (self.dataInstance.name = "pass") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass; - } else if (self.dataInstance.name = "fail") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail; - } else if (self.dataInstance.name = "inconclusive") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc; - } else { - //TODO - } + verdictName = self.dataInstance.name; + } else if (self.isKindOf(TDL!DataElementUse)) { //TODO: check that it is a dataInstance of type Verdict? + verdictName = self.dataElement.name; } else { //TODO - } - return sfs; + } + return verdictName.getVerdictStatement(); } diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/ttcn3mapping.etl b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/ttcn3mapping.etl index 3670f4fb..82743e50 100644 --- a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/ttcn3mapping.etl +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3/ttcn3mapping.etl @@ -236,11 +236,17 @@ rule EnumDT2E t.structured.enumDef = e; e.list = new TTCN!EnumerationList(); - for (v in dt.value) { - var literal = new TTCN!Enumeration(); - literal.name = v.TTCNname(); - e.list.enums.add(literal); - } +} + +rule EnumInstance2E + transform di : TDL!SimpleDataInstance + to e : TTCN!Enumeration { + guard : not useDataMapping and di.eContainer.isKindOf(TDL!EnumDataType) + + e.name = di.TTCNname(); + + var ep = di.dataType.equivalent(); + ep.list.enums.add(e); } @@ -828,6 +834,8 @@ rule StructuredDI2TD di.~rule = self; + (di.name).log(1); + var md = new TTCN!ModuleDefinition(); md.def = td; var m = di.eContainer.equivalent(); @@ -862,11 +870,11 @@ rule StructuredDI2TD // or ma.memberSpec.isKindOf(TDL!AnyValueOrOmit))).log(1); tb.field = di.transformWildcardMemberAssignment(); } else { - ("Simple: "+di.name).log(1); + ("Structure -> Simple: "+di.name).log(1); tb.simple = new TTCN!SimpleSpec(); tb.simple.expr = di.transformMemberAssignment(); } - + } rule StructuredDI2C -- GitLab From 07fd6648dad6712bf4dbf81fe4186aef70d4d14c Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Tue, 24 Oct 2023 19:48:42 +0000 Subject: [PATCH 03/17] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 58b1520e..d7300c27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -77,6 +77,7 @@ variables: - if: $CI_PIPELINE_SOURCE == "schedule" when: never - if: $CI_COMMIT_BRANCH == $CI_TARGET_BRANCH + - if: $CI_COMMIT_BRANCH == $DEV_CI_TARGET_BRANCH - if: $CI_PIPELINE_SOURCE == "web" when: always - if: $CI_COMMIT_TAG -- GitLab From 8c729fd6c9499ef7883ea91a9247d9d5a9d66637 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Wed, 25 Oct 2023 12:47:25 +0000 Subject: [PATCH 04/17] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d7300c27..21e24de0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ variables: TTF_CI_TARGET_BRANCH: "ttf-034" DEV_CI_TARGET_BRANCH: "dev" MAIN_CI_TARGET_BRANCH: "master" - CI_TARGET_BRANCH: ${DEV_CI_TARGET_BRANCH} + CI_TARGET_BRANCH: ${TTF_CI_TARGET_BRANCH} SITE_LOCATION: "updatesite/org.etsi.mts.tdl.updatesite/target" ARCHIVE_NAME: "org.etsi.mts.tdl.updatesite-1.0.0-SNAPSHOT.zip" SITE_ARCHIVE: "${SITE_LOCATION}/${ARCHIVE_NAME}" @@ -43,7 +43,7 @@ variables: PACKAGE_NAME_MAIN: "TOP IDE Build" BETA_KEY: "beta" MAIN_KEY: "stable" - RELEASE_KEY: "stable" + RELEASE_KEY: "beta" RELEASE_PATH: "public/updatesite/${RELEASE_KEY}" RELEASE_PAGE: "https://top.etsi.org/ide/updatesite/${RELEASE_KEY}" STANDALONE_LOCATION: "plugins/org.etsi.mts.tdl.standalone/target" -- GitLab From 652d89e7479205d1046c3f0f23a53386fd7bc4f4 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:01:10 +0100 Subject: [PATCH 05/17] + maintain separate release channels through archives --- .gitlab-ci.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 21e24de0..d511ed59 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -228,21 +228,22 @@ pages: - job: build-job artifacts: true script: - # Get the previous GitLab Pages content - # - set +e - # - curl --fail "$CI_PAGES_URL/content.zip" -o "content.zip" - # - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi - # - set -e + # Get the previous GitLab Pages content (otherwise other beta/stable branch gets removed..) + - set +e + - curl --fail "$CI_PAGES_URL/content.zip" -o "content.zip" + - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi + - set -e + - ls -la $RELEASE_PATH + # Cleanup content? # Add/update content - # TODO: differentiate on branch? - echo $CI_PAGES_URL - echo $RELEASE_PATH - mkdir -p $RELEASE_PATH - cp -r -f $SITE_PATH/* $RELEASE_PATH - ls -la $RELEASE_PATH # Zip the content and publish the zip again - # - zip -r "content.zip" "public" - # - mv "content.zip" "public/" + - zip -r "content.zip" "public" + - mv "content.zip" "public/" # - mv $SITE_ARCHIVE $RELEASE_PATH/content.zip artifacts: paths: -- GitLab From f518c73713f3b5c0e5aa384bb270532c91b82066 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:03:41 +0100 Subject: [PATCH 06/17] * CI script fixes --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d511ed59..9eb15aff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ variables: TTF_CI_TARGET_BRANCH: "ttf-034" DEV_CI_TARGET_BRANCH: "dev" MAIN_CI_TARGET_BRANCH: "master" - CI_TARGET_BRANCH: ${TTF_CI_TARGET_BRANCH} + CI_TARGET_BRANCH: "${TTF_CI_TARGET_BRANCH}" SITE_LOCATION: "updatesite/org.etsi.mts.tdl.updatesite/target" ARCHIVE_NAME: "org.etsi.mts.tdl.updatesite-1.0.0-SNAPSHOT.zip" SITE_ARCHIVE: "${SITE_LOCATION}/${ARCHIVE_NAME}" -- GitLab From 969eef0c22369daab27d52d639b957175853959e Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:17:23 +0100 Subject: [PATCH 07/17] * trigger CI? --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9eb15aff..cebcbeec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -234,7 +234,7 @@ pages: - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi - set -e - ls -la $RELEASE_PATH - # Cleanup content? + # Cleanup content? -> remove content in release path? # Add/update content - echo $CI_PAGES_URL - echo $RELEASE_PATH -- GitLab From ac2e12954ee63f092304d624d6b08ed1b88d7814 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:30:51 +0100 Subject: [PATCH 08/17] + added missing gitignore --- plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore diff --git a/plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore b/plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore new file mode 100644 index 00000000..78d91016 --- /dev/null +++ b/plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore @@ -0,0 +1,2 @@ +/* +!.gitignore -- GitLab From 7c0ec4c76a83a5a5ddd747b54bd84cb07feeefd6 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:39:00 +0100 Subject: [PATCH 09/17] + added missing gitignore --- .../{xtext-gen => xtend-gen}/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/org.etsi.mts.tdl.TPLan2.ide/{xtext-gen => xtend-gen}/.gitignore (100%) diff --git a/plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore b/plugins/org.etsi.mts.tdl.TPLan2.ide/xtend-gen/.gitignore similarity index 100% rename from plugins/org.etsi.mts.tdl.TPLan2.ide/xtext-gen/.gitignore rename to plugins/org.etsi.mts.tdl.TPLan2.ide/xtend-gen/.gitignore -- GitLab From 635e00c122ba6cf7815f8ead400d4a83b8f7c10b Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 16:47:12 +0100 Subject: [PATCH 10/17] * fix CI --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cebcbeec..b10a5941 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -233,7 +233,7 @@ pages: - curl --fail "$CI_PAGES_URL/content.zip" -o "content.zip" - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi - set -e - - ls -la $RELEASE_PATH + # - ls -la $RELEASE_PATH # Cleanup content? -> remove content in release path? # Add/update content - echo $CI_PAGES_URL -- GitLab From 82dcb66807ce5d5ceaf35a9a09cb3be992567b17 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 18:28:49 +0100 Subject: [PATCH 11/17] * fix ci --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b10a5941..8c9a0da0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -221,7 +221,7 @@ upload-job: pages: stage: upload - # image: curlimages/curl:latest + image: curlimages/curl:latest needs: - job: prepare-job artifacts: true -- GitLab From 08bb2210f6d40eb3d5258ff4d49b22c02911ca38 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 18:37:01 +0100 Subject: [PATCH 12/17] + fix CI --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8c9a0da0..aecf194b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -221,7 +221,8 @@ upload-job: pages: stage: upload - image: curlimages/curl:latest + # image: curlimages/curl:latest + image: alpine needs: - job: prepare-job artifacts: true -- GitLab From 4d1c5e49cf35bf32f5a22b371497741a667d7a19 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 19:04:52 +0100 Subject: [PATCH 13/17] + another try... --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aecf194b..21abeed8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -222,7 +222,7 @@ upload-job: pages: stage: upload # image: curlimages/curl:latest - image: alpine + # image: alpine needs: - job: prepare-job artifacts: true @@ -231,6 +231,7 @@ pages: script: # Get the previous GitLab Pages content (otherwise other beta/stable branch gets removed..) - set +e + - apt install zip unzip -y - curl --fail "$CI_PAGES_URL/content.zip" -o "content.zip" - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi - set -e @@ -262,6 +263,8 @@ release-job: artifacts: true - job: build-job artifacts: true + - job: pages + artifacts: true rules: - !reference [.default_rules, rules] script: -- GitLab From 5d699c69b7dd9ea1308ccd8b7fc6be483e3a2cc3 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 19:19:57 +0100 Subject: [PATCH 14/17] + again.. --- .gitlab-ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 21abeed8..a0d258e0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -145,6 +145,13 @@ build-job: # This job runs in the build stage, which runs first. rules: - !reference [.default_rules, rules] script: + # Test zip installation + - rm -rf /var/lib/apt/lists/* + - apt update + - apt-cache gencaches + - apt install -y zip unzip + - apt install zip unzip -y + - zip --help - echo "Compiling the code..." - echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env - cat build.env -- GitLab From b0c08973280894edd1028eadcf59873ada6b883b Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 19:23:04 +0100 Subject: [PATCH 15/17] * this should do it.. --- .gitlab-ci.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a0d258e0..f83e4f1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -146,12 +146,11 @@ build-job: # This job runs in the build stage, which runs first. - !reference [.default_rules, rules] script: # Test zip installation - - rm -rf /var/lib/apt/lists/* - - apt update - - apt-cache gencaches - - apt install -y zip unzip - - apt install zip unzip -y - - zip --help + # - rm -rf /var/lib/apt/lists/* + # - apt update + # - apt-cache gencaches + # - apt install -y zip unzip + # - zip --help - echo "Compiling the code..." - echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env - cat build.env @@ -237,8 +236,12 @@ pages: artifacts: true script: # Get the previous GitLab Pages content (otherwise other beta/stable branch gets removed..) + - rm -rf /var/lib/apt/lists/* + - apt update + - apt-cache gencaches + - apt install -y zip unzip + - zip --help - set +e - - apt install zip unzip -y - curl --fail "$CI_PAGES_URL/content.zip" -o "content.zip" - if [ -e "content.zip" ]; then unzip "content.zip"; rm "content.zip"; fi - set -e -- GitLab From 0607f68147927600f43d66ef9a57399926db7a54 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 20:23:55 +0100 Subject: [PATCH 16/17] + fix for multiple or no test objective in TPD #20 --- .../etsi/mts/tdl/tools/to/docx/poi/Generator.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java index cbe41097..8462282e 100644 --- a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java +++ b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java @@ -431,9 +431,17 @@ public class Generator { LinkedHashMap map = new LinkedHashMap<>(); map.put(Placeholders.NAME, tpd.getName()); //TODO: what if 0? what if more than 1? - map.put(Placeholders.DESCRIPTION, tpd.getTestObjective().get(0).getDescription().replaceAll("\"", "")); - String uri = String.join("\n", tpd.getTestObjective().get(0).getObjectiveURI()).trim(); - map.put(Placeholders.URI, uri.replaceAll("\"","")); + //TODO: make more robust + if (tpd.getTestObjective().size() == 1) { + map.put(Placeholders.DESCRIPTION, tpd.getTestObjective().get(0).getDescription().replaceAll("\"", "")); + String uri = String.join("\n", tpd.getTestObjective().get(0).getObjectiveURI()).trim(); + map.put(Placeholders.URI, uri.replaceAll("\"","")); + } else { + //TODO: handle more adequately + String error = "N/A (multiple or no Test Objectives linked)"; + map.put(Placeholders.DESCRIPTION, error); + map.put(Placeholders.URI, error); + } TestConfiguration configuration = tpd.getTestConfiguration(); String config = ""; if (configuration != null) { -- GitLab From 580a8e0ea9468e4ceaa438943db2b55d3f74b834 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Mon, 30 Oct 2023 20:56:36 +0100 Subject: [PATCH 17/17] * clean up --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f83e4f1a..c064cd82 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -251,6 +251,7 @@ pages: - echo $CI_PAGES_URL - echo $RELEASE_PATH - mkdir -p $RELEASE_PATH + - rm -rf $RELEASE_PATH/* - cp -r -f $SITE_PATH/* $RELEASE_PATH - ls -la $RELEASE_PATH # Zip the content and publish the zip again -- GitLab