blob: f43a0461bedf9ef39312ec35876860f9216b0ec3 [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.osbp.runtime.common.event.IEventDispatcher
import org.eclipse.osbp.xtext.topologydsl.Topology
import org.eclipse.xtext.common.types.JvmAnnotationReference
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.JvmStringAnnotationValue
import org.eclipse.xtext.common.types.JvmVisibility
import org.eclipse.xtext.common.types.TypesFactory
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.slf4j.Logger
import org.eclipse.xtext.xbase.jvmmodel.JvmTypeReferenceBuilder
import org.eclipse.xtext.xbase.jvmmodel.JvmAnnotationReferenceBuilder
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective
class TopologyDSLD3JavaComponentsCreator {
@Inject extension JvmTypesBuilder
@Inject extension D3JsJavaUtil
@Inject
private TypesFactory typesFactory
def void createJsJavaComponent(Topology topology, IJvmDeclaredTypeAcceptor acceptor, JvmTypeReferenceBuilder typeReferenceBuilder, JvmAnnotationReferenceBuilder annotationTypesBuilder){
if (topology.name !== null){
val stateClassName = topology.createStateFilename
var topology_cls = topology.toClass(topology.createfullyQualifiedTopologyFilename)
// JavaScript-Java-State-Component creation
var state_cls = topology.toClass(topology.createfullyQualifiedStateFilename)
// JavaScript-Java-Component creation
acceptor.accept(topology_cls,
[
superTypes += typeReferenceBuilder.typeRef(AbstractJavaScriptComponent)
var JvmAnnotationReference jsAnnotationRef = annotationTypesBuilder.annotationRef(JavaScript)
var jsAnnotationList = newArrayList('''theme://plugin/org.eclipse.osbp.utils.js/org/eclipse/osbp/utils/js/d3.min.js''', '''theme://plugin/org.eclipse.osbp.utils.js/org/eclipse/osbp/utils/js/topojson.v1.min.js''', '''js/«topology.createTopologyJsFilename»''')
jsAnnotationRef.addStringValuesToAnnotation(jsAnnotationList)
annotations += jsAnnotationRef
it.toTopologyConstructor(topology, typeReferenceBuilder)
it.toFields(topology, typeReferenceBuilder)
it.toTopologyOperations(topology, stateClassName, typeReferenceBuilder)
])
// JavaScript-Java-State-Component creation
acceptor.accept(state_cls,
[
superTypes += typeReferenceBuilder.typeRef(JavaScriptComponentState)
it.toTopologyStateFields(topology, typeReferenceBuilder)
])
}
}
/**
* <p>build the class variables.</p>
*
*/
def void toFields(JvmDeclaredType type, Topology topology, JvmTypeReferenceBuilder typeReferenceBuilder) {
var JvmField field = null
// create logger
field = topology.toField("log", typeReferenceBuilder.typeRef(Logger))[setInitializer([append('''org.slf4j.LoggerFactory.getLogger("topology")''')])]
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
}
def void toTopologyOperations(JvmDeclaredType type, Topology topology, String stateClassName, JvmTypeReferenceBuilder typeReferenceBuilder){
// create view
type.members += topology.toMethod("getState", typeReferenceBuilder.typeRef(stateClassName), [
body = [ append('''return («stateClassName») super.getState();''')]
])
}
def getD3StateVars()
'''
getState().jsonData = _jsonData;
getState().htmlTagId=_htmlTagId;
getState().panelWidth = new Integer(width).toString();
getState().panelHeight = new Integer(height).toString();
'''
def JvmConstructor getTopologyConstructor(JvmDeclaredType type, Topology topology, JvmTypeReferenceBuilder typeReferenceBuilder) {
return topology.toConstructor([
parameters += topology.toParameter("_htmlTagId", typeReferenceBuilder.typeRef(String))
parameters += topology.toParameter("eventDispatcher", typeReferenceBuilder.typeRef(IEventDispatcher))
parameters += topology.toParameter("perspective", typeReferenceBuilder.typeRef(MPerspective))
parameters += topology.toParameter("_jsonData", typeReferenceBuilder.typeRef(String))
parameters += topology.toParameter("width", typeReferenceBuilder.typeRef(int))
parameters += topology.toParameter("height", typeReferenceBuilder.typeRef(int))
body = [ append(getD3StateVars)]
])
}
def void toTopologyConstructor(JvmDeclaredType type, Topology topology, JvmTypeReferenceBuilder typeReferenceBuilder) {
var JvmConstructor constructor = type.getTopologyConstructor(topology, typeReferenceBuilder)
constructor.body = [ append(
'''
«d3StateVars»
addFunction("on«topology.fileName»Click", new JavaScriptFunction() {
@Override
public void call(JsonArray arguments){
try {
EventDispatcherEvent evnt = new EventDispatcherEvent(perspective, EventDispatcherCommand.SELECT, "Topology", "«topology.name»");
if(arguments.get(0) instanceof JreJsonString && arguments.get(1) instanceof JreJsonString) {
evnt.addItem(EventDispatcherDataTag.LIST, arguments.getString(0)+"."+arguments.getString(1));
eventDispatcher.sendEvent(evnt);
}
} catch (JsonException jsonExp){
log.error("«topology.fileName»Click - JsonException: no property available");
}
}
});''')]
type.members += constructor
}
def void addStringValuesToAnnotation(JvmAnnotationReference annotationRef, ArrayList<String> annotationStringList){
var JvmStringAnnotationValue value = typesFactory.createJvmStringAnnotationValue
for (annotationString : annotationStringList){
value.values += annotationString
}
annotationRef.explicitValues += value
}
def void toTopologyStateFields(JvmDeclaredType type, Topology topology, JvmTypeReferenceBuilder typeReferenceBuilder){
type.members += topology.toField("jsonData", typeReferenceBuilder.typeRef(String))[
visibility = JvmVisibility::PUBLIC
setInitializer([append('''""''')])]
type.members += topology.toField("htmlTagId", typeReferenceBuilder.typeRef(String))[
visibility = JvmVisibility::PUBLIC
setInitializer([append('''""''')])]
type.members += topology.toField("panelWidth", typeReferenceBuilder.typeRef(String))[
visibility = JvmVisibility::PUBLIC
setInitializer([append('''""''')])]
type.members += topology.toField("panelHeight", typeReferenceBuilder.typeRef(String))[
visibility = JvmVisibility::PUBLIC
setInitializer([append('''""''')])]
type.members += topology.toField("inputValue", typeReferenceBuilder.typeRef(String))[
visibility = JvmVisibility::PUBLIC
setInitializer([append('''""''')])]
}
def createD3Topology(Topology topology)
'''
InputStream json = getClass().getResourceAsStream("/topologies/«topology.fileName».json");
try {
return new «topology.createfullyQualifiedTopologyFilename»("«topology.createTopologyFilename»", eventDispatcher, perspective, IOUtils.toString(json), panelWidth, panelHeight);
} catch (IOException e) {
log.error("found no data for «topology.fileName» in folder topologies");
}
return null;
'''
}