| /** |
| * |
| * 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 v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * 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 |
| |
| 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("_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(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, IOUtils.toString(json), panelWidth, panelHeight); |
| } catch (IOException e) { |
| log.error("found no data for «topology.fileName» in folder topologies"); |
| } |
| return null; |
| ''' |
| } |