Skip to content

Commit f941a0a

Browse files
committed
Force use of serializer
Signed-off-by: Mark Herwege <mark.herwege@telenet.be>
1 parent f8550df commit f941a0a

8 files changed

Lines changed: 60 additions & 21 deletions

File tree

bundles/org.openhab.core.model.core/src/main/java/org/openhab/core/model/core/ModelRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.eclipse.emf.ecore.EObject;
2020
import org.eclipse.jdt.annotation.NonNullByDefault;
2121
import org.eclipse.jdt.annotation.Nullable;
22+
import org.eclipse.xtext.serializer.ISerializer;
2223

2324
/**
2425
* The model repository stores the configuration files (EMF models).
@@ -102,5 +103,5 @@ public interface ModelRepository {
102103
* @param modelType the model type
103104
* @param modelContent the content of the model
104105
*/
105-
void generateSyntaxFromModel(OutputStream out, String modelType, EObject modelContent);
106+
void generateSyntaxFromModel(OutputStream out, String modelType, EObject modelContent, ISerializer serializer);
106107
}

bundles/org.openhab.core.model.core/src/main/java/org/openhab/core/model/core/internal/ModelRepositoryImpl.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.io.IOException;
1717
import java.io.InputStream;
1818
import java.io.OutputStream;
19+
import java.io.OutputStreamWriter;
20+
import java.io.Writer;
1921
import java.nio.charset.StandardCharsets;
2022
import java.text.MessageFormat;
2123
import java.util.ArrayList;
@@ -34,9 +36,11 @@
3436
import org.eclipse.emf.ecore.util.Diagnostician;
3537
import org.eclipse.jdt.annotation.NonNullByDefault;
3638
import org.eclipse.jdt.annotation.Nullable;
39+
import org.eclipse.xtext.resource.SaveOptions;
3740
import org.eclipse.xtext.resource.SynchronizedXtextResourceSet;
3841
import org.eclipse.xtext.resource.XtextResource;
3942
import org.eclipse.xtext.resource.XtextResourceSet;
43+
import org.eclipse.xtext.serializer.ISerializer;
4044
import org.openhab.core.model.core.EventType;
4145
import org.openhab.core.model.core.ModelRepository;
4246
import org.openhab.core.model.core.ModelRepositoryChangeListener;
@@ -233,13 +237,15 @@ public void removeModelRepositoryChangeListener(ModelRepositoryChangeListener li
233237
}
234238

235239
@Override
236-
public void generateSyntaxFromModel(OutputStream out, String modelType, EObject modelContent) {
240+
public void generateSyntaxFromModel(OutputStream out, String modelType, EObject modelContent,
241+
ISerializer serializer) {
242+
String name = "tmp_generated_syntax_%d.%s".formatted(++counter, modelType);
243+
Resource resource = resourceSet.createResource(URI.createURI(name));
237244
synchronized (resourceSet) {
238-
String name = "tmp_generated_syntax_%d.%s".formatted(++counter, modelType);
239-
Resource resource = resourceSet.createResource(URI.createURI(name));
240-
try {
241-
resource.getContents().add(modelContent);
242-
resource.save(out, Map.of(XtextResource.OPTION_ENCODING, StandardCharsets.UTF_8.name()));
245+
resource.getContents().add(modelContent);
246+
try (Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
247+
String formatted = serializer.serialize(modelContent, SaveOptions.newBuilder().format().getOptions());
248+
writer.write(formatted);
243249
} catch (IOException e) {
244250
logger.warn("Exception when saving the model {}", resource.getURI().lastSegment());
245251
} finally {

bundles/org.openhab.core.model.item/src/org/openhab/core/model/ItemsStandaloneSetup.xtend

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,22 @@ package org.openhab.core.model
1515
import org.eclipse.emf.ecore.EPackage
1616
import org.eclipse.emf.ecore.resource.Resource
1717
import org.eclipse.xtext.resource.IResourceServiceProvider
18+
import com.google.inject.Injector
1819

1920
/**
2021
* Initialization support for running Xtext languages
2122
* without equinox extension registry
2223
*/
2324
class ItemsStandaloneSetup extends ItemsStandaloneSetupGenerated {
24-
def static void doSetup() {
25-
new ItemsStandaloneSetup().createInjectorAndDoEMFRegistration()
25+
static Injector injector;
26+
27+
def static Injector doSetup() {
28+
if (injector === null) {
29+
injector = new ItemsStandaloneSetup().createInjectorAndDoEMFRegistration();
30+
}
31+
return injector;
2632
}
27-
33+
2834
def static void unregister() {
2935
EPackage.Registry.INSTANCE.remove("https://openhab.org/model/Items");
3036
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().remove("items");

bundles/org.openhab.core.model.item/src/org/openhab/core/model/item/internal/fileconverter/DslItemFileConverter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.eclipse.jdt.annotation.NonNullByDefault;
2828
import org.eclipse.jdt.annotation.Nullable;
29+
import org.eclipse.xtext.serializer.ISerializer;
2930
import org.openhab.core.config.core.ConfigDescription;
3031
import org.openhab.core.config.core.ConfigDescriptionParameter;
3132
import org.openhab.core.config.core.ConfigDescriptionRegistry;
@@ -36,6 +37,7 @@
3637
import org.openhab.core.items.Metadata;
3738
import org.openhab.core.items.fileconverter.AbstractItemFileGenerator;
3839
import org.openhab.core.items.fileconverter.ItemFileGenerator;
40+
import org.openhab.core.model.ItemsStandaloneSetup;
3941
import org.openhab.core.model.core.ModelRepository;
4042
import org.openhab.core.model.items.ItemModel;
4143
import org.openhab.core.model.items.ItemsFactory;
@@ -67,11 +69,14 @@ public class DslItemFileConverter extends AbstractItemFileGenerator {
6769
private final ModelRepository modelRepository;
6870
private final ConfigDescriptionRegistry configDescriptionRegistry;
6971

72+
private final ISerializer serializer;
73+
7074
@Activate
7175
public DslItemFileConverter(final @Reference ModelRepository modelRepository,
7276
final @Reference ConfigDescriptionRegistry configDescriptionRegistry) {
7377
this.modelRepository = modelRepository;
7478
this.configDescriptionRegistry = configDescriptionRegistry;
79+
this.serializer = ItemsStandaloneSetup.doSetup().getInstance(ISerializer.class);
7580
}
7681

7782
@Override
@@ -90,7 +95,7 @@ public synchronized void generateFileFormat(OutputStream out, List<Item> items,
9095
model.getItems().add(buildModelItem(item, getChannelLinks(metadata, item.getName()),
9196
getMetadata(metadata, item.getName()), hideDefaultParameters));
9297
}
93-
modelRepository.generateSyntaxFromModel(out, "items", model);
98+
modelRepository.generateSyntaxFromModel(out, "items", model, serializer);
9499
}
95100

96101
private ModelItem buildModelItem(Item item, List<Metadata> channelLinks, List<Metadata> metadata,

bundles/org.openhab.core.model.sitemap/src/org/openhab/core/model/sitemap/SitemapStandaloneSetup.xtend

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,25 @@ package org.openhab.core.model.sitemap
1515
import org.eclipse.emf.ecore.EPackage
1616
import org.eclipse.emf.ecore.resource.Resource
1717
import org.eclipse.xtext.resource.IResourceServiceProvider
18+
import com.google.inject.Injector
1819

1920
/**
2021
* Initialization support for running Xtext languages
2122
* without equinox extension registry
2223
*/
2324
class SitemapStandaloneSetup extends SitemapStandaloneSetupGenerated {
24-
def static void doSetup() {
25-
new SitemapStandaloneSetup().createInjectorAndDoEMFRegistration()
25+
static Injector injector;
26+
27+
def static Injector doSetup() {
28+
if (injector === null) {
29+
injector = new SitemapStandaloneSetup().createInjectorAndDoEMFRegistration();
30+
}
31+
return injector;
2632
}
27-
33+
2834
def static void unregister() {
2935
EPackage.Registry.INSTANCE.remove("https://openhab.org/model/Sitemap");
3036
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().remove("sitemap");
3137
IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().remove("sitemap");
3238
}
33-
3439
}

bundles/org.openhab.core.model.sitemap/src/org/openhab/core/model/sitemap/internal/fileconverter/DslSitemapFileConverter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
import java.util.List;
1818

1919
import org.eclipse.jdt.annotation.NonNullByDefault;
20+
import org.eclipse.xtext.serializer.ISerializer;
2021
import org.openhab.core.model.core.ModelRepository;
22+
import org.openhab.core.model.sitemap.SitemapStandaloneSetup;
2123
import org.openhab.core.model.sitemap.fileconverter.AbstractSitemapFileGenerator;
2224
import org.openhab.core.model.sitemap.fileconverter.SitemapFileGenerator;
2325
import org.openhab.core.model.sitemap.sitemap.Sitemap;
@@ -41,9 +43,12 @@ public class DslSitemapFileConverter extends AbstractSitemapFileGenerator {
4143

4244
private final ModelRepository modelRepository;
4345

46+
private final ISerializer serializer;
47+
4448
@Activate
4549
public DslSitemapFileConverter(final @Reference ModelRepository modelRepository) {
4650
this.modelRepository = modelRepository;
51+
this.serializer = SitemapStandaloneSetup.doSetup().getInstance(ISerializer.class);
4752
}
4853

4954
@Override
@@ -57,12 +62,13 @@ public synchronized void generateFileFormat(OutputStream out, List<Sitemap> site
5762
return;
5863
}
5964
for (Sitemap sitemap : sitemaps) {
60-
modelRepository.generateSyntaxFromModel(out, "sitemap", sitemap);
65+
modelRepository.generateSyntaxFromModel(out, "sitemap", sitemap, serializer);
6166
try {
6267
out.write(System.lineSeparator().getBytes());
6368
} catch (IOException e) {
6469
logger.warn("Exception when saving the sitemap {}", sitemap.getName());
6570
}
6671
}
6772
}
73+
6874
}

bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/ThingStandaloneSetup.xtend

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,25 @@ package org.openhab.core.model.thing
1515
import org.eclipse.emf.ecore.EPackage
1616
import org.eclipse.emf.ecore.resource.Resource
1717
import org.eclipse.xtext.resource.IResourceServiceProvider
18+
import com.google.inject.Injector
1819

1920
/**
2021
* Initialization support for running Xtext languages
2122
* without equinox extension registry
2223
*/
2324
class ThingStandaloneSetup extends ThingStandaloneSetupGenerated {
24-
def static void doSetup() {
25-
new ThingStandaloneSetup().createInjectorAndDoEMFRegistration()
25+
static Injector injector;
26+
27+
def static Injector doSetup() {
28+
if (injector === null) {
29+
injector = new ThingStandaloneSetup().createInjectorAndDoEMFRegistration();
30+
}
31+
return injector;
2632
}
27-
33+
2834
def static void unregister() {
2935
EPackage.Registry.INSTANCE.remove("https://openhab.org/model/Thing");
3036
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().remove("things");
3137
IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().remove("things");
3238
}
33-
3439
}

bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/internal/fileconverter/DslThingFileConverter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222

2323
import org.eclipse.jdt.annotation.NonNullByDefault;
2424
import org.eclipse.jdt.annotation.Nullable;
25+
import org.eclipse.xtext.serializer.ISerializer;
2526
import org.openhab.core.config.core.ConfigDescriptionRegistry;
2627
import org.openhab.core.model.core.ModelRepository;
28+
import org.openhab.core.model.thing.ThingStandaloneSetup;
2729
import org.openhab.core.model.thing.thing.ModelBridge;
2830
import org.openhab.core.model.thing.thing.ModelChannel;
2931
import org.openhab.core.model.thing.thing.ModelProperty;
@@ -60,13 +62,16 @@ public class DslThingFileConverter extends AbstractThingFileGenerator {
6062

6163
private final ModelRepository modelRepository;
6264

65+
private final ISerializer serializer;
66+
6367
@Activate
6468
public DslThingFileConverter(final @Reference ModelRepository modelRepository,
6569
final @Reference ThingTypeRegistry thingTypeRegistry,
6670
final @Reference ChannelTypeRegistry channelTypeRegistry,
6771
final @Reference ConfigDescriptionRegistry configDescRegistry) {
6872
super(thingTypeRegistry, channelTypeRegistry, configDescRegistry);
6973
this.modelRepository = modelRepository;
74+
this.serializer = ThingStandaloneSetup.doSetup().getInstance(ISerializer.class);
7075
}
7176

7277
@Override
@@ -91,7 +96,7 @@ public synchronized void generateFileFormat(OutputStream out, List<Thing> things
9196
// Double quotes are unexpectedly generated in thing UID when the segment contains a -.
9297
// Fix that by removing these double quotes. Requires to first build the generated syntax as a String
9398
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
94-
modelRepository.generateSyntaxFromModel(outputStream, "things", model);
99+
modelRepository.generateSyntaxFromModel(outputStream, "things", model, serializer);
95100
String syntax = new String(outputStream.toByteArray()).replaceAll(":\"([a-zA-Z0-9_][a-zA-Z0-9_-]*)\"", ":$1");
96101
try {
97102
out.write(syntax.getBytes());

0 commit comments

Comments
 (0)