Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Model Documentation Generation #6

Open
wants to merge 21 commits into
base: snapshot
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cnf/build.bnd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ base-version: 1.0.0.SNAPSHOT
javac.source: 11
javac.target: 11

-require-bnd "(version>=6.2.0)"
-require-bnd "(version>=6.3.1)"

-plugin.Central: \
aQute.bnd.repository.maven.provider.MavenBndRepository; \
Expand Down
19 changes: 14 additions & 5 deletions cnf/central.mvn
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@ org.osgi:osgi.core:8.0.0
org.slf4j:slf4j-api:1.7.30
org.slf4j:slf4j-simple:1.7.30

org.eclipse.emf:org.eclipse.emf.common:2.23.0
org.eclipse.emf:org.eclipse.emf.ecore:2.25.0
org.eclipse.emf:org.eclipse.emf.ecore.xmi:2.16.0
#org.eclipse.emf:org.eclipse.emf.common:2.23.0
#org.eclipse.emf:org.eclipse.emf.ecore:2.25.0
#org.eclipse.emf:org.eclipse.emf.ecore.xmi:2.16.0
org.eclipse.emf:org.eclipse.emf.codegen.ecore:2.28.0
org.eclipse.emf:org.eclipse.emf.codegen:2.22.0
org.eclipse.emf:org.eclipse.emf.ecore.xcore.lib:1.6.0
Expand All @@ -157,14 +157,23 @@ org.geckoprojects.bnd:org.gecko.bnd.jacoco.library:1.1.1

#org.geckoprojects.emf:org.gecko.emf.osgi.api:4.1.1.202202162308
org.geckoprojects.emf:org.gecko.emf.osgi.bnd.library.workspace:4.1.1-SNAPSHOT
org.geckoprojects.emf:org.gecko.emf.osgi.example.model.basic:4.1.1-SNAPSHOT

com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-properties:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
org.eclipse.emfcloud:emfjson-jackson:2.1.0-SNAPSHOT
org.eclipse.emfcloud:emfjson-jackson:2.1.0
de.undercouch:bson4jackson:2.13.1
org.yaml:snakeyaml:1.30
#org.emfjson:emfjson-jackson:1.3.0
org.geckoprojects.emf:org.gecko.emf.osgi.example.model.basic:4.1.1.202202162309


#xtext
org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.29.0.M1
org.eclipse.xtext:org.eclipse.xtext.builder:2.10.0
com.google.guava:guava:30.1-jre
com.google.guava:failureaccess:1.0.1

org.gecko.runtime:org.gecko.templates:1.0.31
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
bnd_version=6.3.0-RC1
bnd_version=6.3.1
bnd_snapshots=https://bndtools.jfrog.io/ui/native/libs-release/
6 changes: 5 additions & 1 deletion org.gecko.emf.json.tests/bnd.bnd
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@ javac.target: 11

Bundle-Version: 1.0.1.SNAPSHOT
-buildpath: \
org.eclipse.emfcloud.emfjson-jackson;version=latest
org.eclipse.emfcloud.emfjson-jackson;version=latest,\
org.gecko.emf.osgi.component,\
org.eclipse.emf.ecore.xmi,\
org.eclipse.emf.ecore,\
org.gecko.emf.osgi.example.model.basic
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/**
* Copyright (c) 2012 - 2022 Data In Motion and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Data In Motion - initial API and implementation
*/
package org.gecko.emf.json.tests;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.gecko.emf.json.configuration.ConfigurableJsonResource;
import org.gecko.emf.json.configuration.ConfigurableJsonResourceFactory;
import org.gecko.emf.json.constants.EMFJs;
import org.gecko.emf.osgi.example.model.basic.BasicFactory;
import org.gecko.emf.osgi.example.model.basic.BasicPackage;
import org.gecko.emf.osgi.example.model.basic.Person;
import org.gecko.emf.osgi.example.model.basic.impl.BasicPackageImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

/**
*
* @author mark
* @since 15.07.2022
*/
public class RootElementTest {

private ResourceSetImpl resourceSet;
private BasicPackage packageImpl;
private BasicFactory factoryImpl;

@BeforeEach
public void beforeEach() {
resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
packageImpl = BasicPackageImpl.init();
factoryImpl = BasicFactory.eINSTANCE;
resourceSet.getPackageRegistry().put(BasicPackage.eNS_URI, packageImpl);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("json", new ConfigurableJsonResourceFactory());
}

@Test
public void testSaveJson() {
Resource resource = resourceSet.createResource(URI.createURI("test.json"));
assertNotNull(resource);
assertTrue(resource instanceof ConfigurableJsonResource);

Person p = factoryImpl.createPerson();
p.setFirstName("Emil");
p.setLastName("Tester");
resource.getContents().add(p);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
resource.save(baos, null);
} catch (IOException e) {
fail("Error saving Person");
}
String result = new String(baos.toByteArray());
System.out.println(result);
}

@Test
public void testLoadJsonError() {
String json = "{\n"
+ " \"firstName\" : \"Emil\",\n"
+ " \"lastName\" : \"Tester\"\n"
+ "}";
Resource loadResource = resourceSet.createResource(URI.createURI("test-load-error.json"));
assertNotNull(loadResource);
assertTrue(loadResource instanceof ConfigurableJsonResource);

ByteArrayInputStream bais = new ByteArrayInputStream(json.getBytes());
try {
loadResource.load(bais, null);
assertEquals(0, loadResource.getContents().size());
} catch (IOException e) {
fail("Error loading Person");
}
}

@Test
public void testLoadJson() {
String json = "{\n"
+ " \"firstName\" : \"Emil\",\n"
+ " \"lastName\" : \"Tester\"\n"
+ "}";
Resource loadResource = resourceSet.createResource(URI.createURI("test-load.json"));
assertNotNull(loadResource);
assertTrue(loadResource instanceof ConfigurableJsonResource);

ByteArrayInputStream bais = new ByteArrayInputStream(json.getBytes());
try {
Map<String, Object> loadOptions = new HashMap<String, Object>();
loadOptions.put(EMFJs.OPTION_ROOT_ELEMENT, packageImpl.getPerson());
loadResource.load(bais, loadOptions);
assertEquals(1, loadResource.getContents().size());
Person p = (Person) loadResource.getContents().get(0);
assertEquals("Emil", p.getFirstName());
assertEquals("Tester", p.getLastName());
} catch (IOException e) {
fail("Error loading Person");
}
}

}
7 changes: 4 additions & 3 deletions org.gecko.emf.json.tests/test.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
com.fasterxml.jackson.dataformat.jackson-dataformat-properties;version='[2.13.2,2.13.3)',\
com.fasterxml.jackson.dataformat.jackson-dataformat-yaml;version='[2.13.2,2.13.3)',\
de.undercouch.bson4jackson;version='[2.13.1,2.13.2)',\
emfjson-jackson;version='[2.1.0,2.1.1)',\
junit-jupiter-api;version='[5.8.2,5.8.3)',\
junit-platform-commons;version='[1.8.2,1.8.3)',\
net.bytebuddy.byte-buddy;version='[1.12.8,1.12.9)',\
Expand All @@ -32,9 +31,11 @@
org.opentest4j;version='[1.2.0,1.2.1)',\
org.osgi.service.component;version='[1.4.0,1.4.1)',\
org.osgi.util.function;version='[1.1.0,1.1.1)',\
org.osgi.util.promise;version='[1.1.1,1.1.2)',\
org.osgi.util.pushstream;version='[1.0.1,1.0.2)',\
org.yaml.snakeyaml;version='[1.30.0,1.30.1)'
org.yaml.snakeyaml;version='[1.30.0,1.30.1)',\
org.apache.felix.converter;version='[1.0.18,1.0.19)',\
org.eclipse.emfcloud.emfjson-jackson;version='[2.1.0,2.1.1)',\
org.osgi.util.promise;version='[1.2.0,1.2.1)'



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
*/
package org.gecko.emf.json.configuration;

import static org.eclipse.emfcloud.jackson.databind.EMFContext.Attributes.ROOT_ELEMENT;
import static org.eclipse.emfcloud.jackson.databind.EMFContext.Attributes.RESOURCE;
import static org.eclipse.emfcloud.jackson.databind.EMFContext.Attributes.RESOURCE_SET;

Expand Down Expand Up @@ -107,11 +108,6 @@ public ObjectMapper configureMapper(Map<?, ?> options) {

private EMFModule createInitModule(Map<?, ?> options, boolean isNew) {
EMFModule module = new EMFModule();
Boolean serContainment = getOrDefault(options, EMFJs.OPTION_SERIALIZE_CONTAINMENT_AS_HREF,
isNew ? false : null);
if (serContainment != null) {
module.configure(Feature.OPTION_SERIALIZE_CONTAINMENT_AS_HREF, serContainment);
}
Boolean serDefaults = getOrDefault(options, EMFJs.OPTION_SERIALIZE_DEFAULT_VALUE, isNew ? false : null);
if (serDefaults != null) {
module.configure(Feature.OPTION_SERIALIZE_DEFAULT_VALUE, serDefaults);
Expand Down Expand Up @@ -216,6 +212,10 @@ protected void doLoad(InputStream inputStream, Map<?, ?> options) throws IOExcep

ContextAttributes attributes = EMFContext.from(options).withPerCallAttribute(RESOURCE_SET, getResourceSet())
.withPerCallAttribute(RESOURCE, this);
EClass eclass = getOrDefault(options, EMFJs.OPTION_ROOT_ELEMENT, null);
if (eclass != null) {
attributes = attributes.withPerCallAttribute(ROOT_ELEMENT, eclass);
}

configureMapper(options).reader().with(attributes).forType(Resource.class).withValueToUpdate(this)
.readValue(inputStream);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,6 @@ public final class EMFJs {
*/
public static final String OPTION_INDENT_OUTPUT = "OPTION_INDENT_OUTPUT";

/**
* Option used to indicate the module to serialize containments as references.
*/
public static final String OPTION_SERIALIZE_CONTAINMENT_AS_HREF = "OPTION_SERIALIZE_CONTAINMENT_AS_HREF";
/**
* When value is true, the writer will include an _id key to each json objects
* and sets as value the fragment identifier.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ public void convertAnnotation(Annotation annotation, boolean serialize, Map<Obje

options.put(EMFJs.OPTION_DATE_FORMAT, config.dateFormat());
options.put(EMFJs.OPTION_INDENT_OUTPUT, config.indentOutput());
options.put(EMFJs.OPTION_SERIALIZE_CONTAINMENT_AS_HREF, config.serializeContainmentAsHref());
options.put(EMFJs.OPTION_SERIALIZE_DEFAULT_VALUE, config.serializeDefaultValues());
options.put(EMFJs.OPTION_SERIALIZE_TYPE, config.serializeTypes());
options.put(EMFJs.OPTION_USE_ID, config.useId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,6 @@
*/
boolean indentOutput() default true;

/**
* return @see {@link EMFJs#OPTION_SERIALIZE_CONTAINMENT_AS_HREF} default is false
*/
boolean serializeContainmentAsHref() default false;

/**
* return @see {@link EMFJs#OPTION_SERIALIZE_DEFAULT_VALUE} default is false
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
-plugin.geckoEMFUtil: \
aQute.bnd.repository.maven.provider.MavenBndRepository;\
releaseUrl = "https://repo.maven.apache.org/maven2/,https://devel.data-in-motion.biz/nexus/repository/dim-release/"; \
snapshotUrl = "https://devel.data-in-motion.biz/nexus/repository/dim-snapshot/";\
snapshotUrl = "https://devel.data-in-motion.biz/nexus/repository/dim-snapshot/,https://oss.sonatype.org/content/repositories/snapshots/";\
index = "${.}/geckoEMFUtil.maven" ;\
readOnly = true;\
name="GeckoEMF Util Dependencies"
name="GeckoEMF Util Dependencies"
16 changes: 16 additions & 0 deletions org.gecko.emf.util.documentation.generators.apis/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="aQute.bnd.classpath.container"/>
<classpathentry kind="src" output="bin" path="src"/>
<classpathentry kind="src" output="bin_test" path="test">
<attributes>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin"/>
</classpath>
2 changes: 2 additions & 0 deletions org.gecko.emf.util.documentation.generators.apis/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/bin/
/bin_test/
23 changes: 23 additions & 0 deletions org.gecko.emf.util.documentation.generators.apis/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.gecko.emf.util.documentation.generators.apis</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>bndtools.core.bndbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>bndtools.core.bndnature</nature>
</natures>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
eclipse.preferences.version=1
encoding//.settings/org.eclipse.core.resources.prefs=UTF-8
encoding//.settings/org.eclipse.jdt.core.prefs=UTF-8
encoding//.settings/org.eclipse.jdt.ui.prefs=UTF-8
encoding//src/org/gecko/emf/util/documentation/generators/apis/EcoreToDocumentationService.java=UTF-8
encoding//src/org/gecko/emf/util/documentation/generators/apis/package-info.java=UTF-8
encoding//src/test/component/Example.java=UTF-8
encoding//test/test/component/ExampleTest.java=UTF-8
encoding/bnd.bnd=UTF-8
encoding/launch.bndrun=UTF-8
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=11
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
content_assist_proposals_background=255,255,255
content_assist_proposals_foreground=0,0,0
eclipse.preferences.version=1
org.eclipse.jdt.ui.formatterprofiles.version=13
org.eclipse.jdt.ui.javadoc=true
org.eclipse.jdt.ui.text.code_templates_migrated=true
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * Returns the ${bare_field_name}.\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * Sets the ${bare_field_name}.\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * Creates a new instance.\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * Copyright (c) 2012 - ${year} Data In Motion and others.\r\n * All rights reserved. \r\n * \r\n * This program and the accompanying materials are made available under the terms of the \r\n * Eclipse Public License v1.0 which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n * Data In Motion - initial API and implementation\r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * ${tags}\r\n * @author ${user}\r\n * @since ${date}\r\n */</template><template autoinsert\="false" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/** ${field} */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* \r\n * (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
spelling_locale_initialized=true
useAnnotationsPrefPage=true
useQuickDiffPrefPage=true
7 changes: 7 additions & 0 deletions org.gecko.emf.util.documentation.generators.apis/bnd.bnd
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
javac.source: 11
javac.target: 11

-library: enable-emf

Bundle-Version: 1.0.0.SNAPSHOT
Export-Package: org.gecko.emf.util.documentation.generators.apis
Loading