blob: ce93bfdd26bf5485f454449ec25d86ab40e45cbc [file] [log] [blame]
/**
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*
*
* This copyright notice shows up in the generated Java code
*/
package org.eclipse.osbp.xtext.topologydsl.jvmmodel;
import com.vaadin.annotations.JavaScript;
import com.vaadin.shared.ui.JavaScriptComponentState;
import com.vaadin.ui.AbstractJavaScriptComponent;
import java.util.ArrayList;
import javax.inject.Inject;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.emf.common.util.EList;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.xtext.topologydsl.Topology;
import org.eclipse.osbp.xtext.topologydsl.jvmmodel.D3JsJavaUtil;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.common.types.JvmAnnotationReference;
import org.eclipse.xtext.common.types.JvmAnnotationValue;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmStringAnnotationValue;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.common.types.TypesFactory;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.JvmAnnotationReferenceBuilder;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypeReferenceBuilder;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.slf4j.Logger;
@SuppressWarnings("all")
public class TopologyDSLD3JavaComponentsCreator {
@Inject
@Extension
private JvmTypesBuilder _jvmTypesBuilder;
@Inject
@Extension
private D3JsJavaUtil _d3JsJavaUtil;
@Inject
private TypesFactory typesFactory;
public void createJsJavaComponent(final Topology topology, final IJvmDeclaredTypeAcceptor acceptor, final JvmTypeReferenceBuilder typeReferenceBuilder, final JvmAnnotationReferenceBuilder annotationTypesBuilder) {
String _name = topology.getName();
boolean _tripleNotEquals = (_name != null);
if (_tripleNotEquals) {
final String stateClassName = this._d3JsJavaUtil.createStateFilename(topology);
JvmGenericType topology_cls = this._jvmTypesBuilder.toClass(topology, this._d3JsJavaUtil.createfullyQualifiedTopologyFilename(topology));
JvmGenericType state_cls = this._jvmTypesBuilder.toClass(topology, this._d3JsJavaUtil.createfullyQualifiedStateFilename(topology));
final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
@Override
public void apply(final JvmGenericType it) {
EList<JvmTypeReference> _superTypes = it.getSuperTypes();
JvmTypeReference _typeRef = typeReferenceBuilder.typeRef(AbstractJavaScriptComponent.class);
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
JvmAnnotationReference jsAnnotationRef = annotationTypesBuilder.annotationRef(JavaScript.class);
StringConcatenation _builder = new StringConcatenation();
_builder.append("theme://plugin/org.eclipse.osbp.utils.js/org/eclipse/osbp/utils/js/d3.min.js");
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("theme://plugin/org.eclipse.osbp.utils.js/org/eclipse/osbp/utils/js/topojson.v1.min.js");
StringConcatenation _builder_2 = new StringConcatenation();
_builder_2.append("js/");
String _createTopologyJsFilename = TopologyDSLD3JavaComponentsCreator.this._d3JsJavaUtil.createTopologyJsFilename(topology);
_builder_2.append(_createTopologyJsFilename);
ArrayList<String> jsAnnotationList = CollectionLiterals.<String>newArrayList(_builder.toString(), _builder_1.toString(), _builder_2.toString());
TopologyDSLD3JavaComponentsCreator.this.addStringValuesToAnnotation(jsAnnotationRef, jsAnnotationList);
EList<JvmAnnotationReference> _annotations = it.getAnnotations();
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, jsAnnotationRef);
TopologyDSLD3JavaComponentsCreator.this.toTopologyConstructor(it, topology, typeReferenceBuilder);
TopologyDSLD3JavaComponentsCreator.this.toFields(it, topology, typeReferenceBuilder);
TopologyDSLD3JavaComponentsCreator.this.toTopologyOperations(it, topology, stateClassName, typeReferenceBuilder);
}
};
acceptor.<JvmGenericType>accept(topology_cls, _function);
final Procedure1<JvmGenericType> _function_1 = new Procedure1<JvmGenericType>() {
@Override
public void apply(final JvmGenericType it) {
EList<JvmTypeReference> _superTypes = it.getSuperTypes();
JvmTypeReference _typeRef = typeReferenceBuilder.typeRef(JavaScriptComponentState.class);
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
TopologyDSLD3JavaComponentsCreator.this.toTopologyStateFields(it, topology, typeReferenceBuilder);
}
};
acceptor.<JvmGenericType>accept(state_cls, _function_1);
}
}
/**
* <p>build the class variables.</p>
*/
public void toFields(final JvmDeclaredType type, final Topology topology, final JvmTypeReferenceBuilder typeReferenceBuilder) {
JvmField field = null;
final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("org.slf4j.LoggerFactory.getLogger(\"topology\")");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
field = this._jvmTypesBuilder.toField(topology, "log", typeReferenceBuilder.typeRef(Logger.class), _function);
field.setStatic(true);
field.setVisibility(JvmVisibility.PRIVATE);
EList<JvmMember> _members = type.getMembers();
this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
}
public void toTopologyOperations(final JvmDeclaredType type, final Topology topology, final String stateClassName, final JvmTypeReferenceBuilder typeReferenceBuilder) {
EList<JvmMember> _members = type.getMembers();
final Procedure1<JvmOperation> _function = new Procedure1<JvmOperation>() {
@Override
public void apply(final JvmOperation it) {
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return (");
_builder.append(stateClassName);
_builder.append(") super.getState();");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setBody(it, _function);
}
};
JvmOperation _method = this._jvmTypesBuilder.toMethod(topology, "getState", typeReferenceBuilder.typeRef(stateClassName), _function);
this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
}
public CharSequence getD3StateVars() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("getState().jsonData = _jsonData;");
_builder.newLine();
_builder.append("getState().htmlTagId=_htmlTagId;");
_builder.newLine();
_builder.append("getState().panelWidth = new Integer(width).toString();");
_builder.newLine();
_builder.append("getState().panelHeight = new Integer(height).toString();");
_builder.newLine();
return _builder;
}
public JvmConstructor getTopologyConstructor(final JvmDeclaredType type, final Topology topology, final JvmTypeReferenceBuilder typeReferenceBuilder) {
final Procedure1<JvmConstructor> _function = new Procedure1<JvmConstructor>() {
@Override
public void apply(final JvmConstructor it) {
EList<JvmFormalParameter> _parameters = it.getParameters();
JvmFormalParameter _parameter = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "_htmlTagId", typeReferenceBuilder.typeRef(String.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
EList<JvmFormalParameter> _parameters_1 = it.getParameters();
JvmFormalParameter _parameter_1 = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "eventDispatcher", typeReferenceBuilder.typeRef(IEventDispatcher.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
EList<JvmFormalParameter> _parameters_2 = it.getParameters();
JvmFormalParameter _parameter_2 = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "perspective", typeReferenceBuilder.typeRef(MPerspective.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_2, _parameter_2);
EList<JvmFormalParameter> _parameters_3 = it.getParameters();
JvmFormalParameter _parameter_3 = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "_jsonData", typeReferenceBuilder.typeRef(String.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_3, _parameter_3);
EList<JvmFormalParameter> _parameters_4 = it.getParameters();
JvmFormalParameter _parameter_4 = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "width", typeReferenceBuilder.typeRef(int.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_4, _parameter_4);
EList<JvmFormalParameter> _parameters_5 = it.getParameters();
JvmFormalParameter _parameter_5 = TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.toParameter(topology, "height", typeReferenceBuilder.typeRef(int.class));
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_5, _parameter_5);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
it.append(TopologyDSLD3JavaComponentsCreator.this.getD3StateVars());
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setBody(it, _function);
}
};
return this._jvmTypesBuilder.toConstructor(topology, _function);
}
public void toTopologyConstructor(final JvmDeclaredType type, final Topology topology, final JvmTypeReferenceBuilder typeReferenceBuilder) {
JvmConstructor constructor = this.getTopologyConstructor(type, topology, typeReferenceBuilder);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
CharSequence _d3StateVars = TopologyDSLD3JavaComponentsCreator.this.getD3StateVars();
_builder.append(_d3StateVars);
_builder.newLineIfNotEmpty();
_builder.append("addFunction(\"on");
String _fileName = topology.getFileName();
_builder.append(_fileName);
_builder.append("Click\", new JavaScriptFunction() {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("@Override");
_builder.newLine();
_builder.append("\t");
_builder.append("public void call(JsonArray arguments){");
_builder.newLine();
_builder.append("\t\t");
_builder.append("try {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("EventDispatcherEvent evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, \"Topology\", \"");
String _name = topology.getName();
_builder.append(_name, "\t\t\t");
_builder.append("\");");
_builder.newLineIfNotEmpty();
_builder.append("\t\t\t");
_builder.append("if(arguments.get(0) instanceof JreJsonString && arguments.get(1) instanceof JreJsonString) {");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("evnt.addItem(EventDispatcherDataTag.LIST, arguments.getString(0)+\".\"+arguments.getString(1));");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("eventDispatcher.sendEvent(evnt);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("} catch (JsonException jsonExp){");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("log.error(\"");
String _fileName_1 = topology.getFileName();
_builder.append(_fileName_1, "\t\t\t");
_builder.append("Click - JsonException: no property available\"); \t");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("});");
it.append(_builder);
}
};
this._jvmTypesBuilder.setBody(constructor, _function);
EList<JvmMember> _members = type.getMembers();
this._jvmTypesBuilder.<JvmConstructor>operator_add(_members, constructor);
}
public void addStringValuesToAnnotation(final JvmAnnotationReference annotationRef, final ArrayList<String> annotationStringList) {
JvmStringAnnotationValue value = this.typesFactory.createJvmStringAnnotationValue();
for (final String annotationString : annotationStringList) {
EList<String> _values = value.getValues();
this._jvmTypesBuilder.<String>operator_add(_values, annotationString);
}
EList<JvmAnnotationValue> _explicitValues = annotationRef.getExplicitValues();
this._jvmTypesBuilder.<JvmStringAnnotationValue>operator_add(_explicitValues, value);
}
public void toTopologyStateFields(final JvmDeclaredType type, final Topology topology, final JvmTypeReferenceBuilder typeReferenceBuilder) {
EList<JvmMember> _members = type.getMembers();
final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"\"");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
JvmField _field = this._jvmTypesBuilder.toField(topology, "jsonData", typeReferenceBuilder.typeRef(String.class), _function);
this._jvmTypesBuilder.<JvmField>operator_add(_members, _field);
EList<JvmMember> _members_1 = type.getMembers();
final Procedure1<JvmField> _function_1 = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"\"");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
JvmField _field_1 = this._jvmTypesBuilder.toField(topology, "htmlTagId", typeReferenceBuilder.typeRef(String.class), _function_1);
this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field_1);
EList<JvmMember> _members_2 = type.getMembers();
final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"\"");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
JvmField _field_2 = this._jvmTypesBuilder.toField(topology, "panelWidth", typeReferenceBuilder.typeRef(String.class), _function_2);
this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
EList<JvmMember> _members_3 = type.getMembers();
final Procedure1<JvmField> _function_3 = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"\"");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
JvmField _field_3 = this._jvmTypesBuilder.toField(topology, "panelHeight", typeReferenceBuilder.typeRef(String.class), _function_3);
this._jvmTypesBuilder.<JvmField>operator_add(_members_3, _field_3);
EList<JvmMember> _members_4 = type.getMembers();
final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
@Override
public void apply(final JvmField it) {
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
@Override
public void apply(final ITreeAppendable it) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"\"");
it.append(_builder);
}
};
TopologyDSLD3JavaComponentsCreator.this._jvmTypesBuilder.setInitializer(it, _function);
}
};
JvmField _field_4 = this._jvmTypesBuilder.toField(topology, "inputValue", typeReferenceBuilder.typeRef(String.class), _function_4);
this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_4);
}
public CharSequence createD3Topology(final Topology topology) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("InputStream json = getClass().getResourceAsStream(\"/topologies/");
String _fileName = topology.getFileName();
_builder.append(_fileName);
_builder.append(".json\");");
_builder.newLineIfNotEmpty();
_builder.append("try {");
_builder.newLine();
_builder.append("\t");
_builder.append("return new ");
String _createfullyQualifiedTopologyFilename = this._d3JsJavaUtil.createfullyQualifiedTopologyFilename(topology);
_builder.append(_createfullyQualifiedTopologyFilename, "\t");
_builder.append("(\"");
String _createTopologyFilename = this._d3JsJavaUtil.createTopologyFilename(topology);
_builder.append(_createTopologyFilename, "\t");
_builder.append("\", eventDispatcher, perspective, IOUtils.toString(json), panelWidth, panelHeight);");
_builder.newLineIfNotEmpty();
_builder.append("} catch (IOException e) {");
_builder.newLine();
_builder.append("\t");
_builder.append("log.error(\"found no data for ");
String _fileName_1 = topology.getFileName();
_builder.append(_fileName_1, "\t");
_builder.append(" in folder topologies\");");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
_builder.append("return null;");
_builder.newLine();
return _builder;
}
}