[savara-commits] savara SVN: r616 - in branches/experimental/2.0.x/bundles: org.savara.bpel/src/test/java/org/savara/bpel/generator and 6 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Jan 24 18:14:13 EST 2011
Author: objectiser
Date: 2011-01-24 18:14:11 -0500 (Mon, 24 Jan 2011)
New Revision: 616
Modified:
branches/experimental/2.0.x/bundles/org.savara.bpel/src/main/java/org/savara/bpel/generator/ProtocolToBPELModelGenerator.java
branches/experimental/2.0.x/bundles/org.savara.bpel/src/test/java/org/savara/bpel/generator/GeneratorTest.java
branches/experimental/2.0.x/bundles/org.savara.bundles.tests/src/test/java/org/savara/bundles/tests/bpel/generator/GeneratorTest.java
branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/Annotation.java
branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/AnnotationDefinitions.java
branches/experimental/2.0.x/bundles/org.savara.contract/src/main/java/org/savara/contract/generator/impl/ContractIntrospector.java
branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolConverterRuleImpl.java
branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolModelConverterRuleImpl.java
branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ESBBroker.spr
branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/PurchaseGoods.spr
branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ReqRespFault.spr
branches/experimental/2.0.x/bundles/org.savara.protocol/src/main/java/org/savara/protocol/parser/AnnotationProcessor.java
Log:
Fixed use of annotations with protocol description to generate BPEL.
Modified: branches/experimental/2.0.x/bundles/org.savara.bpel/src/main/java/org/savara/bpel/generator/ProtocolToBPELModelGenerator.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.bpel/src/main/java/org/savara/bpel/generator/ProtocolToBPELModelGenerator.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.bpel/src/main/java/org/savara/bpel/generator/ProtocolToBPELModelGenerator.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -23,8 +23,6 @@
import org.savara.bpel.model.TProcess;
import org.savara.bpel.model.change.BPELModelChangeContext;
import org.savara.common.model.generator.ModelGenerator;
-import org.savara.contract.generator.ContractGenerator;
-import org.savara.contract.generator.ContractGeneratorFactory;
import org.scribble.common.resource.ResourceLocator;
import org.scribble.common.logging.CachedJournal;
import org.scribble.common.logging.Journal;
@@ -47,16 +45,6 @@
new BPELModelChangeContext(null, new CachedJournal());
ProtocolModel pm=(ProtocolModel)source;
- /* TODO: Need to sort out contract generation from a local model
- *
- *
- // Derive contracts associated with the protocol model
- ContractGenerator cg=ContractGeneratorFactory.getContractGenerator();
- if (cg != null) {
- cg.generate(pm, context.getJournal(), context.getProtocolContext());
- }
- */
-
// Create BPEL model
TProcess bpel=new TProcess();
Modified: branches/experimental/2.0.x/bundles/org.savara.bpel/src/test/java/org/savara/bpel/generator/GeneratorTest.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.bpel/src/test/java/org/savara/bpel/generator/GeneratorTest.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.bpel/src/test/java/org/savara/bpel/generator/GeneratorTest.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -25,7 +25,11 @@
import org.savara.bpel.generator.ProtocolToBPELModelGenerator;
import org.savara.bpel.model.TProcess;
import org.savara.bpel.util.BPELModelUtil;
+import org.savara.common.model.annotation.Annotation;
+import org.savara.common.model.annotation.AnnotationDefinitions;
import org.savara.common.model.generator.ModelGenerator;
+import org.savara.contract.generator.ContractGenerator;
+import org.savara.contract.generator.ContractGeneratorFactory;
import org.scribble.common.logging.CachedJournal;
import org.scribble.protocol.model.Role;
import org.scribble.protocol.parser.antlr.ANTLRProtocolParser;
@@ -36,7 +40,6 @@
public static Test suite() {
TestSuite suite = new TestSuite("Protocol->BPEL Generator Tests");
- /*
suite.addTest(new ProtocolToBPELTester("ESBBroker", "Broker"));
suite.addTest(new ProtocolToBPELTester("ESBBroker", "Buyer"));
suite.addTest(new ProtocolToBPELTester("ESBBroker", "SupplierTxnProcessor"));
@@ -49,7 +52,6 @@
suite.addTest(new ProtocolToBPELTester("ReqRespFault", "Buyer"));
suite.addTest(new ProtocolToBPELTester("ReqRespFault", "Seller"));
- */
return suite;
}
@@ -139,7 +141,12 @@
org.scribble.protocol.projection.ProtocolProjector projector=
new org.scribble.protocol.projection.impl.ProtocolProjectorImpl();
- org.scribble.protocol.model.ProtocolModel projected=
+ ContractGenerator cg=ContractGeneratorFactory.getContractGenerator();
+ if (cg != null) {
+ cg.generate(model, journal, null);
+ }
+
+ org.scribble.protocol.model.ProtocolModel projected=
projector.project(model, role, journal, null);
/* Currently if a 'fail' is performed in Tycho build, it
@@ -151,6 +158,15 @@
}
*/
+ // TODO: SAVARA-167 - issue when projection is based on a sub-protocol
+ if (AnnotationDefinitions.getAnnotation(projected.getProtocol().getProperties(),
+ AnnotationDefinitions.TYPE) == null &&
+ AnnotationDefinitions.getAnnotation(model.getProtocol().getProperties(),
+ AnnotationDefinitions.TYPE) != null) {
+ AnnotationDefinitions.copyAnnotations(model.getProtocol().getProperties(),
+ projected.getProtocol().getProperties(), AnnotationDefinitions.TYPE);
+ }
+
java.util.List<Role> projectedRoles=projected.getRoles();
ModelGenerator generator=new ProtocolToBPELModelGenerator();
@@ -176,11 +192,21 @@
if (target instanceof TProcess) {
// Obtain any namespace prefix map
- java.util.Map<String, String> prefixes=null;
- /*
- (java.util.Map<String, String>)
- projected.getProperties().get(PropertyName.NAMESPACE_PREFIXES);
- */
+ java.util.Map<String, String> prefixes=
+ new java.util.HashMap<String, String>();
+
+ java.util.List<Annotation> list=
+ AnnotationDefinitions.getAnnotations(projected.getProtocol().getProperties(),
+ AnnotationDefinitions.TYPE);
+
+ for (Annotation annotation : list) {
+ if (annotation.getProperties().containsKey(AnnotationDefinitions.NAMESPACE_PROPERTY) &&
+ annotation.getProperties().containsKey(AnnotationDefinitions.PREFIX_PROPERTY)) {
+ prefixes.put((String)annotation.getProperties().get(AnnotationDefinitions.NAMESPACE_PROPERTY),
+ (String)annotation.getProperties().get(AnnotationDefinitions.PREFIX_PROPERTY));
+ }
+ }
+
try {
java.io.ByteArrayOutputStream baos=new java.io.ByteArrayOutputStream();
@@ -273,7 +299,7 @@
if (url.getFile().indexOf("target/test-classes") != -1) {
f = new java.io.File(url.getFile().replaceFirst("target/test-classes","src/test/resources"));
} else if (url.getFile().indexOf("classes") != -1) {
- f = new java.io.File(url.getFile().replaceFirst("classes","src/test/resources"));
+ f = new java.io.File(url.getFile().replaceFirst("classes","src/test/resources"));
} else if (url.getFile().indexOf("bin") != -1) {
f = new java.io.File(url.getFile().replaceFirst("bin","src/test/resources"));
} else {
@@ -281,9 +307,9 @@
}
if (f != null && f.exists()) {
- f = f.getParentFile().getParentFile();
+ f = f.getParentFile().getParentFile().getParentFile();
- java.io.File resultsDir=new java.io.File(f, "results");
+ java.io.File resultsDir=new java.io.File(f, "results/bpel");
if (resultsDir.exists() == false) {
resultsDir.mkdirs();
Modified: branches/experimental/2.0.x/bundles/org.savara.bundles.tests/src/test/java/org/savara/bundles/tests/bpel/generator/GeneratorTest.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.bundles.tests/src/test/java/org/savara/bundles/tests/bpel/generator/GeneratorTest.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.bundles.tests/src/test/java/org/savara/bundles/tests/bpel/generator/GeneratorTest.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -28,6 +28,8 @@
import org.savara.common.model.annotation.Annotation;
import org.savara.common.model.annotation.AnnotationDefinitions;
import org.savara.common.model.generator.ModelGenerator;
+import org.savara.contract.generator.ContractGenerator;
+import org.savara.contract.generator.ContractGeneratorFactory;
import org.scribble.common.logging.CachedJournal;
import org.scribble.protocol.model.Role;
import org.savara.pi4soa.cdm.parser.CDMProtocolParser;
@@ -138,7 +140,12 @@
org.scribble.protocol.projection.ProtocolProjector projector=
new org.scribble.protocol.projection.impl.ProtocolProjectorImpl();
- org.scribble.protocol.model.ProtocolModel projected=
+ ContractGenerator cg=ContractGeneratorFactory.getContractGenerator();
+ if (cg != null) {
+ cg.generate(model, journal, null);
+ }
+
+ org.scribble.protocol.model.ProtocolModel projected=
projector.project(model, role, journal, null);
/* Currently if a 'fail' is performed in Tycho build, it
Modified: branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/Annotation.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/Annotation.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/Annotation.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -65,4 +65,7 @@
return(m_properties);
}
+ public String toString() {
+ return("[[ "+getName()+"("+getProperties()+") ]]");
+ }
}
Modified: branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/AnnotationDefinitions.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/AnnotationDefinitions.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.common/src/main/java/org/savara/common/model/annotation/AnnotationDefinitions.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -41,6 +41,8 @@
// Annotation property names
public static final String NAME_PROPERTY="name";
+ public static final String ROLE_PROPERTY="role";
+
public static final String REQUEST_PROPERTY = "request";
public static final String REPLY_TO_PROPERTY = "replyTo";
Modified: branches/experimental/2.0.x/bundles/org.savara.contract/src/main/java/org/savara/contract/generator/impl/ContractIntrospector.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.contract/src/main/java/org/savara/contract/generator/impl/ContractIntrospector.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.contract/src/main/java/org/savara/contract/generator/impl/ContractIntrospector.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -94,14 +94,18 @@
m_contract.setName(m_role.getName());
- Annotation annotation=AnnotationDefinitions.getAnnotation(m_role.getProperties(),
+ java.util.List<Annotation> annotations=AnnotationDefinitions.getAnnotations(protocol.getProperties(),
AnnotationDefinitions.NAMESPACE);
- if (annotation != null) {
- String namespace=(String)annotation.getProperties().get(AnnotationDefinitions.NAME_PROPERTY);
+ if (annotations != null) {
+ for (Annotation annotation : annotations) {
+ String namespace=(String)annotation.getProperties().get(AnnotationDefinitions.NAME_PROPERTY);
+ String role=(String)annotation.getProperties().get(AnnotationDefinitions.ROLE_PROPERTY);
- if (namespace != null) {
- m_contract.setNamespace(namespace);
- }
+ if (namespace != null && role != null && role.equals(m_role.getName())) {
+ m_contract.setNamespace(namespace);
+ break;
+ }
+ }
}
}
@@ -151,6 +155,7 @@
// could determine the interface - and if not defined default
// to using an interface named after the role
+ /*
Annotation annotation=AnnotationDefinitions.getAnnotation(m_role.getProperties(),
AnnotationDefinitions.NAMESPACE);
if (annotation != null) {
@@ -160,6 +165,8 @@
ret.setNamespace(namespace);
}
}
+ */
+ ret.setNamespace(m_contract.getNamespace());
getContract().getInterfaces().add(ret);
}
Modified: branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolConverterRuleImpl.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolConverterRuleImpl.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolConverterRuleImpl.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -36,6 +36,8 @@
import org.pi4soa.common.xml.XMLUtils;
import org.savara.protocol.model.util.PropertyName;
import org.savara.protocol.model.util.TypeSystem;
+import org.savara.common.model.annotation.Annotation;
+import org.savara.common.model.annotation.AnnotationDefinitions;
import org.savara.contract.model.*;
import org.scribble.protocol.model.*;
@@ -102,6 +104,17 @@
rl.getRoles().add(r);
context.setState(r.getName(), r);
+
+ // Associate Namespace annotation with protocol
+ Annotation annotation=AnnotationDefinitions.getAnnotation(r.getProperties(),
+ AnnotationDefinitions.NAMESPACE);
+
+ if (annotation != null) {
+ Annotation pa=AnnotationDefinitions.createAnnotation(ret.getProperties(),
+ AnnotationDefinitions.NAMESPACE);
+ pa.getProperties().putAll(annotation.getProperties());
+ pa.getProperties().put(AnnotationDefinitions.ROLE_PROPERTY, r.getName());
+ }
}
ret.getBlock().add(rl);
Modified: branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolModelConverterRuleImpl.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolModelConverterRuleImpl.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/main/java/org/savara/pi4soa/cdm/parser/rules/ProtocolModelConverterRuleImpl.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -26,12 +26,9 @@
import org.pi4soa.cdl.*;
import org.pi4soa.cdl.util.CDLTypeUtil;
import org.pi4soa.common.xml.XMLUtils;
-import org.savara.protocol.model.util.PropertyName;
import org.savara.protocol.model.util.TypeSystem;
import org.savara.common.model.annotation.Annotation;
import org.savara.common.model.annotation.AnnotationDefinitions;
-import org.savara.contract.generator.ContractGenerator;
-import org.savara.contract.generator.ContractGeneratorFactory;
import org.scribble.protocol.model.*;
import org.scribble.protocol.model.DataType;
@@ -71,10 +68,10 @@
CDLTypeUtil.getURIFragment(cdlpack));
// Convert information types into type imports
- for (org.pi4soa.cdl.InformationType itype : cdlpack.getTypeDefinitions().getInformationTypes()) {
+ //for (org.pi4soa.cdl.InformationType itype : cdlpack.getTypeDefinitions().getInformationTypes()) {
// TODO: Create type import for the info type
- }
+ //}
// Convert root choreography
java.util.Iterator<org.pi4soa.cdl.Choreography> iter=
@@ -113,17 +110,25 @@
type.getProperties().put(AnnotationDefinitions.LOCATION_PROPERTY, ns.getSchemaLocation());
}
}
+
+ // Move any namespace annotations from sub-protocols to the top level protocol
+ final Protocol top=ret.getProtocol();
+
+ ret.getProtocol().visit(new DefaultVisitor() {
+ public boolean start(Protocol elem) {
+ if (elem != top) {
+ AnnotationDefinitions.copyAnnotations(elem.getProperties(),
+ top.getProperties(), AnnotationDefinitions.NAMESPACE);
+
+ }
+ return(true);
+ }
+ });
}
} else {
logger.severe("Failed to find conversation conversion rule");
}
- // Derive contracts associated with the protocol model
- ContractGenerator cg=ContractGeneratorFactory.getContractGenerator();
- if (cg != null) {
- cg.generate(ret, context.getJournal(), context.getProtocolContext());
- }
-
return(ret);
}
Modified: branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ESBBroker.spr
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ESBBroker.spr 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ESBBroker.spr 2011-01-24 23:14:11 UTC (rev 616)
@@ -1,3 +1,7 @@
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/Broker,role=Broker) ]]
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/Buyer,role=Buyer) ]]
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/CreditAgency,role=CreditAgency) ]]
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/Supplier,role=Supplier) ]]
[[ Type(prefix=tns,namespace=http://www.pi4soa.org/ESBBroker) ]]
[[ Type(prefix=xsd,namespace=http://www.w3.org/2001/XMLSchema) ]]
[[ Type(prefix=brk,namespace=http://www.pi4soa.org/ESBBroker/Broker) ]]
@@ -4,6 +8,8 @@
[[ Type(prefix=byr,namespace=http://www.pi4soa.org/ESBBroker/Buyer) ]]
[[ Type(prefix=cay,namespace=http://www.pi4soa.org/ESBBroker/CreditAgency) ]]
[[ Type(prefix=spr,namespace=http://www.pi4soa.org/ESBBroker/Supplier) ]]
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/Supplier,role=SupplierTxnProcessor) ]]
+[[ Namespace(name=http://www.pi4soa.org/ESBBroker/Supplier,role=SupplierQuoteEngine) ]]
protocol ESBBrokerProcess {
role Broker, Buyer, CreditAgency, Supplier;
[[ Interface(name={http://www.pi4soa.org/ESBBroker}BrokerBehavior) ]]
@@ -48,6 +54,7 @@
cancel(Cancel):
}
+ [[ Namespace(name=http://www.pi4soa.org/ESBBroker/Supplier,role=SupplierTxnProcessor) ]]
protocol CompleteTransaction(role Buyer, role Broker, role CreditAgency) {
role SupplierTxnProcessor;
[[ Interface(name={http://www.pi4soa.org/ESBBroker}BrokerBehavior) ]]
@@ -79,6 +86,7 @@
}
}
+ [[ Namespace(name=http://www.pi4soa.org/ESBBroker/Supplier,role=SupplierQuoteEngine) ]]
protocol RequestForQuote(role Broker) {
role SupplierQuoteEngine;
[[ Interface(name={http://www.pi4soa.org/ESBBroker}SupplierBehavior) ]]
Modified: branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/PurchaseGoods.spr
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/PurchaseGoods.spr 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/PurchaseGoods.spr 2011-01-24 23:14:11 UTC (rev 616)
@@ -1,3 +1,6 @@
+[[ Namespace(name=http://www.jboss.org/savara/examples,role=Buyer) ]]
+[[ Namespace(name=java:org.jboss.savara.examples.purchasing,role=CreditAgency) ]]
+[[ Namespace(name=http://www.jboss.org/examples/store,role=Store) ]]
[[ Type(prefix=tns,namespace=http://www.jboss.org/savara/examples) ]]
[[ Type(prefix=xsd,namespace=http://www.w3.org/2001/XMLSchema) ]]
[[ Type(prefix=pur,namespace=java:org.jboss.savara.examples.purchasing) ]]
Modified: branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ReqRespFault.spr
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ReqRespFault.spr 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.pi4soa.cdm/src/test/resources/results/protocol/ReqRespFault.spr 2011-01-24 23:14:11 UTC (rev 616)
@@ -1,3 +1,5 @@
+[[ Namespace(name=http://www.pi4soa.org/ReqRespFault/Buyer,role=Buyer) ]]
+[[ Namespace(name=http://www.pi4soa.org/ReqRespFault/Seller,role=Seller) ]]
[[ Type(prefix=tns,namespace=http://www.pi4soa.org/ReqRespFault) ]]
[[ Type(prefix=xsd,namespace=http://www.w3.org/2001/XMLSchema) ]]
[[ Type(prefix=byr,namespace=http://www.pi4soa.org/ReqRespFault/Buyer) ]]
Modified: branches/experimental/2.0.x/bundles/org.savara.protocol/src/main/java/org/savara/protocol/parser/AnnotationProcessor.java
===================================================================
--- branches/experimental/2.0.x/bundles/org.savara.protocol/src/main/java/org/savara/protocol/parser/AnnotationProcessor.java 2011-01-24 15:50:17 UTC (rev 615)
+++ branches/experimental/2.0.x/bundles/org.savara.protocol/src/main/java/org/savara/protocol/parser/AnnotationProcessor.java 2011-01-24 23:14:11 UTC (rev 616)
@@ -28,7 +28,7 @@
Journal journal) {
java.util.StringTokenizer st=new java.util.StringTokenizer(annotation); //, "(),=");
- String name=st.nextToken("(");
+ String name=st.nextToken(" (");
Annotation an=AnnotationDefinitions.createAnnotation(modelObject.getProperties(), name);
More information about the savara-commits
mailing list