Skip to content

Commit 1213c30

Browse files
authored
Merge pull request #368 from bci-oss/bugfix/366-code-generator-encoding-problem
Bugfix/366 code generator encoding problem
2 parents 5601713 + 787a12d commit 1213c30

File tree

13 files changed

+161
-78
lines changed

13 files changed

+161
-78
lines changed

core/esmf-aspect-meta-model-resolver/src/main/java/org/eclipse/esmf/aspectmodel/resolver/services/TurtleLoader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
import org.apache.jena.riot.RDFLanguages;
3030
import org.apache.jena.riot.RDFParserRegistry;
3131
import org.apache.jena.riot.RiotException;
32+
import org.eclipse.esmf.aspectmodel.resolver.exceptions.ParserException;
33+
import org.eclipse.esmf.aspectmodel.resolver.parser.ReaderRIOTTurtle;
3234
import org.slf4j.Logger;
3335
import org.slf4j.LoggerFactory;
3436

35-
import org.eclipse.esmf.aspectmodel.resolver.exceptions.ParserException;
36-
import org.eclipse.esmf.aspectmodel.resolver.parser.ReaderRIOTTurtle;
3737
import io.vavr.control.Try;
3838

3939
public final class TurtleLoader {
@@ -63,7 +63,7 @@ public static Try<Model> loadTurtle( @Nullable final InputStream inputStream ) {
6363

6464
final Model streamModel = ModelFactory.createDefaultModel();
6565
RDFParserRegistry.registerLangTriples( Lang.TURTLE, ReaderRIOTTurtle.factory );
66-
try ( final InputStream turtleInputStream = new ByteArrayInputStream( modelContent.getBytes() ) ) {
66+
try ( final InputStream turtleInputStream = new ByteArrayInputStream( modelContent.getBytes( StandardCharsets.UTF_8 ) ) ) {
6767
streamModel.read( turtleInputStream, "", RDFLanguages.TURTLE.getName() );
6868
return Try.success( streamModel );
6969
} catch ( final IllegalArgumentException exception ) {

core/esmf-aspect-model-generator/src/main/java/org/eclipse/esmf/aspectmodel/generator/TemplateEngine.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package org.eclipse.esmf.aspectmodel.generator;
1515

1616
import java.io.StringWriter;
17+
import java.nio.charset.StandardCharsets;
1718
import java.util.HashMap;
1819
import java.util.Map;
1920
import java.util.Properties;
@@ -61,7 +62,7 @@ private TemplateEngine( final VelocityEngine engine, final Map<String, Object> c
6162
*/
6263
@Override
6364
public String apply( final String templateName ) {
64-
final Template template = engine.getTemplate( templateName + ".vm" );
65+
final Template template = engine.getTemplate( templateName + ".vm", StandardCharsets.UTF_8.name() );
6566
final StringWriter stringWriter = new StringWriter();
6667
final Map<String, Object> mutableContext = new HashMap<>( context );
6768
final VelocityContext velocityContext = new VelocityContext( mutableContext );

core/esmf-aspect-model-java-generator/src/main/java/org/eclipse/esmf/aspectmodel/java/AspectModelJavaUtil.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import org.apache.commons.lang3.StringUtils;
3030
import org.apache.commons.text.StringEscapeUtils;
31+
import org.apache.commons.text.translate.UnicodeUnescaper;
3132
import org.apache.jena.rdf.model.Resource;
3233
import org.apache.jena.rdf.model.ResourceFactory;
3334
import org.apache.jena.vocabulary.RDF;
@@ -63,6 +64,8 @@ public class AspectModelJavaUtil {
6364

6465
public static final Converter<String, String> TO_CONSTANT = CaseFormat.UPPER_CAMEL.converterTo( CaseFormat.UPPER_UNDERSCORE );
6566

67+
public static final UnicodeUnescaper UNESCAPER = new UnicodeUnescaper();
68+
6669
private AspectModelJavaUtil() {
6770
}
6871

@@ -336,8 +339,29 @@ public static String toConstant( final String upperOrLowerCamelString ) {
336339
return TO_CONSTANT.convert( StringUtils.capitalize( upperOrLowerCamelString ) );
337340
}
338341

342+
/**
343+
* Creates a string literal with escaped double quotes around the given string.
344+
*
345+
* The string is escaped using {@link #escapeForLiteral(String)}.
346+
*
347+
* @param value the string to create the literal for
348+
* @return the literal
349+
*/
339350
public static String createLiteral( final String value ) {
340-
return "\"" + StringEscapeUtils.escapeJava( value ) + "\"";
351+
return "\"" + escapeForLiteral( value ) + "\"";
352+
}
353+
354+
/**
355+
* Escapes a string properly to be used as a literal.
356+
*
357+
* Performs escaping according to Java String rules and afterwards additionally translates escaped Unicode characters back to Unicode. The latter step is
358+
* necessary to avoid Unicode escape sequences within the String literal.
359+
*
360+
* @param value the string to be escaped
361+
* @return the escaped string
362+
*/
363+
public static String escapeForLiteral( final String value ) {
364+
return UNESCAPER.translate( StringEscapeUtils.escapeJava( value ) );
341365
}
342366

343367
/**
@@ -460,7 +484,7 @@ public static String getCharacteristicJavaType( final Property property, final J
460484

461485
public static String printStructuredValueElement( final Object object ) {
462486
if ( object instanceof String ) {
463-
return "\"" + StringEscapeUtils.escapeJava( object.toString() ) + "\"";
487+
return createLiteral( object.toString() );
464488
}
465489
return toConstant( ((Property) object).getName() );
466490
}
@@ -484,7 +508,7 @@ public static boolean isXmlDatatypeFactoryRequired( final StructureElement eleme
484508
XSD.dayTimeDuration.getURI() ) );
485509
}
486510

487-
public static boolean doesValueNeedsToBeQuoted( final String typeUrn ) {
511+
public static boolean doesValueNeedToBeQuoted( final String typeUrn ) {
488512
return typeUrn.equals( XSD.integer.getURI() )
489513
|| typeUrn.equals( XSD.xshort.getURI() )
490514
|| typeUrn.equals( XSD.decimal.getURI() )
@@ -598,4 +622,4 @@ public static AbstractEntity castToAbstractEntity( final ComplexType complexType
598622
public static Quantifiable castToQuantifiable( final Characteristic characteristic ) {
599623
return (Quantifiable) characteristic;
600624
}
601-
}
625+
}

core/esmf-aspect-model-java-generator/src/main/java/org/eclipse/esmf/aspectmodel/java/ValueExpressionVisitor.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,15 @@
1616
import java.util.Locale;
1717
import java.util.stream.Collectors;
1818

19-
import org.apache.commons.text.StringEscapeUtils;
2019
import org.apache.jena.rdf.model.Resource;
2120
import org.apache.jena.rdf.model.ResourceFactory;
2221
import org.apache.jena.vocabulary.RDF;
23-
2422
import org.eclipse.esmf.aspectmodel.java.exception.CodeGenerationException;
2523
import org.eclipse.esmf.aspectmodel.resolver.services.DataType;
26-
import org.eclipse.esmf.metamodel.ModelElement;
2724
import org.eclipse.esmf.metamodel.CollectionValue;
2825
import org.eclipse.esmf.metamodel.Entity;
2926
import org.eclipse.esmf.metamodel.EntityInstance;
27+
import org.eclipse.esmf.metamodel.ModelElement;
3028
import org.eclipse.esmf.metamodel.Scalar;
3129
import org.eclipse.esmf.metamodel.ScalarValue;
3230
import org.eclipse.esmf.metamodel.Value;
@@ -72,14 +70,14 @@ private String generateValueExpression( final ScalarValue value, final Context c
7270
context.getCodeGenerationConfig().importTracker().importExplicit( LangString.class );
7371
context.getCodeGenerationConfig().importTracker().importExplicit( Locale.class );
7472
final LangString langStringValue = (LangString) value.as( ScalarValue.class ).getValue();
75-
return String.format( "new LangString(\"%s\", Locale.forLanguageTag(\"%s\"))", StringEscapeUtils.escapeJava( langStringValue.getValue() ),
73+
return String.format( "new LangString(\"%s\", Locale.forLanguageTag(\"%s\"))", AspectModelJavaUtil.escapeForLiteral( langStringValue.getValue() ),
7674
langStringValue.getLanguageTag().toLanguageTag() );
7775
}
7876

7977
final Resource typeResource = ResourceFactory.createResource( typeUri );
8078
final Class<?> javaType = DataType.getJavaTypeForMetaModelType( typeResource, value.getMetaModelVersion() );
8179
context.getCodeGenerationConfig().importTracker().importExplicit( javaType );
82-
return valueInitializer.apply( typeResource, javaType, "\"" + StringEscapeUtils.escapeJava( value.getValue().toString() ) + "\"",
80+
return valueInitializer.apply( typeResource, javaType, AspectModelJavaUtil.createLiteral( value.getValue().toString() ),
8381
value.getMetaModelVersion() );
8482
}
8583

core/esmf-aspect-model-java-generator/src/main/java/org/eclipse/esmf/aspectmodel/java/metamodel/StaticMetaModelJavaArtifactGenerator.java

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -35,73 +35,67 @@
3535
import org.eclipse.esmf.aspectmodel.java.ImportTracker;
3636
import org.eclipse.esmf.aspectmodel.java.JavaArtifact;
3737
import org.eclipse.esmf.aspectmodel.java.JavaCodeGenerationConfig;
38-
import org.eclipse.esmf.aspectmodel.java.ValueInitializer;
39-
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
40-
import org.jboss.forge.roaster.Roaster;
41-
42-
import com.google.common.base.CharMatcher;
43-
import com.google.common.collect.ImmutableMap;
44-
45-
import org.eclipse.esmf.samm.KnownVersion;
46-
4738
import org.eclipse.esmf.aspectmodel.java.StructuredValuePropertiesDeconstructor;
39+
import org.eclipse.esmf.aspectmodel.java.ValueInitializer;
4840
import org.eclipse.esmf.aspectmodel.java.exception.CodeGenerationException;
4941
import org.eclipse.esmf.aspectmodel.java.pojo.JavaArtifactGenerator;
42+
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
5043
import org.eclipse.esmf.aspectmodel.vocabulary.SAMMC;
51-
import org.eclipse.esmf.metamodel.AbstractEntity;
5244
import org.eclipse.esmf.characteristic.Code;
5345
import org.eclipse.esmf.characteristic.Collection;
54-
import org.eclipse.esmf.metamodel.Constraint;
5546
import org.eclipse.esmf.characteristic.Duration;
5647
import org.eclipse.esmf.characteristic.Either;
57-
import org.eclipse.esmf.constraint.EncodingConstraint;
58-
import org.eclipse.esmf.metamodel.Entity;
5948
import org.eclipse.esmf.characteristic.Enumeration;
60-
import org.eclipse.esmf.constraint.FixedPointConstraint;
61-
import org.eclipse.esmf.constraint.LanguageConstraint;
62-
import org.eclipse.esmf.constraint.LengthConstraint;
6349
import org.eclipse.esmf.characteristic.List;
6450
import org.eclipse.esmf.characteristic.Measurement;
6551
import org.eclipse.esmf.characteristic.Quantifiable;
66-
import org.eclipse.esmf.constraint.RangeConstraint;
67-
import org.eclipse.esmf.constraint.RegularExpressionConstraint;
68-
import org.eclipse.esmf.metamodel.Scalar;
6952
import org.eclipse.esmf.characteristic.Set;
7053
import org.eclipse.esmf.characteristic.SingleEntity;
7154
import org.eclipse.esmf.characteristic.SortedSet;
7255
import org.eclipse.esmf.characteristic.State;
73-
import org.eclipse.esmf.metamodel.StructureElement;
7456
import org.eclipse.esmf.characteristic.StructuredValue;
7557
import org.eclipse.esmf.characteristic.Trait;
76-
import org.eclipse.esmf.metamodel.Unit;
77-
import org.eclipse.esmf.metamodel.Units;
78-
import org.eclipse.esmf.metamodel.datatypes.LangString;
79-
import org.eclipse.esmf.metamodel.impl.BoundDefinition;
80-
import org.eclipse.esmf.metamodel.impl.DefaultAbstractEntity;
81-
import org.eclipse.esmf.metamodel.impl.DefaultCharacteristic;
8258
import org.eclipse.esmf.characteristic.impl.DefaultCode;
8359
import org.eclipse.esmf.characteristic.impl.DefaultCollection;
84-
import org.eclipse.esmf.metamodel.impl.DefaultComplexType;
8560
import org.eclipse.esmf.characteristic.impl.DefaultDuration;
86-
import org.eclipse.esmf.constraint.impl.DefaultEncodingConstraint;
87-
import org.eclipse.esmf.metamodel.impl.DefaultEntity;
8861
import org.eclipse.esmf.characteristic.impl.DefaultEnumeration;
89-
import org.eclipse.esmf.constraint.impl.DefaultFixedPointConstraint;
90-
import org.eclipse.esmf.constraint.impl.DefaultLanguageConstraint;
91-
import org.eclipse.esmf.constraint.impl.DefaultLengthConstraint;
9262
import org.eclipse.esmf.characteristic.impl.DefaultList;
9363
import org.eclipse.esmf.characteristic.impl.DefaultMeasurement;
9464
import org.eclipse.esmf.characteristic.impl.DefaultQuantifiable;
95-
import org.eclipse.esmf.constraint.impl.DefaultRangeConstraint;
96-
import org.eclipse.esmf.constraint.impl.DefaultRegularExpressionConstraint;
97-
import org.eclipse.esmf.metamodel.impl.DefaultScalar;
9865
import org.eclipse.esmf.characteristic.impl.DefaultSet;
9966
import org.eclipse.esmf.characteristic.impl.DefaultSingleEntity;
10067
import org.eclipse.esmf.characteristic.impl.DefaultSortedSet;
10168
import org.eclipse.esmf.characteristic.impl.DefaultState;
10269
import org.eclipse.esmf.characteristic.impl.DefaultStructuredValue;
10370
import org.eclipse.esmf.characteristic.impl.DefaultTrait;
71+
import org.eclipse.esmf.constraint.EncodingConstraint;
72+
import org.eclipse.esmf.constraint.FixedPointConstraint;
73+
import org.eclipse.esmf.constraint.LanguageConstraint;
74+
import org.eclipse.esmf.constraint.LengthConstraint;
75+
import org.eclipse.esmf.constraint.RangeConstraint;
76+
import org.eclipse.esmf.constraint.RegularExpressionConstraint;
77+
import org.eclipse.esmf.constraint.impl.DefaultEncodingConstraint;
78+
import org.eclipse.esmf.constraint.impl.DefaultFixedPointConstraint;
79+
import org.eclipse.esmf.constraint.impl.DefaultLanguageConstraint;
80+
import org.eclipse.esmf.constraint.impl.DefaultLengthConstraint;
81+
import org.eclipse.esmf.constraint.impl.DefaultRangeConstraint;
82+
import org.eclipse.esmf.constraint.impl.DefaultRegularExpressionConstraint;
83+
import org.eclipse.esmf.metamodel.AbstractEntity;
84+
import org.eclipse.esmf.metamodel.Constraint;
85+
import org.eclipse.esmf.metamodel.Entity;
86+
import org.eclipse.esmf.metamodel.Scalar;
87+
import org.eclipse.esmf.metamodel.StructureElement;
88+
import org.eclipse.esmf.metamodel.Unit;
89+
import org.eclipse.esmf.metamodel.Units;
90+
import org.eclipse.esmf.metamodel.datatypes.LangString;
91+
import org.eclipse.esmf.metamodel.impl.BoundDefinition;
92+
import org.eclipse.esmf.metamodel.impl.DefaultAbstractEntity;
93+
import org.eclipse.esmf.metamodel.impl.DefaultCharacteristic;
94+
import org.eclipse.esmf.metamodel.impl.DefaultComplexType;
95+
import org.eclipse.esmf.metamodel.impl.DefaultEntity;
96+
import org.eclipse.esmf.metamodel.impl.DefaultScalar;
10497
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
98+
import org.eclipse.esmf.samm.KnownVersion;
10599
import org.eclipse.esmf.staticmetamodel.PropertyContainer;
106100
import org.eclipse.esmf.staticmetamodel.StaticContainerProperty;
107101
import org.eclipse.esmf.staticmetamodel.StaticMetaClass;
@@ -110,6 +104,10 @@
110104
import org.eclipse.esmf.staticmetamodel.constraint.StaticConstraintContainerProperty;
111105
import org.eclipse.esmf.staticmetamodel.constraint.StaticConstraintProperty;
112106
import org.eclipse.esmf.staticmetamodel.constraint.StaticConstraintUnitProperty;
107+
import org.jboss.forge.roaster.Roaster;
108+
109+
import com.google.common.base.CharMatcher;
110+
import com.google.common.collect.ImmutableMap;
113111

114112
/**
115113
* A {@link ArtifactGenerator} that generates static meta classes

0 commit comments

Comments
 (0)