|
|
|
Re: Web editing of DSLs [message #1728260 is a reply to message #1728257] |
Fri, 01 April 2016 12:14 |
|
All inferred JVM types are held in memory. That is not work in progress, but intended, since the web integration of Xtext is not an implementation of an online IDE, but just a set of services that can be used by clients running a text editor. You can extend the Xtext server with additional services for saving the JVM types to a persistence layer if you want. For a full IDE implementation have a look at Orion or Che. However, the integration of Xtext into these online IDEs is indeed work in progress.
|
|
|
|
|
|
|
|
|
Re: Web editing of DSLs [message #1733021 is a reply to message #1732967] |
Mon, 23 May 2016 18:56 |
|
Hi,
i still cannot follow you
(1) create a new xtext web example with this grammar
Model:
greetings+=Greeting*;
Greeting:
'Hello' name=ID ('from' from=[Greeting])? '!';
Take the impl and bindings from the statmachine example
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="en-us">
<title>Example Web Editor</title>
<link rel="stylesheet" type="text/css" href="xtext/2.9.2/xtext-ace.css"/>
<link rel="stylesheet" type="text/css" href="style.css"/>
<script src="webjars/requirejs/2.1.20/require.min.js"></script>
<script type="text/javascript">
var baseUrl = window.location.pathname;
var fileIndex = baseUrl.indexOf("index.html");
if (fileIndex > 0)
baseUrl = baseUrl.slice(0, fileIndex);
require.config({
baseUrl: baseUrl,
paths: {
"jquery": "webjars/jquery/2.1.4/jquery.min",
"ace/ext/language_tools": "webjars/ace/1.2.0/src/ext-language_tools",
"xtext/xtext-ace": "xtext/2.9.2/xtext-ace"
}
});
require(["webjars/ace/1.2.0/src/ace"], function() {
require(["xtext/xtext-ace"], function(xtext) {
var editors = xtext.createEditor({
position: "absolute",
syntaxDefinition: "xtext-resources/generated/mode-mydsl"
});
var leftServices = editors[0].xtextServices;
var rightServices = editors[1].xtextServices;
leftServices.editorContext.addServerStateListener(function(params) {
if (!params.forceUpdate)
rightServices.update({forceUpdate: true});
});
rightServices.editorContext.addServerStateListener(function(params) {
if (!params.forceUpdate)
leftServices.update({forceUpdate: true});
});
});
});
</script>
</head>
<body>
<div class="container-left">
<div class="xtext-editor"
data-editor-resource-id="multi-resource/left.mydsl">
</div>
</div>
<div class="container-right">
<div class="xtext-editor"
data-editor-resource-id="multi-resource/right.mydsl">
</div>
</div>
</body>
</html>
body {
font: 16px Helvetica,sans-serif;
}
iframe {
width: 100%;
height: 100%;
border: 1px solid #aaa;
background-color: #f0f0f0;
}
a {
color: #22a;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
h1 {
color: #555;
font-style: italic;
}
h2 {
color: #555;
padding-left: 15px;
border-bottom: 1px solid #aab;
}
h3 {
font-size: 16px;
}
.text-container {
width: 800px;
margin: 40px;
}
.container {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 640px;
margin: 20px;
}
.container-left {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 450px;
margin: 20px;
}
.container-right {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 480px;
width: 450px;
margin: 20px;
}
.xtext-editor {
display: block;
position: absolute;
top: 0;
bottom: 30px;
left: 0;
right: 0;
padding: 4px;
border: 1px solid #aaa;
}
#xtext-editor {
display: block;
position: absolute;
top: 0;
bottom: 30px;
left: 0;
right: 0;
border: 1px solid #aaa;
}
.status-wrapper {
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 20px;
margin-top: 10px;
}
.button-wrapper {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 640px;
margin: 20px;
}
#generator-result {
display: block;
position: absolute;
top: 20px;
bottom: 50px;
left: 680px;
right: 20px;
}
#dirty-indicator {
display: inline;
color: #e8e8e8;
padding: 1px 8px 1px 8px;
border: 1px solid #ccc;
margin-left: 10px;
}
#dirty-indicator.dirty {
background-color: #88e;
}
#status {
display: inline;
}
.output-icon {
background-image: url("images/output.gif");
background-repeat: no-repeat;
}
.InputSignal {
font-style: italic;
color: #2222ff
}
.OutputSignal {
font-style: italic;
color: #11aa11
}
class MyDslResourceSetProvider implements IWebResourceSetProvider {
static val MULTI_RESOURCE_PREFIX = 'multi-resource'
@Inject Provider<ResourceSet> provider
override get(String resourceId, IServiceContext serviceContext) {
if (resourceId !== null && resourceId.startsWith(MULTI_RESOURCE_PREFIX)) {
val pathEnd = Math.max(resourceId.indexOf('/'), MULTI_RESOURCE_PREFIX.length)
return serviceContext.session.get(ResourceSet -> resourceId.substring(0, pathEnd), [provider.get])
} else
return provider.get
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Provider
import java.util.List
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import javax.servlet.annotation.WebServlet
import org.eclipse.xtext.web.server.persistence.ResourceBaseProviderImpl
import org.eclipse.xtext.web.servlet.XtextServlet
/**
* Deploy this class into a servlet container to enable DSL-specific services.
*/
@WebServlet(name = 'XtextServices', urlPatterns = '/xtext-service/*')
class MyDslServlet extends XtextServlet {
val List<ExecutorService> executorServices = newArrayList
override init() {
super.init()
val resourceBaseProvider = new ResourceBaseProviderImpl('./test-files')
val Provider<ExecutorService> executorServiceProvider = [Executors.newCachedThreadPool => [executorServices += it]]
new MyDslWebSetup(executorServiceProvider, resourceBaseProvider).createInjectorAndDoEMFRegistration()
}
override destroy() {
executorServices.forEach[shutdown()]
executorServices.clear()
super.destroy()
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Binder
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.web.server.model.IWebResourceSetProvider
import org.eclipse.xtext.web.server.persistence.FileResourceHandler
import org.eclipse.xtext.web.server.persistence.IResourceBaseProvider
import org.eclipse.xtext.web.server.persistence.IServerResourceHandler
/**
* Use this class to register additional components to be used within the web application.
*/
@FinalFieldsConstructor
class MyDslWebModule extends AbstractMyDslWebModule {
val IResourceBaseProvider resourceBaseProvider
def Class<? extends IWebResourceSetProvider> bindIWebResourceSetProvider() {
return MyDslResourceSetProvider
}
def void configureResourceBaseProvider(Binder binder) {
if (resourceBaseProvider !== null) binder.bind(IResourceBaseProvider).toInstance(resourceBaseProvider)
}
def Class<? extends IServerResourceHandler> bindIServerResourceHandler() {
return FileResourceHandler
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Guice
import com.google.inject.Injector
import com.google.inject.Provider
import com.google.inject.util.Modules
import java.util.concurrent.ExecutorService
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.web.server.persistence.IResourceBaseProvider
import org.xtext.example.mydsl.MyDslRuntimeModule
import org.xtext.example.mydsl.MyDslStandaloneSetup
/**
* Initialization support for running Xtext languages in web applications.
*/
@FinalFieldsConstructor
class MyDslWebSetup extends MyDslStandaloneSetup {
val Provider<ExecutorService> executorServiceProvider
val IResourceBaseProvider resourceBaseProvider
override Injector createInjector() {
val runtimeModule = new MyDslRuntimeModule()
val webModule = new MyDslWebModule(executorServiceProvider, resourceBaseProvider)
return Guice.createInjector(Modules.override(runtimeModule).with(webModule))
}
}
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
|
|
Re: Web editing of DSLs [message #1733030 is a reply to message #1733024] |
Mon, 23 May 2016 20:07 |
|
something like
class MyDslResourceSetProvider implements IWebResourceSetProvider {
static val MULTI_RESOURCE_PREFIX = 'multi-resource'
@Inject Provider<ResourceSet> provider
override get(String resourceId, IServiceContext serviceContext) {
val result = if (resourceId !== null && resourceId.startsWith(MULTI_RESOURCE_PREFIX)) {
val pathEnd = Math.max(resourceId.indexOf('/'), MULTI_RESOURCE_PREFIX.length)
serviceContext.session.get(ResourceSet -> resourceId.substring(0, pathEnd), [provider.get])
} else
provider.get
result => [
System.err.println("1111")
val ry = getResource(URI.createURI("dummy.mydsl"),false)
if (ry == null) {
val r = createResource(URI.createURI("dummy.mydsl"))
val in = new StringInputStream('''
Hello X! Hello Y! Hello Z!
'''.toString)
r.load(in, null)
println(r.contents+"1111")
}
]
result
}
}
works for me
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
|
|
|
|
|
Re: Web editing of DSLs [message #1733300 is a reply to message #1733294] |
Thu, 26 May 2016 02:51 |
|
Hi,
the code in the repo is incomplete. seems like some parents are missing.
if you want to have different!!!! dsls in web make sure you call the standalonesetups for ALL dependencent dsls.
you dont do that for .fbmodel and . type
instead you do some strange things inside
InformationModelStandaloneSetupGenerated
calling FunctionblockStandaloneSetup.doSetup(); inside InformationModelWebSetup should be fine.
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
|
Powered by
FUDForum. Page generated in 0.09969 seconds