diff --git a/magicdraw-plugin/org.eclipse.epsilon.emc.magicdraw.mdplugin.remote/src/org/eclipse/epsilon/emc/magicdraw/mdplugin/remote/ModelAccessService.java b/magicdraw-plugin/org.eclipse.epsilon.emc.magicdraw.mdplugin.remote/src/org/eclipse/epsilon/emc/magicdraw/mdplugin/remote/ModelAccessService.java index f6fcc24..1877663 100644 --- a/magicdraw-plugin/org.eclipse.epsilon.emc.magicdraw.mdplugin.remote/src/org/eclipse/epsilon/emc/magicdraw/mdplugin/remote/ModelAccessService.java +++ b/magicdraw-plugin/org.eclipse.epsilon.emc.magicdraw.mdplugin.remote/src/org/eclipse/epsilon/emc/magicdraw/mdplugin/remote/ModelAccessService.java @@ -427,15 +427,27 @@ public void createInstance(CreateInstanceRequest request, StreamObserver { + final Either errorOrRoot = findRootElement(request.getRootElementHyperlink(), project); + return errorOrRoot.flatMapRight((root) -> { + final Element rootElement = (Element) root; try { - ModelElementsManager.getInstance().addElement((Element) mdObject, (Element) root); + if (rootElement.canAdd(mdObject)) { + ModelElementsManager.getInstance().addElement((Element) mdObject, rootElement); + } return Either.right(encoder.encode(mdObject)); } catch (ReadOnlyElementException e) { LOGGER.error(e.getMessage(), e); return Either.left(Status.INVALID_ARGUMENT - .withDescription(String.format("Element with ID %s is read only", ((Element) root).getID())) + .withDescription(String.format("Element with ID %s is read only", rootElement.getID())) .asRuntimeException()); + } catch (IllegalArgumentException e) { + /* + * Some objects falsely report canAdd() = true (e.g. + * EnumerationLiteral instances): we log a warning + * and return them as is. + */ + LOGGER.warn(e.getMessage(), e); + return Either.right(encoder.encode(mdObject)); } }); } diff --git a/tests/org.eclipse.epsilon.emc.magicdraw.remote.tests/src/org/eclipse/epsilon/emc/magicdraw/remote/ZooModelTest.java b/tests/org.eclipse.epsilon.emc.magicdraw.remote.tests/src/org/eclipse/epsilon/emc/magicdraw/remote/ZooModelTest.java index ff2f99a..53e400e 100644 --- a/tests/org.eclipse.epsilon.emc.magicdraw.remote.tests/src/org/eclipse/epsilon/emc/magicdraw/remote/ZooModelTest.java +++ b/tests/org.eclipse.epsilon.emc.magicdraw.remote.tests/src/org/eclipse/epsilon/emc/magicdraw/remote/ZooModelTest.java @@ -582,6 +582,13 @@ public void allProfiles() throws Exception { assertTrue("There should be at least one predefined profile", (int) module.execute() > 1); } + @Test + public void addEnumerationLiteral() throws Exception { + EolModule module = createEOLModule(); + module.parse("return new EnumerationLiteral();"); + assertNotNull(module.execute()); + } + private void assumeTypeExists(String typeName) { try { m.getAllOfKind(typeName);