diff --git a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java index 4e23324e4bf1fabde9f9dda3abb485d40904c28c..0efaf13dc0658ccc82a20b4d3524772af2fa54e4 100644 --- a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java +++ b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java @@ -1,5 +1,6 @@ package org.etsi.mts.tdl.transform; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -22,6 +23,7 @@ import org.etsi.mts.tdl.DataType; import org.etsi.mts.tdl.Element; import org.etsi.mts.tdl.ElementImport; import org.etsi.mts.tdl.EnumDataType; +import org.etsi.mts.tdl.Extension; import org.etsi.mts.tdl.NamedElement; import org.etsi.mts.tdl.Package; import org.etsi.mts.tdl.PackageableElement; @@ -103,6 +105,31 @@ public abstract class AbstractTranslator { return collectionType; } + protected <T extends DataType> void addSuperType(T type, T superType) { + if (superType == null) + return; + List<Extension> ext = null; + if (type instanceof SimpleDataType) { + Extension extension = ((SimpleDataType) type).getExtension(); + if (extension != null) + ext = Collections.singletonList(extension); + } + if (type instanceof StructuredDataType) + ext = ((StructuredDataType) type).getExtension(); + if (ext == null) + return; + for (Extension e : ext) { + if (e.getExtending().equals(superType)) + return; + } + Extension e = tdlFactory.eINSTANCE.createExtension(); + e.setExtending(superType); + if (type instanceof SimpleDataType) + ((SimpleDataType) type).setExtension(e); + if (type instanceof StructuredDataType) + ((StructuredDataType) type).getExtension().add(e); + } + protected String idStartDigitRegex = "\\A\\d"; protected String idInvalidCharRegex = "\\W"; @@ -253,11 +280,11 @@ public abstract class AbstractTranslator { return null; } - protected DataElementMapping addDataElementMapping(String uri, DataType dataType, String tag) { + protected DataElementMapping addDataElementMapping(String uri, DataType dataType, String tag, DataResourceMapping resourceMapping) { DataElementMapping mapping = getTypeFor(dataType.getName()+"_"+tag, tdlPackage.Literals.DATA_ELEMENT_MAPPING); mapping.setMappableDataElement(dataType); mapping.setElementURI(uri); - mapping.setDataResourceMapping(drm); + mapping.setDataResourceMapping(resourceMapping); return mapping; } diff --git a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java index 707d6d6bf0203b82d508e59040e220fb633b6040..d4cccf9e0c07d0cc3580e8cf8e44391bb165b4fb 100644 --- a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java +++ b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java @@ -1,7 +1,6 @@ package org.etsi.mts.tdl.openapi2tdl.next; import java.io.File; -import java.util.Collections; import java.util.HashSet; import java.util.Hashtable; import java.util.List; @@ -22,7 +21,6 @@ import org.etsi.mts.tdl.DataType; import org.etsi.mts.tdl.DataUse; import org.etsi.mts.tdl.ElementImport; import org.etsi.mts.tdl.EnumDataType; -import org.etsi.mts.tdl.Extension; import org.etsi.mts.tdl.LiteralValueUse; import org.etsi.mts.tdl.Member; import org.etsi.mts.tdl.MemberAssignment; @@ -403,12 +401,11 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator { private void addMapping(Schema<?> schema, DataType dataType, String sourceMappingTag, String targetMappingTag) { DataElementMapping sourceMapping = addDataElementMapping("#/components/schemas/" + schema.getName() + "", - dataType, sourceMappingTag); + dataType, sourceMappingTag, drm); // TODO: make configurable? DataElementMapping targetMapping = addDataElementMapping("" + schema.getName() + "", dataType, - targetMappingTag); - targetMapping.setDataResourceMapping(drmTarget); + targetMappingTag, drmTarget); if (dataType instanceof StructuredDataType) { for (Member m : ((StructuredDataType) dataType).getMember()) { @@ -478,31 +475,6 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator { } } - private <T extends DataType> void addSuperType(T type, T superType) { - if (superType == null) - return; - List<Extension> ext = null; - if (type instanceof SimpleDataType) { - Extension extension = ((SimpleDataType) type).getExtension(); - if (extension != null) - ext = Collections.singletonList(extension); - } - if (type instanceof StructuredDataType) - ext = ((StructuredDataType) type).getExtension(); - if (ext == null) - return; - for (Extension e : ext) { - if (e.getExtending().equals(superType)) - return; - } - Extension e = tdlFactory.eINSTANCE.createExtension(); - e.setExtending(superType); - if (type instanceof SimpleDataType) - ((SimpleDataType) type).setExtension(e); - if (type instanceof StructuredDataType) - ((StructuredDataType) type).getExtension().add(e); - } - private DataType translateObject(Schema<?> schema, String name) { StructuredDataType dataType = getStructuredDataTypeFor(name); if (schema.getProperties() == null || !dataType.getMember().isEmpty()) { diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF index 743af89cbfe36e86c6de726e3809d12e5c842779..cbab1cef08c4b34b2345fe0cec3cda13163e5411 100644 --- a/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF +++ b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF @@ -13,6 +13,7 @@ Require-Bundle: org.etsi.mts.tdl.common, org.eclipse.ui;resolution:=optional, org.eclipse.core.resources;resolution:=optional, org.eclipse.core.runtime;bundle-version="3.26.100";resolution:=optional, - org.etsi.mts.tdl.extras.yang.tools.wrapper + org.etsi.mts.tdl.extras.yang.tools.wrapper, + org.eclipse.ui.ide Automatic-Module-Name: org.etsi.mts.tdl.yang2tdl Bundle-ClassPath: . diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java index f43317d251425056246d5758523f749087bd7662..f1b14baaaacb119b57593de932ac6fb942b8ab1e 100644 --- a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java +++ b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java @@ -5,25 +5,27 @@ import java.util.Hashtable; import java.util.List; import java.util.Map; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.jface.preference.BooleanFieldEditor; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.StringFieldEditor; +import org.eclipse.jface.preference.StringButtonFieldEditor; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchPropertyPage; +import org.eclipse.ui.dialogs.ContainerSelectionDialog; import org.eclipse.ui.preferences.ScopedPreferenceStore; public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage { - public static final String PROCEDURE_BASED = "ProcedureBased", - GENERATE_JAVA_MAPPING = "GenerateJavaMapping", - JAVA_GENERATOR = "JavaMappingGenerator", - JAVA_API_PACKAGE = "JavaApiPackage"; + public static final String YANG_SPEC_LOCATION = "YangFilesLocation"; public static final String PREFERENCE_SCOPE = "org.etsi.mts.tdl.yang2tdl"; @@ -33,7 +35,7 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc protected Map<FieldEditor, String> fields = new Hashtable<FieldEditor, String>(); - private StringFieldEditor javaApiPackage; +// private StringFieldEditor javaApiPackage; public PropertyPage() { super(GRID); @@ -53,7 +55,7 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc protected IPreferenceStore doGetPreferenceStore() { ProjectScope ps = new ProjectScope((IProject) this.element); ScopedPreferenceStore scopedStore = new ScopedPreferenceStore(ps, PREFERENCE_SCOPE); - scopedStore.setDefault(JAVA_GENERATOR, "java"); +// scopedStore.setDefault(JAVA_GENERATOR, "java"); return scopedStore; } @@ -68,11 +70,11 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc } protected void initialize(String name, String value, FieldEditor e) { - if (name.equals(GENERATE_JAVA_MAPPING)) { - javaApiPackage.setEnabled( - Boolean.valueOf(value), - getFieldEditorParent()); - } +// if (name.equals(GENERATE_JAVA_MAPPING)) { +// javaApiPackage.setEnabled( +// Boolean.valueOf(value), +// getFieldEditorParent()); +// } } @Override @@ -109,21 +111,13 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc protected void createFieldEditors() { Composite parent = getFieldEditorParent(); - BooleanFieldEditor procBased = new BooleanFieldEditor(PROCEDURE_BASED, "Procedure-based API", parent); - addField(procBased); - - parent = getFieldEditorParent(); - BooleanFieldEditor genJavaMappings = new BooleanFieldEditor(GENERATE_JAVA_MAPPING, "Generate type mappings for Java", parent); - addField(genJavaMappings); - - parent = getFieldEditorParent(); - StringFieldEditor javaGenerator = new StringFieldEditor(JAVA_GENERATOR, "Code generator for mappings", parent); - javaGenerator.setEnabled(false, parent); - addField(javaGenerator); - - parent = getFieldEditorParent(); - javaApiPackage = new StringFieldEditor(JAVA_API_PACKAGE, "Java API package", parent); - addField(javaApiPackage); + FieldEditor yangSpecLocation = new ContainerFieldEditor(YANG_SPEC_LOCATION, "Yang files location", parent) { + @Override + public boolean isValid() { + return PropertyPage.this.isValid(this) && doCheckState(); + } + }; + addField(yangSpecLocation); // TODO } @@ -142,4 +136,43 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc return true; } +} + +class ContainerFieldEditor extends StringButtonFieldEditor { + + public ContainerFieldEditor(String name, String label, Composite parent) { + super(name, label, parent); + } + + @Override + protected String changePressed() { + + IContainer root = ResourcesPlugin.getWorkspace().getRoot(); + ContainerSelectionDialog d = new ContainerSelectionDialog(getShell(), root, true, "Select output folder"); + int result = d.open(); + if (result == 0) { + Object[] dir = d.getResult(); + if (dir.length > 0) + return dir[0].toString(); + } + return null; + } + + @Override + protected boolean doCheckState() { + String pathText = getTextControl().getText(); + IPath path = new Path(pathText); + IContainer root = ResourcesPlugin.getWorkspace().getRoot(); + IFolder f; + try { + f = root.getFolder(path); + } catch (IllegalArgumentException e) { + setErrorMessage(e.getMessage()); + return false; + } + if (!f.exists()) + setErrorMessage(pathText + " does not exist!"); + return f != null && f.exists(); + } + } \ No newline at end of file diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java index dfecea5f35409db121ae94da124c73c9b09e031a..f41e75eef433dc700affcf188320d112e94618d3 100644 --- a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java +++ b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java @@ -7,14 +7,18 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.emf.ecore.resource.Resource; +import org.etsi.mts.tdl.Annotation; +import org.etsi.mts.tdl.AnnotationType; import org.etsi.mts.tdl.CollectionDataType; import org.etsi.mts.tdl.Constraint; import org.etsi.mts.tdl.DataElementMapping; +import org.etsi.mts.tdl.DataResourceMapping; import org.etsi.mts.tdl.DataType; import org.etsi.mts.tdl.ElementImport; import org.etsi.mts.tdl.EnumDataType; @@ -32,6 +36,8 @@ import org.etsi.mts.tdl.helper.TDLHelper; import org.etsi.mts.tdl.transform.AbstractTranslator; import org.opendaylight.yangtools.odlext.parser.MountStatementSupport; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerLike; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; @@ -41,6 +47,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement; @@ -84,6 +91,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { private StructuredDataType messageBody = null; private String limit = null; + private AnnotationType mappingNameAnnotation; public void setLimit(String limit) { this.limit = limit; @@ -138,36 +146,46 @@ public class Yang2TDLTranslator extends AbstractTranslator { } theTdlPackage = TDLHelper.getTdlPackage(getTargetResource()); + mappingNameAnnotation = null; if (theTdlPackage != null) { ElementImport importTdl = tdlFactory.eINSTANCE.createElementImport(); importTdl.setImportedPackage(theTdlPackage); getGeneratedPackage().getImport().add(importTdl); // TODO Remove default string type getGeneratedPackage().getPackagedElement().remove(stringType); + + + for (PackageableElement e : theTdlPackage.getPackagedElement()) { + if (e.eClass().equals(tdlPackage.eINSTANCE.getAnnotationType()) + && e.getName().equals("MappingName")) { + mappingNameAnnotation = (AnnotationType) e; + break; + } + } } Package httpPackage = TDLHelper.getHttpPackage(getTargetResource()); Package httpMessageBasedPackage = null; - boolean useMessageBasedApi = true; - if (preferences != null) - useMessageBasedApi = !preferences.getBoolean(PropertyPage.PROCEDURE_BASED, false); - if (useMessageBasedApi) { - if (httpPackage != null) { - packages: for (Package p : httpPackage.getNestedPackage()) { - for (PackageableElement e : p.getPackagedElement()) { - if (e.eClass().equals(tdlPackage.eINSTANCE.getStructuredDataType()) - && e.getName().equals("Body")) { - this.messageBody = (StructuredDataType) e; - httpMessageBasedPackage = p; - break packages; - } +// boolean useMessageBasedApi = true; +// if (preferences != null) +// useMessageBasedApi = !preferences.getBoolean(PropertyPage.PROCEDURE_BASED, false); +// if (useMessageBasedApi) { +// } + if (httpPackage != null) { + packages: for (Package p : httpPackage.getNestedPackage()) { + for (PackageableElement e : p.getPackagedElement()) { + if (e.eClass().equals(tdlPackage.eINSTANCE.getStructuredDataType()) + && e.getName().equals("Body")) { + this.messageBody = (StructuredDataType) e; + httpMessageBasedPackage = p; + break packages; } } - if (httpMessageBasedPackage != null) { - ElementImport importHttp = tdlFactory.eINSTANCE.createElementImport(); - importHttp.setImportedPackage(httpMessageBasedPackage); - getGeneratedPackage().getImport().add(importHttp); - } + } + if (httpMessageBasedPackage != null) { + ElementImport importHttp = tdlFactory.eINSTANCE.createElementImport(); + importHttp.setImportedPackage(httpMessageBasedPackage); + getGeneratedPackage().getImport().add(importHttp); } } @@ -185,12 +203,15 @@ public class Yang2TDLTranslator extends AbstractTranslator { parent = parent.getParent(); } if (parent != target) { - Files.walk(parent).filter( - f -> f.toFile().isFile() && f.toString().endsWith(".yang") && !f.toString().equals(targetFilename)) - .forEach(f -> { + Files.walk(parent).filter(f-> + f.toFile().isFile() && + f.toString().endsWith(".yang") && + !f.toString().equals(targetFilename) + ).forEach(f -> { System.out.println(f); build.addLibSource(moduleFromPath(f.toString())); - }); + } + ); // Files.find(parent, 20, (f, p) -> // p.isRegularFile() && // f.toString().endsWith(".yang") && @@ -210,12 +231,15 @@ public class Yang2TDLTranslator extends AbstractTranslator { // ); System.out.println("Processing: "+target); if (target.toFile().isDirectory()) { - Files.walk(target).filter( - f -> f.toFile().isFile() && f.toString().endsWith(".yang") && !f.toString().equals(targetFilename)) - .forEach(f -> { + Files.walk(target).filter(f-> + f.toFile().isFile() && + f.toString().endsWith(".yang") && + !f.toString().equals(targetFilename) + ).forEach(f -> { System.out.println(f); build.addSource(moduleFromPath(f.toString())); - }); + } + ); //non-recursive version // Files.list(target) // .filter(p->p.toString().endsWith("yang")) @@ -231,6 +255,13 @@ public class Yang2TDLTranslator extends AbstractTranslator { //TODO: library of built-in types //TODO: add extensions drmTarget = getTypeFor(targetMappingTag, tdlPackage.Literals.DATA_RESOURCE_MAPPING); + + if (this.mappingNameAnnotation != null) { + Annotation annot = tdlFactory.eINSTANCE.createAnnotation(); + annot.setKey(this.mappingNameAnnotation); + annot.setValue("Yang"); + drmTarget.getAnnotation().add(annot); + } // mappingsPackage.getPackagedElement().add(drmTarget); drmTarget.setResourceURI("TODO"); translate(schemaContext); @@ -269,8 +300,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { } System.out.println(name); if (c instanceof ContainerSchemaNode) { - // DONE: remove wrapper container structured data type of only a collection is - // contained + //DONE: remove wrapper container structured data type of only a collection is contained Collection<? extends DataSchemaNode> childNodes = ((ContainerSchemaNode) c).getChildNodes(); if (childNodes.isEmpty()) { //create structured data type @@ -289,12 +319,13 @@ public class Yang2TDLTranslator extends AbstractTranslator { } else if (c instanceof ListSchemaNode) { StructuredDataType itemType = translateStructuredDataType((ListSchemaNode) c, baseName, name); CollectionDataType collectionType = getCollectionDataTypeFor(itemType); - addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), collectionType, - sourceMappingTag, targetMappingTag); + addMapping(c, collectionType, sourceMappingTag, targetMappingTag); //TODO: add key annotation? List<QName> keyDefinition = ((ListSchemaNode) c).getKeyDefinition(); - String key = keyDefinition.stream().map(QName::getLocalName).collect(Collectors.joining(", ")); + String key = keyDefinition.stream() + .map(QName::getLocalName) + .collect(Collectors.joining(", ")); // TODO: make optional // annotateWith(collectionType, LIST_KEY, key); @@ -337,8 +368,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { //TODO: what is the difference? is it used String typeName = ((RegularLeafEffectiveStatement) c).getType().getQName().getLocalName(); SimpleDataType dataType = getSimpleDataTypeFor(typeName); - addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(c, dataType, sourceMappingTag, targetMappingTag); return dataType; } else if (c instanceof RegularChoiceEffectiveStatement) { //TODO: difference? @@ -346,8 +376,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { for (CaseSchemaNode child : ((RegularChoiceEffectiveStatement) c).getCases()) { translateMember(baseName, dataType, child); } - addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(c, dataType, sourceMappingTag, targetMappingTag); return dataType; } else if (c instanceof EmptyChoiceEffectiveStatement) { //TODO: add annotation choice @@ -357,8 +386,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { for (CaseSchemaNode child : ((EmptyChoiceEffectiveStatement) c).getCases()) { translateMember(baseName, dataType, child); } - addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(c, dataType, sourceMappingTag, targetMappingTag); return dataType; } else if (c instanceof UndeclaredCaseEffectiveStatement) { //choice -> container? (no case) @@ -377,8 +405,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { private CollectionDataType translateSimpleDataCollection(String name, TypeDefinition<?> type) { SimpleDataType itemType = translateSimpleDataType(name, type); CollectionDataType collectionType = getCollectionDataTypeFor(itemType); - addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), collectionType, sourceMappingTag, - targetMappingTag); + addMapping(type, collectionType, sourceMappingTag, targetMappingTag); return collectionType; } @@ -403,8 +430,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { eInstance.setDataType(dataType); dataType.getValue().add(eInstance); } - addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(baseType, dataType, sourceMappingTag, targetMappingTag); //TODO: add default? return dataType; @@ -417,8 +443,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { eInstance.setDataType(dataType); dataType.getValue().add(eInstance); } - addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(type, dataType, sourceMappingTag, targetMappingTag); return dataType; } else if (type instanceof UnionTypeDefinition) { @@ -435,8 +460,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { constraint.getQuantifier().add(ut); } } - addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(type, dataType, sourceMappingTag, targetMappingTag); return dataType; } else { @@ -450,8 +474,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { e.setExtending(superType); dataType.setExtension(e); } - addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping(type, dataType, sourceMappingTag, targetMappingTag); if (type instanceof StringTypeDefinition) { List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints(); @@ -492,30 +515,68 @@ public class Yang2TDLTranslator extends AbstractTranslator { private StructuredDataType translateStructuredDataType(DataNodeContainer c, String baseName, String name) { StructuredDataType dataType = getStructuredDataTypeFor(name); + addSuperType(dataType, this.messageBody); for (DataSchemaNode child : c.getChildNodes()) { translateMember(baseName, dataType, child); } - addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag, - targetMappingTag); + addMapping((SchemaNode) c, dataType, sourceMappingTag, targetMappingTag); return dataType; } //---------------------------------------------------------- //Mappings - private void addMapping(String uri, DataType dataType, String sourceMappingTag, String targetMappingTag) { + private void addMapping(SchemaNode c, DataType dataType, String sourceMappingTag, String targetMappingTag) { +// String uri = c.toString().replaceAll(".+?argument=", "").replaceAll("}", "") + + QNameModule module = c.getQName().getModule(); + String resourceName = getCleanName(module.getNamespace().toString() + "_resource"); + DataResourceMapping resourceMapping = findElementOfType(resourceName, tdlPackage.Literals.DATA_RESOURCE_MAPPING); + if (resourceMapping == null) { + resourceMapping = tdlFactory.eINSTANCE.createDataResourceMapping(); + resourceMapping.setName(resourceName); + String uri = module.getNamespace().toString(); + Optional<Revision> rev = module.getRevision(); + if (rev.isPresent()) + uri += "?" + rev.get().toString(); + resourceMapping.setResourceURI(uri); + getGeneratedPackage().getPackagedElement().add(resourceMapping); + + if (this.mappingNameAnnotation != null) { + Annotation annot = tdlFactory.eINSTANCE.createAnnotation(); + annot.setKey(this.mappingNameAnnotation); + annot.setValue("Yang"); + resourceMapping.getAnnotation().add(annot); + } + } + + String uri = // c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""); + c.getQName().getLocalName(); + //TODO: move mappings to a separate package - DataElementMapping sourceMapping = addDataElementMapping(uri, dataType, sourceMappingTag); - + // TODO: make configurable? - DataElementMapping targetMapping = addDataElementMapping("target://" + uri, dataType, targetMappingTag); - targetMapping.setDataResourceMapping(drmTarget); + boolean addSourceMapping = false; + DataElementMapping sourceMapping = null; + if (addSourceMapping) + sourceMapping = addDataElementMapping(uri, dataType, sourceMappingTag, drm); + + DataElementMapping targetMapping = addDataElementMapping(uri, dataType, targetMappingTag, resourceMapping); if (dataType instanceof StructuredDataType) { //TODO: reflect source names before transformation for (Member m : ((StructuredDataType) dataType).getMember()) { - addParameterMapping(sourceMapping, m, m.getName()); - addParameterMapping(targetMapping, m, m.getName()); + String mUri = m.getName(); + if (c instanceof DataNodeContainer) { + Collection<? extends DataSchemaNode> children = ((DataNodeContainer)c).getChildNodes(); + Optional<? extends DataSchemaNode> childNode = children.stream() + .filter(cn -> getCleanName(cn.getQName().getLocalName()).equals(m.getName())).findAny(); + if (childNode.isPresent()) + mUri = childNode.get().getQName().getLocalName(); + } + if (addSourceMapping) + addParameterMapping(sourceMapping, m, mUri); + addParameterMapping(targetMapping, m, mUri); } } } @@ -529,11 +590,15 @@ public class Yang2TDLTranslator extends AbstractTranslator { // processStatic(reactor); BuildAction build = reactor.newBuild(); - Files.list(Path.of("samples", "ietf")).forEach(p -> build.addSource(moduleFromPath(p.toString()))); + Files.list(Path.of("samples", "ietf")).forEach(p -> + build.addSource(moduleFromPath(p.toString())) + ); // Files.list(Path.of("samples", "nfv")).forEach(p -> // build.addSource(moduleFromPath(p.toString())) // ); - Files.list(Path.of("samples", "simple")).forEach(p -> build.addSource(moduleFromPath(p.toString()))); + Files.list(Path.of("samples", "simple")).forEach(p -> + build.addSource(moduleFromPath(p.toString())) + ); // build.addSource(moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang")); @@ -572,12 +637,18 @@ public class Yang2TDLTranslator extends AbstractTranslator { moduleFromPath("samples/ietf/ietf-yang-types@2013-07-15.yang"), moduleFromPath("samples/ietf/ietf-restconf@2017-01-26.yang"), moduleFromPath("samples/ietf/ietf-inet-types@2013-07-15.yang"), - moduleFromPath("samples/nfv/etsi-nfv-common.yang"), moduleFromPath("samples/nfv/etsi-nfv-nsd.yang"), - moduleFromPath("samples/nfv/etsi-nfv-pnfd.yang"), moduleFromPath("samples/nfv/etsi-nfv-vnfd.yang"), - moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang"), moduleFromPath("samples/nfv/etsi-nfv-ns.yang"), - moduleFromPath("samples/nfv/etsi-nfv-pnf.yang"), moduleFromPath("samples/nfv/etsi-nfv-vnf.yang")) + moduleFromPath("samples/nfv/etsi-nfv-common.yang"), + moduleFromPath("samples/nfv/etsi-nfv-nsd.yang"), + moduleFromPath("samples/nfv/etsi-nfv-pnfd.yang"), + moduleFromPath("samples/nfv/etsi-nfv-vnfd.yang"), + moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang"), + moduleFromPath("samples/nfv/etsi-nfv-ns.yang"), + moduleFromPath("samples/nfv/etsi-nfv-pnf.yang"), + moduleFromPath("samples/nfv/etsi-nfv-vnf.yang") + ) // moduleFromResources("/simple/sports.yang")) - .buildEffective().getChildNodes().forEach(e -> System.out.println(e.getQName())); + .buildEffective() + .getChildNodes().forEach(e->System.out.println(e.getQName())); ; } @@ -610,8 +681,7 @@ public class Yang2TDLTranslator extends AbstractTranslator { private static void expand(String prefix, DataSchemaNode c) { //TODO: this is not accurately reflecting the structures.. if (c instanceof LeafListSchemaNode) { - System.out.println( - prefix + c.getQName().getLocalName() + " : " + ((LeafListSchemaNode) c).getType().getQName()); + System.out.println(prefix+c.getQName().getLocalName() + " : " + ((LeafListSchemaNode) c).getType().getQName()); } else if (c instanceof ContainerSchemaNode) { System.out.println("!c"+prefix+c.getQName().getLocalName() + " : " ); //create structured data type @@ -621,12 +691,10 @@ public class Yang2TDLTranslator extends AbstractTranslator { //create collection of structured data type expand(prefix+" ", (ListSchemaNode) c); } else if (c instanceof RegularLeafEffectiveStatement) { - System.out.println("!r" + prefix + c.getQName().getLocalName() + " : " - + ((RegularLeafEffectiveStatement) c).getDeclared().getType().argument()); + System.out.println("!r"+prefix+c.getQName().getLocalName() + " : " + ((RegularLeafEffectiveStatement) c).getDeclared().getType().argument()); //create member of reference data type? } else if (c instanceof EmptyLeafEffectiveStatement) { - System.out.println("!e" + prefix + c.getQName().getLocalName() + " : " - + ((EmptyLeafEffectiveStatement) c).getType().getQName()); + System.out.println("!e"+prefix+c.getQName().getLocalName() + " : " + ((EmptyLeafEffectiveStatement) c).getType().getQName()); //create member of data type? } else if (c instanceof LeafrefTypeDefinition) { //not working?