diff --git a/.gitignore b/.gitignore
index 5d5cde8bc6..a98508e0fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -133,5 +133,3 @@
**/java-gen
**/src-gen/
-
-
diff --git a/neoemf-core/pom.xml b/neoemf-core/pom.xml
index 508461ea67..5bbfc48470 100644
--- a/neoemf-core/pom.xml
+++ b/neoemf-core/pom.xml
@@ -19,8 +19,8 @@
- 3.21ea41
- 2.21ea43
+ 3.22ea5
+ 2.22ea17
2.14.1
3.3.0
@@ -143,6 +143,18 @@
true
pom
+
+ com.google.code.findbugs
+ jsr305
+ 3.0.2
+ compile
+
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/berkeleydb/pom.xml b/neoemf-data/berkeleydb/pom.xml
index b748ae7a20..52f14f76ce 100644
--- a/neoemf-data/berkeleydb/pom.xml
+++ b/neoemf-data/berkeleydb/pom.xml
@@ -27,6 +27,12 @@
com.sleepycat
je
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/blueprints/core/pom.xml b/neoemf-data/blueprints/core/pom.xml
index 0aaecb6bf8..7029fcd377 100644
--- a/neoemf-data/blueprints/core/pom.xml
+++ b/neoemf-data/blueprints/core/pom.xml
@@ -39,6 +39,12 @@
org.eclipse.emf.ecore
test
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/blueprints/neo4j/pom.xml b/neoemf-data/blueprints/neo4j/pom.xml
index ba214588c7..6403c03acb 100644
--- a/neoemf-data/blueprints/neo4j/pom.xml
+++ b/neoemf-data/blueprints/neo4j/pom.xml
@@ -72,6 +72,12 @@
test-jar
test
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/blueprints/pom.xml b/neoemf-data/blueprints/pom.xml
index 02507fae72..c5d7b7a585 100644
--- a/neoemf-data/blueprints/pom.xml
+++ b/neoemf-data/blueprints/pom.xml
@@ -24,5 +24,13 @@
2.6.0
1.10
+
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
+
diff --git a/neoemf-data/hbase/pom.xml b/neoemf-data/hbase/pom.xml
index c1f7e9ee97..ee21fda8a0 100644
--- a/neoemf-data/hbase/pom.xml
+++ b/neoemf-data/hbase/pom.xml
@@ -97,6 +97,12 @@
junit-vintage-engine
${junit.version}
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/mapdb/pom.xml b/neoemf-data/mapdb/pom.xml
index 3d15e0e12f..3835e016d0 100644
--- a/neoemf-data/mapdb/pom.xml
+++ b/neoemf-data/mapdb/pom.xml
@@ -36,6 +36,12 @@
-->
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/mongodb/pom.xml b/neoemf-data/mongodb/pom.xml
index e77efc173d..d2eaa92990 100644
--- a/neoemf-data/mongodb/pom.xml
+++ b/neoemf-data/mongodb/pom.xml
@@ -36,6 +36,12 @@
de.flapdoodle.embed.mongo
compile
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-data/pom.xml b/neoemf-data/pom.xml
index d6b01fec7d..08db16082e 100644
--- a/neoemf-data/pom.xml
+++ b/neoemf-data/pom.xml
@@ -104,6 +104,12 @@
${project.version}
runtime
+
+ com.devialab
+ jackson-jsonld-maven
+ 0.0.4
+ compile
+
diff --git a/neoemf-io/pom.xml b/neoemf-io/pom.xml
index a2a7dd41ad..bb8be17377 100644
--- a/neoemf-io/pom.xml
+++ b/neoemf-io/pom.xml
@@ -22,9 +22,19 @@
1.0-2
4.2.1
4.4.1
+ 2.13.1
+
+
+ oss.sonatype.org-snapshot
+ http://oss.sonatype.org/content/repositories/snapshots
+ false
+ true
+
+
+
@@ -82,6 +92,24 @@
org.eclipse.emf.ecore.xcore.lib
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+ compile
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+ compile
+
+
+
+
@@ -111,14 +139,24 @@
assertj-core
+
+ org.emfjson
+ emfjson-jackson
+ 1.3.0
+ bundle
+
+
+
+
@@ -129,7 +167,7 @@
org.eclipse.platform
org.eclipse.core.runtime
- [3.20.0,)
+ 3.23.0
test
@@ -156,6 +194,10 @@
pom
test
+
+ org.eclipse.emf
+ org.eclipse.emf.ecore.xmi
+
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/AbstractNotifier.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/AbstractNotifier.java
index 238622e274..a8fde81881 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/AbstractNotifier.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/AbstractNotifier.java
@@ -79,7 +79,7 @@ public void notifyInitialize() throws IOException {
@Override
public void notifyStartElement(ProxyElement element) throws IOException {
- checkNotNull(element, "element");
+ checkNotNull(element, "element");
for (H h : handlers) {
h.onStartElement(element);
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/Migrator.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/Migrator.java
index fe10c443f4..6801ce9439 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/Migrator.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/Migrator.java
@@ -19,14 +19,17 @@
import fr.inria.atlanmod.neoemf.io.reader.AbstractReader;
import fr.inria.atlanmod.neoemf.io.reader.DefaultMapperReader;
import fr.inria.atlanmod.neoemf.io.reader.Reader;
-import fr.inria.atlanmod.neoemf.io.reader.XmiStreamReader;
+import fr.inria.atlanmod.neoemf.io.reader.xmi.XmiStreamReader;
import fr.inria.atlanmod.neoemf.io.writer.DefaultMapperWriter;
import fr.inria.atlanmod.neoemf.io.writer.Writer;
-import fr.inria.atlanmod.neoemf.io.writer.XmiStreamWriter;
+import fr.inria.atlanmod.neoemf.io.writer.json.JsonStreamWriter;
+import fr.inria.atlanmod.neoemf.io.writer.xmi.XmiStreamWriter;
import org.atlanmod.commons.annotation.VisibleForTesting;
import org.atlanmod.commons.log.Level;
import org.atlanmod.commons.log.Log;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.io.File;
@@ -285,6 +288,36 @@ public Migrator toXmi(@WillNotClose OutputStream stream) throws IOException {
return to(new XmiStreamWriter(stream));
}
+ /**
+ * Specifies the JSON {@code file} where to write the data.
+ *
+ * @param file the file where to write
+ *
+ * @return this migrator (for chaining)
+ *
+ * @throws IOException if an I/O error occurs during the creation
+ * @see #toXmi(File, boolean)
+ */
+ @Nonnull
+ public Migrator toJson(File file) throws IOException {
+ OutputStream outputStream = new FileOutputStream(file);
+ return toJson(outputStream);
+ }
+
+ /**
+ * Specifies the {@code stream} where to write the data.
+ *
+ * @param stream the file where to write
+ *
+ * @return this migrator (for chaining)
+ *
+ * @throws IOException if an I/O error occurs when writing
+ */
+ @Nonnull
+ public Migrator toJson(@WillNotClose OutputStream stream) throws IOException {
+ return to(new JsonStreamWriter(stream));
+ }
+
//endregion
//region Listeners
@@ -370,6 +403,8 @@ public void migrate() throws IOException {
try {
// Bind handlers and notifiers
Collection handlers = new ArrayList<>(listeners.size() + writers.size());
+ final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
+ logger.info("writers :: {}", writers.toArray());
handlers.addAll(listeners);
handlers.addAll(writers);
reader.addNext(new NoopProcessor(handlers));
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/processor/EcoreMapper.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/processor/EcoreMapper.java
index 93cee521ac..1356772e8d 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/processor/EcoreMapper.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/processor/EcoreMapper.java
@@ -24,6 +24,8 @@
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayDeque;
@@ -45,6 +47,8 @@ public class EcoreMapper extends AbstractProcessor {
/**
* A LIFO that holds the current {@link Id} chain.
*/
+
+ final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@Nonnull
private final Deque identifiers = new ArrayDeque<>();
@@ -112,7 +116,13 @@ private void processElementAsRoot(ProxyElement element) throws IOException {
checkNotNull(element.getMetaClass(), "The root element must have a namespace");
// Retrieve the current EClass & define the meta-class of the current element if not present
+ // element is not null
+ // logger.info("ProxyElement is null:: {}", element == null);
final ProxyClass metaClass = element.getMetaClass();
+ // metaClass is not null
+ //logger.info("metaClass is null:: {}", metaClass == null);
+ // the following condition is true
+ //logger.info("metaClass name space getOrgin is null:: {}", metaClass.getNamespace().getOrigin() == null);
final EClass eClass = getClass(element.getName(), metaClass.getNamespace().getOrigin());
metaClass.setOrigin(eClass);
@@ -281,8 +291,10 @@ private EStructuralFeature getFeature(String name) {
*/
@Nonnull
private EClass getClass(String name, EPackage ePackage) {
+
+ logger.info("ePackage is null :: {}", ePackage == null);
EClass eClass = (EClass) ePackage.getEClassifier(name);
- checkNotNull(eClass, "Unable to find EClass '%s' from EPackage '%s'", name, ePackage.getNsURI());
+ checkNotNull(eClass, "Unable to find EClass '%s' from EPackage '%s'", name, ePackage.getNsURI());
return eClass;
}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/proxy/ProxyPackage.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/proxy/ProxyPackage.java
index 3ec7cae592..8874a77cad 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/proxy/ProxyPackage.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/proxy/ProxyPackage.java
@@ -14,31 +14,30 @@
import org.atlanmod.commons.annotation.VisibleForTesting;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
+import java.util.*;
+
import static org.atlanmod.commons.Preconditions.checkNotNull;
+
/**
* A simple representation of a {@link org.eclipse.emf.ecore.EPackage}.
*/
@ParametersAreNonnullByDefault
-public class ProxyPackage implements Proxy {
+public class ProxyPackage extends EPackageImpl implements Proxy {
/**
* The instance of the default namespace: {@code ecore @ http://www.eclipse.org/emf/2002/Ecore}.
*/
@Nonnull
public static final ProxyPackage DEFAULT = Registry.getInstance().register(EcorePackage.eINSTANCE);
-
/**
* The prefix of this namespace.
*/
@@ -51,12 +50,27 @@ public class ProxyPackage implements Proxy {
@Nonnull
private final String uri;
+ final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
+
/**
* The {@link EPackage} represented by this object.
*/
@Nonnull
private final LazyReference ePackage = LazyReference.soft(() -> {
+
+ // Until here we don't have a null object
EPackage p = EPackage.Registry.INSTANCE.getEPackage(getUri());
+
+ logger.info("URI :: {}", getUri());
+ logger.info("the ePackage :: {}", p);
+ if(p == null && getUri().equals("http://www.neoemf.com/tests/sample")){
+ // create an EPackage object
+ p = EPackage.Registry.INSTANCE.getEPackage("http://www.neoemf.com/tests/sample");
+ logger.info("The ePackage is null");
+
+ //p = new ProxyPackage("sample", "http://www.neoemf.com/tests/sample");
+ }
+
checkNotNull(p, "EPackage %s is not registered.", getUri());
return p;
});
@@ -70,11 +84,14 @@ public class ProxyPackage implements Proxy {
private ProxyPackage(String prefix, String uri) {
this.prefix = prefix;
this.uri = uri;
+
+ // logger.info("prefix :: {}, namespace :: {}", prefix, uri);
}
@Override
public EPackage getOrigin() {
return ePackage.get();
+ //return (ePackage != null) ? ePackage.get(): new EPackageImpl("", )
}
@Nonnull
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractStreamReader.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractStreamReader.java
index db643202fc..6fa7f1496c 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractStreamReader.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractStreamReader.java
@@ -77,7 +77,7 @@ public abstract class AbstractStreamReader extends AbstractReader {
@Override
public final void read(InputStream source) throws IOException {
- checkNotNull(source, "source");
+ checkNotNull(source, "source");
try (InputStream in = new BufferedInputStream(source)) {
parse(in);
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/Test.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/Test.java
new file mode 100644
index 0000000000..b356b2692a
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/Test.java
@@ -0,0 +1,13 @@
+package fr.inria.atlanmod.neoemf.io.reader;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class Test {
+ public static void main(String[] args) throws IOException {
+ Path fileName = Path.of("demo.txt");
+ String store_xml = Files.readString(fileName);
+ System.out.println(store_xml);
+ }
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/AbstractJsonStreamReader.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/AbstractJsonStreamReader.java
new file mode 100644
index 0000000000..87b5553a8d
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/AbstractJsonStreamReader.java
@@ -0,0 +1,54 @@
+package fr.inria.atlanmod.neoemf.io.reader.json;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import fr.inria.atlanmod.neoemf.io.reader.AbstractStreamReader;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+
+public class AbstractJsonStreamReader extends AbstractStreamReader {
+
+ private final Logger logger = LoggerFactory.getLogger(AbstractJsonStreamReader.class);
+
+ /*public AbstractJsonStreamReader(){
+ JsonReaderHelper.resourceSet.getResourceFactoryRegistry()
+ .getExtensionToFactoryMap()
+ .put("json", new JsonResourceFactory());
+
+ }*/
+
+ @Override
+ public void parse(@NotNull InputStream stream) throws IOException {
+ /*
+ resource = JsonReaderHelper.mapper.reader()
+ .withAttribute(EMFContext.Attributes.RESOURCE_SET, JsonReaderHelper.resourceSet)
+ .withAttribute(EMFContext.Attributes.RESOURCE_URI, JsonReaderHelper.resourceData)
+ .forType(Resource.class)
+ .readValue(stream);
+
+
+ String theString = IOUtils.toString(stream, StandardCharsets.UTF_8);
+ ObjectMapper mapper = new ObjectMapper();
+ Reader reader = new StringReader(theString);
+
+ */
+ }
+
+
+ @Override
+ protected boolean isSpecialAttribute(@Nullable String prefix, String name, String value) throws IOException {
+ return false;
+ }
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonReaderHelper.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonReaderHelper.java
new file mode 100644
index 0000000000..33b67893ee
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonReaderHelper.java
@@ -0,0 +1,17 @@
+package fr.inria.atlanmod.neoemf.io.reader.json;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import java.io.InputStream;
+
+
+public class JsonReaderHelper {
+
+ public static final ObjectMapper mapper = new ObjectMapper();
+ public static final ResourceSet resourceSet = new ResourceSetImpl();
+ public static final String resourceData = "/Users/macbook/eclipse-workspace/NeoEMF/neoemf-io/src/main/resources/data.json";
+
+
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonStreamReader.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonStreamReader.java
new file mode 100644
index 0000000000..3d5da5bb4a
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/JsonStreamReader.java
@@ -0,0 +1,5 @@
+package fr.inria.atlanmod.neoemf.io.reader.json;
+
+public class JsonStreamReader extends AbstractJsonStreamReader {
+
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/User.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/User.java
new file mode 100644
index 0000000000..abea086daf
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/json/User.java
@@ -0,0 +1,39 @@
+package fr.inria.atlanmod.neoemf.io.reader.json;
+
+public class User {
+
+ private int id;
+ private String name;
+
+ public User(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public User() {
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/store.xml b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/store.xml
new file mode 100644
index 0000000000..2b42d41917
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/store.xml
@@ -0,0 +1,91 @@
+
+
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractXmiStreamReader.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/AbstractXmiStreamReader.java
similarity index 96%
rename from neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractXmiStreamReader.java
rename to neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/AbstractXmiStreamReader.java
index b2cd73a387..61eaf5293e 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/AbstractXmiStreamReader.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/AbstractXmiStreamReader.java
@@ -6,13 +6,14 @@
* this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/
*/
-package fr.inria.atlanmod.neoemf.io.reader;
+package fr.inria.atlanmod.neoemf.io.reader.xmi;
import fr.inria.atlanmod.neoemf.io.processor.AbstractProcessor;
import fr.inria.atlanmod.neoemf.io.processor.EcoreMapper;
import fr.inria.atlanmod.neoemf.io.processor.XPathResolver;
import fr.inria.atlanmod.neoemf.io.proxy.ProxyReference;
import fr.inria.atlanmod.neoemf.io.proxy.ProxyValue;
+import fr.inria.atlanmod.neoemf.io.reader.AbstractStreamReader;
import fr.inria.atlanmod.neoemf.io.util.XmiConstants;
import org.atlanmod.commons.log.Log;
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/XmiStreamReader.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/XmiStreamReader.java
similarity index 99%
rename from neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/XmiStreamReader.java
rename to neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/XmiStreamReader.java
index 49b21654f6..612b524189 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/XmiStreamReader.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/reader/xmi/XmiStreamReader.java
@@ -6,7 +6,7 @@
* this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/
*/
-package fr.inria.atlanmod.neoemf.io.reader;
+package fr.inria.atlanmod.neoemf.io.reader.xmi;
import com.ctc.wstx.api.WstxInputProperties;
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/util/JsonConstants.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/util/JsonConstants.java
new file mode 100644
index 0000000000..e9213936a9
--- /dev/null
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/util/JsonConstants.java
@@ -0,0 +1,11 @@
+package fr.inria.atlanmod.neoemf.io.util;
+
+import org.atlanmod.commons.annotation.Static;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+@Static
+@ParametersAreNonnullByDefault
+public final class JsonConstants {
+
+}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/AbstractWriter.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/AbstractWriter.java
index f7e1eda687..3fb593ee2c 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/AbstractWriter.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/AbstractWriter.java
@@ -139,7 +139,6 @@ public void onEndElement() throws IOException {
/**
* Handles an attribute in the current element.
- *
* @param attribute the new attribute, without its value
* @param values the ordered values of the attribute; when the {@code attribute} is single-valued, this parameter
* is a {@link Collections#singletonList(Object)}
diff --git a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/DefaultMapperWriter.java b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/DefaultMapperWriter.java
index 9ad8e82451..9a480872da 100644
--- a/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/DefaultMapperWriter.java
+++ b/neoemf-io/src/main/java/fr/inria/atlanmod/neoemf/io/writer/DefaultMapperWriter.java
@@ -60,7 +60,6 @@ public void onComplete() {
@Override
public void onStartElement(ProxyElement element) throws IOException {
super.onStartElement(element);
-
createElement(element, false);
}
@@ -72,10 +71,19 @@ public void onAttribute(ProxyAttribute attribute, List