Skip to content
Snippets Groups Projects
Commit eded8184 authored by René Schöne's avatar René Schöne
Browse files

Replacing ragconnect parts with ragconnect jar file.

parent 61c612f3
No related branches found
No related tags found
No related merge requests found
Pipeline #7603 passed
Showing
with 0 additions and 1737 deletions
aspect Configuration {
public static boolean ASTNode.loggingEnabledForReads = false;
public static boolean ASTNode.loggingEnabledForWrites = false;
public static TypeDecl ASTNode.rootNode;
public static boolean ASTNode.usesMqtt;
public static boolean ASTNode.usesRest;
}
/*
Design considerations
- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation
*/
aspect AttributesForMustache {
// --- MRagConnect ---
eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0;
syn String MRagConnect.closeMethod() = "ragconnectCloseConnections";
syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler";
syn String MRagConnect.mqttHandlerField() = "_mqttHandler";
syn String MRagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady";
syn String MRagConnect.restHandlerAttribute() = "_restHandler";
syn String MRagConnect.restHandlerField() = "_restHandler";
// --- MEndpointDefinition ---
syn String MEndpointDefinition.preemptiveExpectedValue();
syn String MEndpointDefinition.preemptiveReturn();
syn TokenEndpointDefinition MEndpointDefinition.endpointDef();
syn String MEndpointDefinition.firstInputVarName();
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
syn String MEndpointDefinition.connectParameterName() = "uriString";
syn String MEndpointDefinition.connectMethod() = "connect" + tokenName();
syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken();
syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply();
syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName();
syn String MEndpointDefinition.tokenName() = token().getName();
syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
syn String MEndpointDefinition.condition() {
if (lastDefinition().mappingDef().getToType().isArray()) {
return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")";
}
if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) {
return preemptiveExpectedValue() + " == " + lastResult();
}
if (lastDefinition().mappingDef().isDefaultMappingDefinition()) {
return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")";
}
return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null";
}
// --- MInnerMappingDefinition ---
inh boolean MInnerMappingDefinition.isLast();
inh String MInnerMappingDefinition.inputVarName();
syn String MInnerMappingDefinition.toType() = mappingDef().getToType().prettyPrint();
syn String MInnerMappingDefinition.methodName() = getMMappingDefinition().methodName();
syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition();
syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one
// --- MReceiveDefinition ---
eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()";
eq MReceiveDefinition.preemptiveReturn() = "return;";
eq MReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition();
eq MReceiveDefinition.firstInputVarName() = "message";
// --- MSendDefinition ---
eq MSendDefinition.preemptiveExpectedValue() = lastValue();
eq MSendDefinition.preemptiveReturn() = "return false;";
eq MSendDefinition.endpointDef() = getSendTokenEndpointDefinition();
eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()";
syn String MSendDefinition.sender() = "_sender_" + tokenName();
syn String MSendDefinition.lastValue() = "_lastValue" + tokenName();
syn String MSendDefinition.updateMethod() = "_update_" + tokenName();
syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset";
// --- MMappingDefinition ---
syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
syn String MMappingDefinition.methodName() = "_apply_" + getMappingDefinition().getID();
syn String MMappingDefinition.fromType() = getMappingDefinition().getFromType().prettyPrint();
syn String MMappingDefinition.fromVariableName() = getMappingDefinition().getFromVariableName();
syn String MMappingDefinition.content() = getMappingDefinition().getContent();
// --- MDependencyDefinition ---
syn String MDependencyDefinition.targetParentTypeName() = getDependencyDefinition().getTarget().containingTypeDecl().getName();
syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID());
syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName();
syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID();
syn nta MSendDefinition MDependencyDefinition.targetEndpointDefinition() {
return getDependencyDefinition().targetEndpointDefinition().toMustache();
}
// --- MTypeComponent ---
syn String MTypeComponent.name() = getTypeComponent().getName();
inh boolean MTypeComponent.isFirst();
// --- MTokenComponent ---
syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
syn String MTokenComponent.name() = getTokenComponent().getName();
syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint();
syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name();
syn String MTokenComponent.externalName() = name();
// --- toMustache ---
syn lazy MRagConnect RagConnect.toMustache() {
MRagConnect result = new MRagConnect();
result.setRagConnect(this);
for (EndpointDefinition def : getEndpointDefinitionList()) {
if (def.isSendTokenEndpointDefinition()) {
SendTokenEndpointDefinition sendDef = def.asSendTokenEndpointDefinition();
result.addSendDefinition(sendDef.toMustache());
} else {
result.addReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache());
}
}
for (MappingDefinition def : allMappingDefinitions()) {
result.addMappingDefinition(def.toMustache());
}
for (DependencyDefinition def : getDependencyDefinitionList()) {
result.addDependencyDefinition(def.toMustache());
}
for (TokenComponent token : getProgram().allTokenComponents()) {
if (!token.getDependencySourceDefinitionList().isEmpty()) {
result.addTokenComponent(token.toMustache());
}
}
for (Component child : rootNode.getComponentList()) {
if (child.isTypeComponent()) {
result.addRootTypeComponent(child.asTypeComponent().toMustache());
}
}
return result;
}
protected void MEndpointDefinition.addInnerMappings() {
for (MappingDefinition def : endpointDef().effectiveMappings()) {
MInnerMappingDefinition inner = new MInnerMappingDefinition();
inner.setMMappingDefinition(def.toMustache());
addInnerMappingDefinition(inner);
}
}
syn lazy MReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() {
MReceiveDefinition result = new MReceiveDefinition();
result.setReceiveTokenEndpointDefinition(this);
result.addInnerMappings();
return result;
}
syn lazy MSendDefinition SendTokenEndpointDefinition.toMustache() {
MSendDefinition result = new MSendDefinition();
result.setSendTokenEndpointDefinition(this);
result.addInnerMappings();
return result;
}
syn lazy MMappingDefinition MappingDefinition.toMustache() {
MMappingDefinition result = new MMappingDefinition();
result.setMappingDefinition(this);
return result;
}
syn lazy MDependencyDefinition DependencyDefinition.toMustache() {
MDependencyDefinition result = new MDependencyDefinition();
result.setDependencyDefinition(this);
return result;
}
syn lazy MTypeComponent TypeComponent.toMustache() {
MTypeComponent result = new MTypeComponent();
result.setTypeComponent(this);
return result;
}
syn lazy MTokenComponent TokenComponent.toMustache() {
MTokenComponent result = new MTokenComponent();
result.setTokenComponent(this);
for (DependencyDefinition def : getDependencySourceDefinitionList()) {
result.addDependencyDefinition(def.toMustache());
}
return result;
}
}
aspect AspectGeneration {
// --- rootNodeName ---
syn String ASTNode.rootNodeName() = rootNode.getName();
public String RagConnect.generateAspect(String rootNodeName) {
rootNode = getProgram().resolveTypeDecl(rootNodeName);
return toMustache().generateAspect();
}
public String MRagConnect.generateAspect() {
StringBuilder sb = new StringBuilder();
com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() {
@Override
public com.github.mustachejava.Binding createBinding(String name, final com.github.mustachejava.TemplateContext tc, com.github.mustachejava.Code code) {
return new com.github.mustachejava.reflect.GuardedBinding(this, name, tc, code) {
@Override
protected synchronized com.github.mustachejava.util.Wrapper getWrapper(String name, java.util.List<Object> scopes) {
com.github.mustachejava.util.Wrapper wrapper = super.getWrapper(name, scopes);
if (wrapper instanceof com.github.mustachejava.reflect.MissingWrapper) {
throw new com.github.mustachejava.MustacheException(name + " not found in " + tc);
}
return wrapper;
}
};
}
};
com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory();
mf.setObjectHandler(roh);
com.github.mustachejava.Mustache m = mf.compile("ragconnect.mustache");
m.execute(new java.io.PrintWriter(new org.jastadd.ragconnect.compiler.AppendableWriter(sb)), this);
return sb.toString();
}
}
aspect RelationGeneration {
syn java.util.List<Relation> RagConnect.additionalRelations() {
java.util.List<Relation> result = new java.util.ArrayList<>();
for (DependencyDefinition dd : getDependencyDefinitionList()) {
result.add(dd.getRelationToCreate());
}
return result;
}
syn nta Relation DependencyDefinition.getRelationToCreate() {
String internalRelationPrefix = toMustache().internalRelationPrefix();
BidirectionalRelation result = new BidirectionalRelation();
NavigableRole left = new ListRole(internalRelationPrefix + "Source");
left.setType(getTarget().containingTypeDecl());
NavigableRole right = new ListRole(internalRelationPrefix + "Target");
right.setType(getSource().containingTypeDecl());
result.setLeft(left);
result.setRight(right);
result.addComment(new WhitespaceComment("\n"));
return result;
}
}
aspect GrammarExtension {
refine BackendAbstractGrammar public void TokenComponent.generateAbstractGrammar(StringBuilder b) {
if (getNTA()) {
b.append("/");
}
b.append("<");
if (!getName().equals("")) {
b.append(toMustache().internalName()).append(":");
}
effectiveJavaTypeUse().generateAbstractGrammar(b);
b.append(">");
if (getNTA()) {
b.append("/");
}
}
}
aspect DefaultMappings {
private String RagConnect.baseDefaultMappingTypeNamePart(String typeName) {
return capitalize(typeName).replace("[]", "s");
}
private MappingDefinitionType RagConnect.baseDefaultMappingTypeFromName(String typeName) {
return typeName.endsWith("[]") ?
new JavaArrayMappingDefinitionType(new SimpleJavaTypeUse(typeName.replace("[]", ""))) :
new JavaMappingDefinitionType(new SimpleJavaTypeUse(typeName));
}
private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinition(String fromTypeName, String toTypeName, String content) {
DefaultMappingDefinition result = new DefaultMappingDefinition();
result.setID("_Default" + baseDefaultMappingTypeNamePart(fromTypeName) + "To" + baseDefaultMappingTypeNamePart(toTypeName) + "Mapping");
result.setFromType(baseDefaultMappingTypeFromName(fromTypeName));
result.setFromVariableName("input");
result.setToType(baseDefaultMappingTypeFromName(toTypeName));
result.setContent(content);
return result;
}
syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() = baseDefaultMappingDefinition(
"byte[]", "int", "return java.nio.ByteBuffer.wrap(input).getInt();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() = baseDefaultMappingDefinition(
"byte[]", "short", "return java.nio.ByteBuffer.wrap(input).getShort();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToLongMapping() = baseDefaultMappingDefinition(
"byte[]", "long", "return java.nio.ByteBuffer.wrap(input).getLong();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToFloatMapping() = baseDefaultMappingDefinition(
"byte[]", "float", "return java.nio.ByteBuffer.wrap(input).getFloat();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToDoubleMapping() = baseDefaultMappingDefinition(
"byte[]", "double", "return java.nio.ByteBuffer.wrap(input).getDouble();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToCharMapping() = baseDefaultMappingDefinition(
"byte[]", "char", "return java.nio.ByteBuffer.wrap(input).getChar();");
syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() = baseDefaultMappingDefinition(
"byte[]", "String", "return new String(input);");
syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() = baseDefaultMappingDefinition(
"int", "byte[]", "return java.nio.ByteBuffer.allocate(Integer.BYTES).putInt(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() = baseDefaultMappingDefinition(
"short", "byte[]", "return java.nio.ByteBuffer.allocate(Short.BYTES).putShort(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultLongToBytesMapping() = baseDefaultMappingDefinition(
"long", "byte[]", "return java.nio.ByteBuffer.allocate(Long.BYTES).putLong(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultFloatToBytesMapping() = baseDefaultMappingDefinition(
"float", "byte[]", "return java.nio.ByteBuffer.allocate(Float.BYTES).putFloat(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultDoubleToBytesMapping() = baseDefaultMappingDefinition(
"double", "byte[]", "return java.nio.ByteBuffer.allocate(Double.BYTES).putDouble(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultCharToBytesMapping() = baseDefaultMappingDefinition(
"char", "byte[]", "return java.nio.ByteBuffer.allocate(Character.BYTES).putChar(input).array();");
syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() = baseDefaultMappingDefinition(
"String", "byte[]", "return input.getBytes();");
syn nta DefaultMappingDefinition RagConnect.defaultStringToIntMapping() = baseDefaultMappingDefinition(
"String", "int", "return Integer.parseInt(input);");
syn nta DefaultMappingDefinition RagConnect.defaultStringToShortMapping() = baseDefaultMappingDefinition(
"String", "short", "return Short.parseShort(input);");
syn nta DefaultMappingDefinition RagConnect.defaultStringToLongMapping() = baseDefaultMappingDefinition(
"String", "long", "return Long.parseLong(input);");
syn nta DefaultMappingDefinition RagConnect.defaultStringToFloatMapping() = baseDefaultMappingDefinition(
"String", "float", "return Float.parseFloat(input);");
syn nta DefaultMappingDefinition RagConnect.defaultStringToDoubleMapping() = baseDefaultMappingDefinition(
"String", "double", "return Double.parseDouble(input);");
syn nta DefaultMappingDefinition RagConnect.defaultStringToCharMapping() = baseDefaultMappingDefinition(
"String", "char", "return input.charAt(0);");
syn nta DefaultMappingDefinition RagConnect.defaultIntToStringMapping() = baseDefaultMappingDefinition(
"int", "String", "return String.valueOf(input);");
syn nta DefaultMappingDefinition RagConnect.defaultShortToStringMapping() = baseDefaultMappingDefinition(
"short", "String", "return String.valueOf(input);");
syn nta DefaultMappingDefinition RagConnect.defaultLongToStringMapping() = baseDefaultMappingDefinition(
"long", "String", "return String.valueOf(input);");
syn nta DefaultMappingDefinition RagConnect.defaultFloatToStringMapping() = baseDefaultMappingDefinition(
"float", "String", "return String.valueOf(input);");
syn nta DefaultMappingDefinition RagConnect.defaultDoubleToStringMapping() = baseDefaultMappingDefinition(
"double", "String", "return String.valueOf(input);");
syn nta DefaultMappingDefinition RagConnect.defaultCharToStringMapping() = baseDefaultMappingDefinition(
"char", "String", "return String.valueOf(input);");
}
aspect Mappings {
// --- effectiveMappings ---
syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings();
eq ReceiveTokenEndpointDefinition.effectiveMappings() {
// if there is a first mapping, check if it is suitable.
// or if no mappings are specified.
// then prepend the suitable default mapping
java.util.List<MappingDefinition> result;
if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) {
result = new java.util.ArrayList();
result.add(suitableDefaultMapping());
result.addAll(getMappingList());
} else {
result = getMappingList();
}
return result;
}
eq SendTokenEndpointDefinition.effectiveMappings() {
// if there is a mapping, check if it is suitable.
// or if no mappings are specified.
// then append the suitable default mapping
java.util.List<MappingDefinition> result;
if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) {
result = new java.util.ArrayList(getMappingList());
result.add(suitableDefaultMapping());
} else {
result = getMappingList();
}
return result;
}
// --- hasSuitableEdgeMapping ---
syn boolean TokenEndpointDefinition.hasSuitableEdgeMapping();
eq ReceiveTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(0));
eq SendTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(getMappingList().size() - 1));
// --- isSuitableEdgeMapping(def) ---
syn boolean TokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def);
eq ReceiveTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getFromType().isByteArray();
eq SendTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getToType().isByteArray();
// --- isPrimitiveType ---
syn boolean TokenComponent.isPrimitiveType() = effectiveJavaTypeUse().isPrimitiveType();
syn boolean JavaTypeUse.isPrimitiveType() = false;
eq SimpleJavaTypeUse.isPrimitiveType() {
switch(getName()) {
case "int":
case "short":
case "long":
case "float":
case "double":
case "char":
case "byte": return true;
default: return false;
}
}
syn boolean MappingDefinitionType.isPrimitiveType() = false;
eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType();
// --- isArray ---
syn boolean MappingDefinitionType.isArray() = false;
eq JavaArrayMappingDefinitionType.isArray() = true;
// --- suitableDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableDefaultMapping();
eq ReceiveTokenEndpointDefinition.suitableDefaultMapping() {
String typeName = getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(0).getFromType().prettyPrint();
switch(typeName) {
case "int":
case "Integer": return ragconnect().defaultBytesToIntMapping();
case "short":
case "Short": return ragconnect().defaultBytesToShortMapping();
case "long":
case "Long": return ragconnect().defaultBytesToLongMapping();
case "float":
case "Float": return ragconnect().defaultBytesToFloatMapping();
case "double":
case "Double": return ragconnect().defaultBytesToDoubleMapping();
case "char":
case "Character": return ragconnect().defaultBytesToCharMapping();
case "String": return ragconnect().defaultBytesToStringMapping();
default: return null;
}
}
eq SendTokenEndpointDefinition.suitableDefaultMapping() {
String typeName = getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
switch(typeName) {
case "int":
case "Integer": return ragconnect().defaultIntToBytesMapping();
case "short":
case "Short": return ragconnect().defaultShortToBytesMapping();
case "long":
case "Long": return ragconnect().defaultLongToBytesMapping();
case "float":
case "Float": return ragconnect().defaultFloatToBytesMapping();
case "double":
case "Double": return ragconnect().defaultDoubleToBytesMapping();
case "char":
case "Character": return ragconnect().defaultCharToBytesMapping();
case "String": return ragconnect().defaultStringToBytesMapping();
default: return null;
}
}
// eq ReceiveFromRestDefinition.suitableDefaultMapping() {
// String typeName = getMappingList().isEmpty() ?
// getToken().getJavaTypeUse().getName() :
// getMappingList().get(0).getFromType().prettyPrint();
// switch(typeName) {
// case "int":
// case "Integer": return ragconnect().defaultStringToIntMapping();
// case "short":
// case "Short": return ragconnect().defaultStringToShortMapping();
// case "long":
// case "Long": return ragconnect().defaultStringToLongMapping();
// case "float":
// case "Float": return ragconnect().defaultStringToFloatMapping();
// case "double":
// case "Double": return ragconnect().defaultStringToDoubleMapping();
// case "char":
// case "Character": return ragconnect().defaultStringToCharMapping();
// default: return null;
// }
// }
// eq SendToRestDefinition.suitableDefaultMapping() {
// String typeName = getMappingList().isEmpty() ?
// getToken().getJavaTypeUse().getName() :
// getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
// switch(typeName) {
// case "int":
// case "Integer": return ragconnect().defaultIntToStringMapping();
// case "short":
// case "Short": return ragconnect().defaultShortToStringMapping();
// case "long":
// case "Long": return ragconnect().defaultLongToStringMapping();
// case "float":
// case "Float": return ragconnect().defaultFloatToStringMapping();
// case "double":
// case "Double": return ragconnect().defaultDoubleToStringMapping();
// case "char":
// case "Character": return ragconnect().defaultCharToStringMapping();
// default: return null;
// }
// }
// --- isByteArray ---
syn boolean MappingDefinitionType.isByteArray() = false;
eq JavaArrayMappingDefinitionType.isByteArray() = getType().getName().equals("byte");
// // --- isString ---
// syn boolean MappingDefinitionType.isString() = false;
// eq JavaMappingDefinitionType.isString() = getType().getName().equals("String");
// --- allMappingDefinitions ---
syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() {
java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
getMappingDefinitionList().iterator().forEachRemaining(result::add);
// byte[] conversion
result.add(defaultBytesToIntMapping());
result.add(defaultBytesToShortMapping());
result.add(defaultBytesToLongMapping());
result.add(defaultBytesToFloatMapping());
result.add(defaultBytesToDoubleMapping());
result.add(defaultBytesToCharMapping());
result.add(defaultBytesToStringMapping());
result.add(defaultIntToBytesMapping());
result.add(defaultShortToBytesMapping());
result.add(defaultLongToBytesMapping());
result.add(defaultFloatToBytesMapping());
result.add(defaultDoubleToBytesMapping());
result.add(defaultCharToBytesMapping());
result.add(defaultStringToBytesMapping());
// // string conversion
// result.add(defaultStringToIntMapping());
// result.add(defaultStringToShortMapping());
// result.add(defaultStringToLongMapping());
// result.add(defaultStringToFloatMapping());
// result.add(defaultStringToDoubleMapping());
// result.add(defaultStringToCharMapping());
// result.add(defaultIntToStringMapping());
// result.add(defaultShortToStringMapping());
// result.add(defaultLongToStringMapping());
// result.add(defaultFloatToStringMapping());
// result.add(defaultDoubleToStringMapping());
// result.add(defaultCharToStringMapping());
return result;
}
}
aspect MustacheNodesToYAML {
syn Document MRagConnect.toYAML() {
Document doc = new Document();
MappingElement root = new MappingElement();
root.addKeyValuePair("rootNodeName", StringElement.of(rootNodeName()));
root.addKeyValuePair("closeMethod", StringElement.of(closeMethod()));
root.addKeyValuePair("usesMqtt", ValueElement.of(usesMqtt));
root.addKeyValuePair("usesRest", ValueElement.of(usesRest));
// mqtt
root.addKeyValuePair("mqttHandlerField", StringElement.of(mqttHandlerField()));
root.addKeyValuePair("mqttHandlerAttribute", StringElement.of(mqttHandlerAttribute()));
root.addKeyValuePair("mqttSetupWaitUntilReadyMethod", StringElement.of(mqttSetupWaitUntilReadyMethod()));
// rootTypeComponents
ListElement rootTypeComponents = new ListElement();
for (MTypeComponent comp : getRootTypeComponentList()) {
MappingElement inner = new MappingElement();
inner.addKeyValuePair("first", ValueElement.of(comp.isFirst()));
inner.addKeyValuePair("name", StringElement.of(comp.name()));
rootTypeComponents.addElement(inner);
}
root.addKeyValuePair("RootTypeComponents", rootTypeComponents);
// rest
root.addKeyValuePair("restHandlerField", StringElement.of(restHandlerField()));
root.addKeyValuePair("restHandlerAttribute", StringElement.of(restHandlerAttribute()));
// ReceiveDefinitions
ListElement receiveDefinitions = new ListElement();
for (MReceiveDefinition def : getReceiveDefinitionList()) {
receiveDefinitions.addElement(def.toYAML());
}
root.addKeyValuePair("ReceiveDefinitions", receiveDefinitions);
// SendDefinitions
ListElement sendDefinitions = new ListElement();
for (MSendDefinition def : getSendDefinitionList()) {
sendDefinitions.addElement(def.toYAML());
}
root.addKeyValuePair("SendDefinitions", sendDefinitions);
// MappingDefinitions
ListElement mappingDefinitions = new ListElement();
for (MMappingDefinition def : getMappingDefinitionList()) {
mappingDefinitions.addElement(def.toYAML());
}
root.addKeyValuePair("MappingDefinitions", mappingDefinitions);
// DependencyDefinitions
ListElement dependencyDefinitions = new ListElement();
for (MDependencyDefinition def : getDependencyDefinitionList()) {
dependencyDefinitions.addElement(def.toYAML());
}
root.addKeyValuePair("DependencyDefinitions", dependencyDefinitions);
// TokenComponents
ListElement tokenComponents = new ListElement();
for (MTokenComponent comp : getTokenComponentList()) {
tokenComponents.addElement(comp.toYAML());
}
root.addKeyValuePair("TokenComponents", tokenComponents);
doc.addComplexElement(root);
return doc;
}
syn MappingElement MEndpointDefinition.toYAML() {
MappingElement result = new MappingElement();
result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName()));
result.addKeyValuePair("connectMethod", StringElement.of(connectMethod()));
result.addKeyValuePair("connectParameterName", StringElement.of(connectParameterName()));
result.addKeyValuePair("lastDefinitionToType", StringElement.of(lastDefinitionToType()));
result.addKeyValuePair("preemptiveReturn", StringElement.of(preemptiveReturn()));
result.addKeyValuePair("alwaysApply", ValueElement.of(alwaysApply()));
result.addKeyValuePair("condition", StringElement.of(
condition().replace("\"", "\\\"").replace("\n", "\\n")));
result.addKeyValuePair("lastResult", StringElement.of(lastResult()));
result.addKeyValuePair("tokenName", StringElement.of(tokenName()));
result.addKeyValuePair("InnerMappingDefinitions", innerMappingDefinitionsAsListElement());
return result;
}
syn MappingElement MReceiveDefinition.toYAML() {
MappingElement result = super.toYAML();
result.addKeyValuePair("loggingEnabledForReads", ValueElement.of(loggingEnabledForReads));
return result;
}
syn MappingElement MSendDefinition.toYAML() {
MappingElement result = super.toYAML();
result.addKeyValuePair("sender", StringElement.of(sender()));
result.addKeyValuePair("lastValue", StringElement.of(lastValue()));
result.addKeyValuePair("loggingEnabledForWrites", ValueElement.of(loggingEnabledForWrites));
result.addKeyValuePair("updateMethod", StringElement.of(updateMethod()));
result.addKeyValuePair("writeMethod", StringElement.of(writeMethod()));
result.addKeyValuePair("tokenResetMethod", StringElement.of(tokenResetMethod()));
return result;
}
syn Element MMappingDefinition.toYAML() {
MappingElement result = new MappingElement();
result.addKeyValuePair("toType", StringElement.of(toType()));
result.addKeyValuePair("methodName", StringElement.of(methodName()));
result.addKeyValuePair("fromType", StringElement.of(fromType()));
result.addKeyValuePair("fromVariableName", StringElement.of(fromVariableName()));
result.addKeyValuePair("content", StringElement.of(
content().replace("\"", "\\\"").replace("\n", "\\n")));
return result;
}
syn Element MDependencyDefinition.toYAML() {
MappingElement result = new MappingElement();
result.addKeyValuePair("targetParentTypeName", StringElement.of(targetParentTypeName()));
result.addKeyValuePair("dependencyMethod", StringElement.of(dependencyMethod()));
result.addKeyValuePair("sourceParentTypeName", StringElement.of(sourceParentTypeName()));
result.addKeyValuePair("internalRelationPrefix", StringElement.of(internalRelationPrefix()));
return result;
}
syn Element MTokenComponent.toYAML() {
MappingElement result = new MappingElement();
result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName()));
result.addKeyValuePair("name", StringElement.of(name()));
result.addKeyValuePair("javaType", StringElement.of(javaType()));
result.addKeyValuePair("internalName", StringElement.of(internalName()));
ListElement dependencyDefinitions = new ListElement();
for (MDependencyDefinition def : getDependencyDefinitionList()) {
MappingElement inner = new MappingElement();
inner.addKeyValuePair("targetParentTypeName", StringElement.of(def.targetParentTypeName()));
inner.addKeyValuePair("internalRelationPrefix", StringElement.of(def.internalRelationPrefix()));
MappingElement targetEndpointDefinition = new MappingElement();
targetEndpointDefinition.addKeyValuePair("updateMethod", StringElement.of(def.targetEndpointDefinition().updateMethod()));
targetEndpointDefinition.addKeyValuePair("writeMethod", StringElement.of(def.targetEndpointDefinition().writeMethod()));
inner.addKeyValuePair("targetEndpointDefinition", targetEndpointDefinition);
dependencyDefinitions.addElement(inner);
}
result.addKeyValuePair("DependencyDefinitions", dependencyDefinitions);
return result;
}
ListElement MEndpointDefinition.innerMappingDefinitionsAsListElement() {
ListElement innerMappingDefinitions = new ListElement();
for (MInnerMappingDefinition def : getInnerMappingDefinitionList()) {
MappingElement inner = new MappingElement();
inner.addKeyValuePair("toType", StringElement.of(def.toType()));
inner.addKeyValuePair("methodName", StringElement.of(def.methodName()));
inner.addKeyValuePair("inputVarName", StringElement.of(def.inputVarName()));
inner.addKeyValuePair("outputVarName", StringElement.of(def.outputVarName()));
inner.addKeyValuePair("last", ValueElement.of(def.isLast()));
innerMappingDefinitions.addElement(inner);
}
return innerMappingDefinitions;
}
}
%header {:
package org.jastadd.ragconnect.parser;
import org.jastadd.ragconnect.ast.*;
:};
%goal goal;
%goal ragconnect;
RagConnect ragconnect
= endpoint_definition.d ragconnect.r {: r.getEndpointDefinitionList().insertChild(d, 0); return r; :}
| dependency_definition.d ragconnect.r {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :}
| mapping_definition.d ragconnect.r {: r.getMappingDefinitionList().insertChild(d, 0); return r; :}
| comment ragconnect.r {: return r; :}
| {: return new RagConnect(); :}
;
%embed {:
private Iterable<String> makeMappingDefs(ArrayList<?> raw_mapping_defs) {
return () -> raw_mapping_defs.stream().map(raw -> ((Symbol) raw).value.toString()).iterator();
}
private TokenEndpointDefinition enableAlwaysApply(TokenEndpointDefinition def) {
def.setAlwaysApply(true);
return def;
}
:} ;
EndpointDefinition endpoint_definition
= endpoint_definition_type.endpointDef SCOL
{:
return endpointDef;
:}
| endpoint_definition_type.endpointDef USING string_list.mapping_defs SCOL
{:
for (String mapping_def : makeMappingDefs(mapping_defs)) {
endpointDef.addMapping(MappingDefinition.createRef(mapping_def));
}
return endpointDef;
:}
;
EndpointDefinition endpoint_definition_type
= RECEIVE token_ref {: return new ReceiveTokenEndpointDefinition().setToken(token_ref); :}
| SEND token_ref {: return new SendTokenEndpointDefinition().setToken(token_ref); :}
;
TokenComponent token_ref
= ID.type_name DOT ID.token_name {: return TokenComponent.createRef(type_name + "." + token_name); :}
;
ArrayList string_list
= ID
| string_list COMMA ID
;
DependencyDefinition dependency_definition
= ID.target_type DOT ID.target_token CAN_DEPEND_ON ID.source_type DOT ID.source_token AS ID.id SCOL
{:
DependencyDefinition result = new DependencyDefinition();
result.setSource(TokenComponent.createRef(source_type + "." + source_token));
result.setTarget(TokenComponent.createRef(target_type + "." + target_token));
result.setID(id);
return result;
:}
;
MappingDefinition mapping_definition
= ID.id MAPS mapping_type.from_type ID.from_name TO mapping_type.to_type MAPPING_CONTENT.content
{:
MappingDefinition result = new MappingDefinition();
result.setID(id);
result.setFromType(from_type);
result.setFromVariableName(from_name);
result.setToType(to_type);
result.setContent(content.substring(2, content.length() - 2));
return result;
:}
;
MappingDefinitionType mapping_type
= java_type_use.type
{:
JavaMappingDefinitionType result = new JavaMappingDefinitionType();
result.setType(type);
return result;
:}
| java_type_use.type LBRACKET RBRACKET
{:
JavaArrayMappingDefinitionType result = new JavaArrayMappingDefinitionType();
result.setType(type);
return result;
:}
;
package org.jastadd.ragconnect.scanner;
import org.jastadd.ragconnect.parser.RagConnectParser.Terminals;
%%
%public
%final
%class RagConnectScanner
%extends beaver.Scanner
%type beaver.Symbol
%function nextToken
%yylexthrow beaver.Scanner.Exception
%scanerror RagConnectScanner.ScannerError
%x COMMENT
%s DECLARATION
%line
%column
"receive" { yybegin(DECLARATION); return sym(Terminals.RECEIVE); }
"send" { yybegin(DECLARATION); return sym(Terminals.SEND); }
"using" { return sym(Terminals.USING); }
"canDependOn" { return sym(Terminals.CAN_DEPEND_ON); }
"maps" { return sym(Terminals.MAPS); }
"to" { return sym(Terminals.TO); }
"as" { return sym(Terminals.AS); }
MappingContent = [{][:][^:]*[:]+([^:}][^:]*[:]+)*[}]
{MappingContent} { return sym(Terminals.MAPPING_CONTENT); }
package org.jastadd.ragconnect.compiler;
import java.io.IOException;
import java.io.Writer;
/**
* Writer appending to a StringBuilder.
*
* @author rschoene - Initial contribution
*/
public class AppendableWriter extends Writer {
private final StringBuilder sb;
public AppendableWriter(StringBuilder sb) {
this.sb = sb;
}
@Override
public void write(char[] chars, int off, int len) throws IOException {
sb.append(chars, off, len);
}
@Override
public void write(String str) throws IOException {
sb.append(str);
}
@Override
public void flush() {
}
@Override
public void close() {
}
}
package org.jastadd.ragconnect.compiler;
import beaver.Parser;
import org.jastadd.option.BooleanOption;
import org.jastadd.option.ValueOption;
import org.jastadd.relast.compiler.AbstractCompiler;
import org.jastadd.relast.compiler.CompilerException;
import org.jastadd.ragconnect.ast.*;
import org.jastadd.ragconnect.parser.RagConnectParser;
import org.jastadd.ragconnect.scanner.RagConnectScanner;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.*;
public class Compiler extends AbstractCompiler {
// private ValueOption optionOutputDir;
private ValueOption optionRootNode;
private ValueOption optionProtocols;
private BooleanOption optionPrintYaml;
private BooleanOption optionVerbose;
private BooleanOption optionLogReads;
private BooleanOption optionLogWrites;
private static final String OPTION_PROTOCOL_MQTT = "mqtt";
private static final String OPTION_PROTOCOL_REST = "rest";
public Compiler() {
super("ragconnect", true);
}
@Override
protected int compile() throws CompilerException {
if (getConfiguration().shouldPrintVersion()) {
System.out.println(readVersion());
return 0;
}
if (getConfiguration().shouldPrintHelp()) {
getConfiguration().printHelp(System.out);
return 0;
}
printMessage("Running RagConnect " + readVersion());
if (!getConfiguration().outputDir().exists()) {
try {
Files.createDirectories(getConfiguration().outputDir().toPath());
} catch (IOException e) {
throw new CompilerException("Error creating output dir " + getConfiguration().outputDir(), e);
}
}
if (!optionRootNode.isMatched()) {
return error("Root node not specified");
}
RagConnect ragConnect = parseProgram(getConfiguration().getFiles());
if (!ragConnect.errors().isEmpty()) {
System.err.println("Errors:");
for (ErrorMessage e : ragConnect.errors()) {
System.err.println(e);
}
System.exit(1);
}
if (optionPrintYaml.value()) {
ASTNode.rootNode = ragConnect.getProgram().resolveTypeDecl(optionRootNode.value());
String yamlContent = ragConnect.toMustache().toYAML().prettyPrint();
System.out.println(yamlContent);
writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.yml"), yamlContent);
return 0;
}
printMessage("Writing output files");
final List<String> handlers = new ArrayList<>();
if (ASTNode.usesMqtt) {
handlers.add("MqttHandler.jadd");
}
if (ASTNode.usesRest) {
handlers.add("RestHandler.jadd");
}
// copy handlers into outputDir
for (String handlerFileName : handlers) {
try {
InputStream inputStream = Compiler.class.getClassLoader().getResourceAsStream(handlerFileName);
if (inputStream == null) {
throw new CompilerException("Could not open " + handlerFileName);
}
Files.copy(inputStream,
getConfiguration().outputDir().toPath().resolve(handlerFileName),
StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
throw new CompilerException("Could not copy " + handlerFileName, e);
}
}
for (GrammarFile grammarFile : ragConnect.getProgram().getGrammarFileList()) {
Path outputFile = getConfiguration().outputDir().toPath().resolve(grammarFile.getFileName());
writeToFile(outputFile, grammarFile.generateAbstractGrammar());
}
writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.jadd"), ragConnect.generateAspect(optionRootNode.value()));
return 0;
}
public static void main(String[] args) {
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
System.setProperty("mustache.debug", "true");
try {
new Compiler().run(args);
} catch (CompilerException e) {
e.printStackTrace();
System.exit(1);
}
}
/**
* Reads the version string.
*
* The version string is read from the property file
* src/main/resources/Version.properties. This
* file should be generated during the build process. If it is missing
* then there is some problem in the build script.
*
* @author Jesper Öqvist <jesper.oqvist@cs.lth.se>
* @return the read version string, or <code>version ?</code>
*/
private String readVersion() {
try {
ResourceBundle resources = ResourceBundle.getBundle("ragConnectVersion");
return resources.getString("version");
} catch (MissingResourceException e) {
return "version ?";
}
}
private void printMessage(String message) {
System.out.println(message);
}
private void writeToFile(Path path, String str) throws CompilerException {
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
writer.append(str);
} catch (Exception e) {
throw new CompilerException("Could not write to file " + path.toAbsolutePath(), e);
}
}
protected void initOptions() {
super.initOptions();
optionRootNode = addOption(
new ValueOption("rootNode", "root node in the base grammar.")
.acceptAnyValue()
.needsValue(true));
optionProtocols = addOption(
new ValueOption("protocols", "Protocols to enable")
.acceptMultipleValues(true)
.addDefaultValue(OPTION_PROTOCOL_MQTT, "Enable MQTT")
.addAcceptedValue(OPTION_PROTOCOL_REST, "Enable REST")
);
optionPrintYaml = addOption(
new BooleanOption("printYaml", "Print out YAML instead of generating files")
.defaultValue(false));
optionVerbose = addOption(
new BooleanOption("verbose", "Print more messages while compiling.")
.defaultValue(false));
optionLogReads = addOption(
new BooleanOption("logReads", "Enable logging for every read.")
.defaultValue(false));
optionLogWrites = addOption(
new BooleanOption("logWrites", "Enable logging for every write.")
.defaultValue(false));
}
private RagConnect parseProgram(Collection<String> files) throws CompilerException {
Program program = new Program();
boolean atLeastOneGrammar = false;
boolean atLeastOneRagConnect = false;
RagConnect ragConnect = new RagConnect();
ragConnect.setProgram(program);
GrammarFile ragConnectGrammarPart = new GrammarFile();
ragConnectGrammarPart.setFileName("RagConnect.relast");
program.addGrammarFile(ragConnectGrammarPart);
for (String filename : files) {
String extension = filename.substring(filename.lastIndexOf('.') + 1);
switch (extension) {
case "ast":
case "relast":
// processGrammar
parseGrammar(program, filename);
atLeastOneGrammar = true;
break;
case "connect":
case "ragconnect":
// process ragConnect
RagConnect parsedRagConnect = parseRagConnect(program, filename);
mergeRagConnectDefinitions(ragConnect, parsedRagConnect);
atLeastOneRagConnect = true;
break;
default:
throw new CompilerException("Unknown file extension in " + filename);
}
}
if (!atLeastOneGrammar) {
System.err.println("No grammar file specified! (*.ast, *.relast)");
}
if (!atLeastOneRagConnect) {
System.err.println("No ragconnect file specified! (*.connect, *.ragconnect)");
}
if (!atLeastOneGrammar && !atLeastOneRagConnect) {
System.exit(1);
}
ragConnect.treeResolveAll();
ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
ASTNode.loggingEnabledForReads = optionLogReads.value();
ASTNode.loggingEnabledForWrites = optionLogWrites.value();
ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT);
ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST);
return ragConnect;
}
private void parseGrammar(Program program, String filename) throws CompilerException {
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
RagConnectScanner scanner = new RagConnectScanner(reader);
RagConnectParser parser = new RagConnectParser();
GrammarFile grammarFile = (GrammarFile) parser.parse(scanner);
if (optionVerbose.value()) {
grammarFile.dumpTree(System.out);
}
program.addGrammarFile(grammarFile);
grammarFile.treeResolveAll();
grammarFile.setFileName(toBaseName(filename));
} catch (IOException | Parser.Exception e) {
throw new CompilerException("Could not parse grammar file " + filename, e);
}
}
private RagConnect parseRagConnect(Program program, String filename) throws CompilerException {
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
RagConnectScanner scanner = new RagConnectScanner(reader);
RagConnectParser parser = new RagConnectParser();
RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect);
ragConnect.setProgram(program);
ragConnect.setFileName(toBaseName(filename));
return ragConnect;
} catch (IOException | Parser.Exception e) {
throw new CompilerException("Could not parse connect file " + filename, e);
}
}
/**
* Extracts the basename of the given file, with file extension
* @param filename the given filename
* @return the basename
*/
private String toBaseName(String filename) {
return new File(filename).getName();
}
private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) {
for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) {
ragConnect.addEndpointDefinition(endpointDefinition);
}
for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) {
ragConnect.addMappingDefinition(mappingDefinition);
}
for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) {
ragConnect.addDependencyDefinition(dependencyDefinition);
}
}
// protected void printUsage() {
// System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ... <filename1> <filename2> ... ");
// System.out.println("Options:");
// System.out.print(commandLine.printOptionHelp());
// }
}
package org.jastadd.ragconnect.compiler;
import org.jastadd.ragconnect.ast.*;
import org.jastadd.ragconnect.parser.RagConnectParser;
import org.jastadd.ragconnect.scanner.RagConnectScanner;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Testing Ros2Rag without parser.
*
* @author rschoene - Initial contribution
*/
public class SimpleMain {
private static void printManualYAML() {
Document doc = new Document();
KeyValuePair root = new KeyValuePair();
root.setKey("panda_mqtt_connector");
MappingElement firstLevel = new MappingElement();
firstLevel.addKeyValuePair(new KeyValuePair("server", new StringElement("tcp://localhost:1883")));
firstLevel.addKeyValuePair(new KeyValuePair("robot_speed_factor", new ValueElement(".7")));
KeyValuePair topics = new KeyValuePair();
topics.setKey("topics");
MappingElement theTopics = new MappingElement();
theTopics.addKeyValuePair(new KeyValuePair("robotConfig", new StringElement("robotconfig")));
theTopics.addKeyValuePair(new KeyValuePair("trajectory", new StringElement("trajectory")));
theTopics.addKeyValuePair(new KeyValuePair("nextStep", new StringElement("ros2rag/nextStep")));
topics.setValue(theTopics);
firstLevel.addKeyValuePair(topics);
firstLevel.addKeyValuePair(new KeyValuePair("zone_size", new ValueElement("0.5")));
KeyValuePair zones = new KeyValuePair();
zones.setKey("zones");
ListElement theZones = new ListElement();
theZones.addElement(new StringElement("1 1"));
theZones.addElement(new StringElement("0 1"));
theZones.addElement(new StringElement("-1 1"));
zones.setValue(theZones);
firstLevel.addKeyValuePair(zones);
KeyValuePair parts = new KeyValuePair();
parts.setKey("end_effectors");
KeyValuePair pandaParts = new KeyValuePair();
pandaParts.setKey("panda");
MappingElement thePanda = new MappingElement();
thePanda.addKeyValuePair(new KeyValuePair("Link0", new StringElement("panda_link0")));
thePanda.addKeyValuePair(new KeyValuePair("Link1", new StringElement("panda_link1")));
thePanda.addKeyValuePair(new KeyValuePair("Link2", new StringElement("panda_link2")));
thePanda.addKeyValuePair(new KeyValuePair("Link3", new StringElement("panda_link3")));
thePanda.addKeyValuePair(new KeyValuePair("Link4", new StringElement("panda_link4")));
thePanda.addKeyValuePair(new KeyValuePair("Link5", new StringElement("panda_link5")));
thePanda.addKeyValuePair(new KeyValuePair("Link6", new StringElement("panda_link6")));
thePanda.addKeyValuePair(new KeyValuePair("RightFinger", new StringElement("panda_rightfinger")));
thePanda.addKeyValuePair(new KeyValuePair("LeftFinger", new StringElement("panda_leftfinger")));
pandaParts.setValue(thePanda);
parts.setValue(pandaParts);
firstLevel.addKeyValuePair(parts);
KeyValuePair end_effectors = new KeyValuePair();
end_effectors.setKey("end_effectors");
KeyValuePair endEffectorParts = new KeyValuePair();
endEffectorParts.setKey("panda");
endEffectorParts.setValue(new KeyValuePair("EndEffector", new StringElement("panda_hand")));
end_effectors.setValue(endEffectorParts);
firstLevel.addKeyValuePair(end_effectors);
KeyValuePair goalPoses = new KeyValuePair();
goalPoses.setKey("goal_poses");
ListElement theGoalPoses = new ListElement();
addPose(theGoalPoses, "0.4 0.4 0.3");
addPose(theGoalPoses, "-0.4 0.4 0.3");
addPose(theGoalPoses, "-0.4 -0.4 0.3");
addPose(theGoalPoses, "0.4 0.4 0.3");
addPose(theGoalPoses, "-0.4 0.4 0.3");
addPose(theGoalPoses, "0.4 0.4 0.3");
goalPoses.setValue(theGoalPoses);
firstLevel.addKeyValuePair(goalPoses);
root.setValue(firstLevel);
doc.addComplexElement(root);
System.out.println(doc.prettyPrint());
}
private static void addPose(ListElement theGoalPoses, String position) {
MappingElement goalPose1 = new MappingElement();
goalPose1.addKeyValuePair(new KeyValuePair("position", new StringElement(position)));
goalPose1.addKeyValuePair(new KeyValuePair("orientation", new StringElement("1 1 0 0")));
goalPose1.addKeyValuePair(new KeyValuePair("work", new StringElement("20000")));
theGoalPoses.addElement(goalPose1);
}
public static void main(String[] args) {
printManualYAML();
}
}
package org.jastadd.ragconnect.compiler;
import java.util.*;
import java.util.function.Predicate;
import static java.util.stream.Collectors.toList;
public class Utils {
public static <T> List<T> filterToList(Collection<T> collection, Predicate<T> predicate) {
return collection.stream().filter(predicate).collect(toList());
}
public static <T> Set<T> asSet(T... t) {
return new HashSet<T>(Arrays.asList(t));
}
}
import java.io.IOException;
import java.util.concurrent.TimeUnit;aspect MqttHandler {
public class MqttServerHandler {
private final java.util.Map<String, MqttHandler> handlers = new java.util.HashMap<>();
private long time;
private java.util.concurrent.TimeUnit unit;
private String name;
public MqttServerHandler() {
this("RagConnect");
}
public MqttServerHandler(String name) {
this.name = name;
setupWaitUntilReady(1, TimeUnit.SECONDS);
}
public void setupWaitUntilReady(long time, java.util.concurrent.TimeUnit unit) {
this.time = time;
this.unit = unit;
}
public MqttHandler resolveHandler(java.net.URI uri) throws IOException {
MqttHandler handler = handlers.get(uri.getHost());
if (handler == null) {
// first connect to that server
handler = new MqttHandler();
if (uri.getPort() == -1) {
handler.setHost(uri.getHost());
} else {
handler.setHost(uri.getHost(), uri.getPort());
}
handlers.put(uri.getHost(), handler);
}
handler.waitUntilReady(this.time, this.unit);
return handler;
}
public boolean newConnection(java.net.URI uri, java.util.function.Consumer<byte[]> callback) throws IOException {
return resolveHandler(uri).newConnection(extractTopic(uri), callback);
}
public void publish(java.net.URI uri, byte[] bytes) throws IOException {
resolveHandler(uri).publish(extractTopic(uri), bytes);
}
public void publish(java.net.URI uri, byte[] bytes, boolean retain) throws IOException {
resolveHandler(uri).publish(extractTopic(uri), bytes, retain);
}
public void publish(java.net.URI uri, byte[] bytes,
org.fusesource.mqtt.client.QoS qos, boolean retain) throws IOException {
resolveHandler(uri).publish(extractTopic(uri), bytes, qos, retain);
}
private String extractTopic(java.net.URI uri) {
String path = uri.getPath();
if (path.charAt(0) == '/') {
path = path.substring(1);
}
return path;
}
public void close() {
for (MqttHandler handler : handlers.values()) {
handler.close();
}
}
}
/**
* Helper class to receive updates via MQTT and use callbacks to handle those messages.
*
* @author rschoene - Initial contribution
*/
public class MqttHandler {
private static final int DEFAULT_PORT = 1883;
private final org.apache.logging.log4j.Logger logger;
private final String name;
/** The host running the MQTT broker. */
private java.net.URI host;
/** The connection to the MQTT broker. */
private org.fusesource.mqtt.client.CallbackConnection connection;
/** Whether we are connected yet */
private final java.util.concurrent.CountDownLatch readyLatch;
private boolean sendWelcomeMessage = true;
private org.fusesource.mqtt.client.QoS qos;
/** Dispatch knowledge */
private final java.util.Map<String, java.util.List<java.util.function.Consumer<byte[]>>> callbacks;
public MqttHandler() {
this("RagConnect");
}
public MqttHandler(String name) {
this.name = java.util.Objects.requireNonNull(name, "Name must be set");
this.logger = org.apache.logging.log4j.LogManager.getLogger(MqttHandler.class);
this.callbacks = new java.util.HashMap<>();
this.readyLatch = new java.util.concurrent.CountDownLatch(1);
this.qos = org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE;
}
public MqttHandler dontSendWelcomeMessage() {
this.sendWelcomeMessage = false;
return this;
}
/**
* Sets the host (with default port) to receive messages from, and connects to it.
* @throws IOException if could not connect, or could not subscribe to a topic
* @return self
*/
public MqttHandler setHost(String host) throws java.io.IOException {
return setHost(host, DEFAULT_PORT);
}
/**
* Sets the host to receive messages from, and connects to it.
* @throws IOException if could not connect, or could not subscribe to a topic
* @return self
*/
public MqttHandler setHost(String host, int port) throws java.io.IOException {
java.util.Objects.requireNonNull(host, "Host need to be set!");
this.host = java.net.URI.create("tcp://" + host + ":" + port);
logger.debug("Host for {} is {}", this.name, this.host);
org.fusesource.mqtt.client.MQTT mqtt = new org.fusesource.mqtt.client.MQTT();
mqtt.setHost(this.host);
connection = mqtt.callbackConnection();
java.util.concurrent.atomic.AtomicReference<Throwable> error = new java.util.concurrent.atomic.AtomicReference<>();
// add the listener to dispatch messages later
connection.listener(new org.fusesource.mqtt.client.ExtendedListener() {
public void onConnected() {
logger.debug("Connected");
}
@Override
public void onDisconnected() {
logger.debug("Disconnected");
}
@Override
public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topic, org.fusesource.hawtbuf.Buffer body, org.fusesource.mqtt.client.Callback<org.fusesource.mqtt.client.Callback<Void>> ack) {
String topicString = topic.toString();
java.util.List<java.util.function.Consumer<byte[]>> callbackList = callbacks.get(topicString);
if (callbackList == null || callbackList.isEmpty()) {
logger.debug("Got a message, but no callback to call. Forgot to subscribe?");
} else {
byte[] message = body.toByteArray();
// System.out.println("message = " + Arrays.toString(message));
for (java.util.function.Consumer<byte[]> callback : callbackList) {
callback.accept(message);
}
}
ack.onSuccess(null); // always acknowledge message
}
@Override
public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topicBuffer, org.fusesource.hawtbuf.Buffer body, Runnable ack) {
logger.warn("onPublish should not be called");
}
@Override
public void onFailure(Throwable cause) {
// logger.catching(cause);
error.set(cause);
}
});
throwIf(error);
// actually establish the connection
connection.connect(new org.fusesource.mqtt.client.Callback<Void>() {
@Override
public void onSuccess(Void value) {
if (MqttHandler.this.sendWelcomeMessage) {
connection.publish("components", (name + " is connected").getBytes(), org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE, false, new org.fusesource.mqtt.client.Callback<Void>() {
@Override
public void onSuccess(Void value) {
logger.debug("success sending welcome message");
setReady();
}
@Override
public void onFailure(Throwable value) {
logger.debug("failure sending welcome message", value);
}
});
} else {
setReady();
}
}
@Override
public void onFailure(Throwable cause) {
// logger.error("Could not connect", cause);
error.set(cause);
}
});
throwIf(error);
return this;
}
public java.net.URI getHost() {
return host;
}
private void setReady() {
readyLatch.countDown();
}
private void throwIf(java.util.concurrent.atomic.AtomicReference<Throwable> error) throws java.io.IOException {
if (error.get() != null) {
throw new java.io.IOException(error.get());
}
}
public void setQoSForSubscription(org.fusesource.mqtt.client.QoS qos) {
this.qos = qos;
}
public boolean newConnection(String topic, java.util.function.Consumer<byte[]> callback) {
if (readyLatch.getCount() > 0) {
System.err.println("Handler not ready");
return false;
// // should maybe be something more kind than throwing an exception here
// throw new IllegalStateException("Updater not ready");
}
// register callback
logger.debug("new connection for {}", topic);
if (callbacks.get(topic) == null) {
callbacks.put(topic, new java.util.ArrayList<>());
// subscribe at broker
org.fusesource.mqtt.client.Topic[] topicArray = { new org.fusesource.mqtt.client.Topic(topic, this.qos) };
connection.getDispatchQueue().execute(() -> {
connection.subscribe(topicArray, new org.fusesource.mqtt.client.Callback<byte[]>() {
@Override
public void onSuccess(byte[] qoses) {
logger.debug("Subscribed to {}, qoses: {}", topic, qoses);
}
@Override
public void onFailure(Throwable cause) {
logger.error("Could not subscribe to {}", topic, cause);
}
});
});
}
callbacks.get(topic).add(callback);
return true;
}
/**
* Waits until this updater is ready to receive MQTT messages.
* If it already is ready, return immediately with the value <code>true</code>.
* Otherwise waits for the given amount of time, and either return <code>true</code> within the timespan,
* if it got ready, or <code>false</code> upon a timeout.
* @param time the maximum time to wait
* @param unit the time unit of the time argument
* @return whether this updater is ready
*/
public boolean waitUntilReady(long time, java.util.concurrent.TimeUnit unit) {
try {
return readyLatch.await(time, unit);
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
public void close() {
if (connection == null) {
logger.warn("Stopping without connection. Was setHost() called?");
return;
}
connection.getDispatchQueue().execute(() -> {
connection.disconnect(new org.fusesource.mqtt.client.Callback<Void>() {
@Override
public void onSuccess(Void value) {
logger.info("Disconnected {} from {}", name, host);
}
@Override
public void onFailure(Throwable ignored) {
// Disconnects never fail. And we do not care either.
}
});
});
}
public void publish(String topic, byte[] bytes) {
publish(topic, bytes, false);
}
public void publish(String topic, byte[] bytes, boolean retain) {
publish(topic, bytes, this.qos, retain);
}
public void publish(String topic, byte[] bytes, org.fusesource.mqtt.client.QoS qos, boolean retain) {
connection.getDispatchQueue().execute(() -> {
connection.publish(topic, bytes, qos, retain, new org.fusesource.mqtt.client.Callback<Void>() {
@Override
public void onSuccess(Void value) {
logger.debug("Published some bytes to {}", topic);
}
@Override
public void onFailure(Throwable value) {
logger.warn("Could not publish on topic '{}'", topic, value);
}
});
});
}
}
}
import java.util.concurrent.TimeUnit;aspect RestHandler {
public class RestServerHandler {
private static final int DEFAULT_PORT = 4567;
private final java.util.Map<Integer, RestHandler> handlers = new java.util.HashMap<>();
private String name;
public RestServerHandler() {
this("RagConnect");
}
public RestServerHandler(String name) {
this.name = name;
}
private RestHandler resolveHandler(java.net.URI uri) {
int port = uri.getPort() != -1 ? uri.getPort() : DEFAULT_PORT;
RestHandler handler = handlers.get(port);
if (handler == null) {
// first connect to that server
handler = new RestHandler();
handler.setPort(port);
handlers.put(port, handler);
}
return handler;
}
public boolean newPUTConnection(java.net.URI uri, java.util.function.Consumer<String> callback) {
resolveHandler(uri).newPUTConnection(uri.getPath(), callback);
return true;
}
public boolean newGETConnection(java.net.URI uri, SupplierWithException<String> supplier) {
resolveHandler(uri).newGETConnection(uri.getPath(), supplier);
return true;
}
public void close() {
for (RestHandler handler : handlers.values()) {
handler.close();
}
}
}
/**
* Helper class to receive updates and publishes information via REST.
* @author rschoene - Initial contribution
*/
public class RestHandler {
private static final int DEFAULT_PORT = 4567;
private final org.apache.logging.log4j.Logger logger;
private final String name;
private int port;
private final java.util.concurrent.CountDownLatch exitCondition;
/** Dispatch knowledge */
private final java.util.Map<String, java.util.List<java.util.function.Consumer<String>>> callbacks;
private final java.util.Map<String, SupplierWithException<String>> suppliers;
public RestHandler() {
this("RagConnect");
}
public RestHandler(String name) {
this.logger = org.apache.logging.log4j.LogManager.getLogger(RestHandler.class);
this.name = name;
this.port = DEFAULT_PORT;
this.exitCondition = new java.util.concurrent.CountDownLatch(1);
this.callbacks = new java.util.HashMap<>();
this.suppliers = new java.util.HashMap<>();
}
public RestHandler setPort(int port) {
this.port = port;
start();
return this;
}
public void newPUTConnection(String path, java.util.function.Consumer<String> callback) {
if (callbacks.containsKey(path)) {
callbacks.get(path).add(callback);
} else {
// setup path
java.util.List<java.util.function.Consumer<String>> callbackList = new java.util.ArrayList<>();
callbackList.add(callback);
callbacks.put(path, callbackList);
spark.Spark.put(path, (request, response) -> {
String content = request.body();
java.util.Set<String> errors = new java.util.HashSet<>();
for (java.util.function.Consumer<String> f : callbackList) {
try {
f.accept(content);
} catch (Exception e) {
errors.add(e.getMessage());
}
}
if (errors.isEmpty()) {
return "OK";
} else {
return makeError(response, 500, errors.stream().collect(java.util.stream.Collectors.joining("\n", "The following error(s) happened: [", "]")));
}
});
}
}
public void newGETConnection(String path, SupplierWithException<String> supplier) {
if (suppliers.get(path) != null) {
logger.warn("Overriding existing supplier for '{}'", path);
}
suppliers.put(path, supplier);
spark.Spark.get(path, (request, response) -> {
try {
return supplier.get();
} catch (Exception e) {
return makeError(response, 500, e.getMessage());
}
});
}
private String makeError(spark.Response response, int statusCode, String message) {
response.status(statusCode);
return message;
}
private void start() {
logger.info("Starting REST server at {}", this.port);
spark.Spark.port(this.port);
spark.Spark.init();
spark.Spark.awaitInitialization();
}
public void close() {
spark.Spark.stop();
spark.Spark.awaitStop();
}
}
@FunctionalInterface
public interface SupplierWithException<T> {
public T get() throws Exception;
}
}
public void {{targetParentTypeName}}.{{dependencyMethod}}({{sourceParentTypeName}} source) {
add{{internalRelationPrefix}}Source(source);
}
String scheme,host, path;
java.net.URI uri;
try {
uri = new java.net.URI({{connectParameterName}});
scheme = uri.getScheme();
host = uri.getHost();
path = uri.getPath();
} catch (java.net.URISyntaxException e) {
System.err.println(e.getMessage()); // Maybe re-throw error?
return false;
}
aspect RagConnectHandler {
interface RagConnectHandler<T> {
boolean connectReceive(String path, java.util.function.Consumer<T> callback);
boolean sendPush(String path, T value);
boolean connectSendPull(String path, SupplierWithException<T> supplier);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment