X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fconfig%2Fyang-jmx-generator%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2FModuleMXBeanEntry.java;h=4eba739b469d52b675b7208e0621c9ddc9f4a845;hb=de12565a7795af98788f8150eb0072f9c985f4a1;hp=70a4edde41b70aa82852482fb24455ef0fee264d;hpb=e7c8982a45c9ee5789d7ba25bb0324065efbe23e;p=controller.git diff --git a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntry.java b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntry.java index 70a4edde41..4eba739b46 100644 --- a/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntry.java +++ b/opendaylight/config/yang-jmx-generator/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntry.java @@ -7,12 +7,27 @@ */ package org.opendaylight.controller.config.yangjmxgenerator; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Sets; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static java.lang.String.format; +import static org.opendaylight.controller.config.yangjmxgenerator.ConfigConstants.createConfigQName; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.opendaylight.controller.config.yangjmxgenerator.attribute.AbstractDependencyAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; import org.opendaylight.controller.config.yangjmxgenerator.attribute.DependencyAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.JavaAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListAttribute; +import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListDependenciesAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.TOAttribute; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FullyQualifiedNameHelper; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.NameConflictException; @@ -21,6 +36,7 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; @@ -37,20 +53,9 @@ import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static java.lang.String.format; -import static org.opendaylight.controller.config.yangjmxgenerator.ConfigConstants.createConfigQName; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Optional; +import com.google.common.collect.Sets; /** * Represents part of yang model that describes a module. @@ -180,8 +185,9 @@ public class ModuleMXBeanEntry extends AbstractEntry { } /** - * @return services implemented by this module. Keys are fully qualified java names of generated - * ServiceInterface classes, values are identity local names. + * @return services implemented by this module. Keys are fully qualified + * java names of generated ServiceInterface classes, values are + * identity local names. */ public Map getProvidedServices() { return providedServices; @@ -338,7 +344,7 @@ public class ModuleMXBeanEntry extends AbstractEntry { moduleLocalNameFromXPath); yangToAttributes = fillConfiguration(choiceCaseNode, currentModule, typeProviderWrapper, - qNamesToSIEs, schemaContext); + qNamesToSIEs, schemaContext, packageName); checkUniqueAttributesWithGeneratedClass( uniqueGeneratedClassesNames, when.getQName(), yangToAttributes); @@ -356,7 +362,6 @@ public class ModuleMXBeanEntry extends AbstractEntry { e.getConflictingName(), when.getQName(), when.getQName()); } - checkUniqueRuntimeBeansGeneratedClasses( uniqueGeneratedClassesNames, when, runtimeBeans); Set runtimeBeanEntryValues = Sets @@ -411,6 +416,11 @@ public class ModuleMXBeanEntry extends AbstractEntry { . emptyList()); } } + // check attributes name uniqueness + for (Entry entry : result.entrySet()) { + checkUniqueRuntimeBeanAttributesName(entry.getValue(), + uniqueGeneratedClassesNames); + } if (unaugmentedModuleIdentities.size() > 0) { logger.warn("Augmentation not found for all module identities: {}", unaugmentedModuleIdentities.keySet()); @@ -439,6 +449,25 @@ public class ModuleMXBeanEntry extends AbstractEntry { } } + private static void checkUniqueRuntimeBeanAttributesName( + ModuleMXBeanEntry mxBeanEntry, + Map uniqueGeneratedClassesNames) { + for (RuntimeBeanEntry runtimeBeanEntry : mxBeanEntry.getRuntimeBeans()) { + for (String runtimeAttName : runtimeBeanEntry + .getYangPropertiesToTypesMap().keySet()) { + if (mxBeanEntry.getAttributes().keySet() + .contains(runtimeAttName)) { + QName qName1 = uniqueGeneratedClassesNames + .get(runtimeBeanEntry.getJavaNameOfRuntimeMXBean()); + QName qName2 = uniqueGeneratedClassesNames.get(mxBeanEntry + .getGloballyUniqueName()); + throw new NameConflictException(runtimeAttName, qName1, + qName2); + } + } + } + } + private static void checkUniqueAttributesWithGeneratedClass( Map uniqueGeneratedClassNames, QName parentQName, Map yangToAttributes) { @@ -484,12 +513,12 @@ public class ModuleMXBeanEntry extends AbstractEntry { ChoiceCaseNode choiceCaseNode, Module currentModule, TypeProviderWrapper typeProviderWrapper, Map qNamesToSIEs, - SchemaContext schemaContext) { + SchemaContext schemaContext, String packageName) { Map yangToAttributes = new HashMap<>(); for (DataSchemaNode attrNode : choiceCaseNode.getChildNodes()) { AttributeIfc attributeValue = getAttributeValue(attrNode, currentModule, qNamesToSIEs, typeProviderWrapper, - schemaContext); + schemaContext, packageName); yangToAttributes.put(attributeValue.getAttributeYangName(), attributeValue); } @@ -549,11 +578,12 @@ public class ModuleMXBeanEntry extends AbstractEntry { } } - private static int getChildNodeSizeWithoutUses(ContainerSchemaNode csn) { + private static int getChildNodeSizeWithoutUses(DataNodeContainer csn) { int result = 0; for (DataSchemaNode dsn : csn.getChildNodes()) { - if (dsn.isAddedByUses() == false) + if (dsn.isAddedByUses() == false) { result++; + } } return result; } @@ -561,7 +591,8 @@ public class ModuleMXBeanEntry extends AbstractEntry { private static AttributeIfc getAttributeValue(DataSchemaNode attrNode, Module currentModule, Map qNamesToSIEs, - TypeProviderWrapper typeProviderWrapper, SchemaContext schemaContext) { + TypeProviderWrapper typeProviderWrapper, + SchemaContext schemaContext, String packageName) { if (attrNode instanceof LeafSchemaNode) { // simple type @@ -570,49 +601,80 @@ public class ModuleMXBeanEntry extends AbstractEntry { } else if (attrNode instanceof ContainerSchemaNode) { // reference or TO ContainerSchemaNode containerSchemaNode = (ContainerSchemaNode) attrNode; - if (containerSchemaNode.getUses().size() == 1 - && getChildNodeSizeWithoutUses(containerSchemaNode) == 0) { - // reference - UsesNode usesNode = containerSchemaNode.getUses().iterator() - .next(); - checkState(usesNode.getRefines().size() == 1, - "Unexpected 'refine' child node size of " - + containerSchemaNode); - LeafSchemaNode refine = (LeafSchemaNode) usesNode.getRefines() - .values().iterator().next(); - checkState(refine.getUnknownSchemaNodes().size() == 1, - "Unexpected unknown schema node size of " + refine); - UnknownSchemaNode requiredIdentity = refine - .getUnknownSchemaNodes().iterator().next(); - checkState( - ConfigConstants.REQUIRED_IDENTITY_EXTENSION_QNAME.equals(requiredIdentity - .getNodeType()), - "Unexpected language extension " + requiredIdentity); - String prefixAndIdentityLocalName = requiredIdentity - .getNodeParameter(); - // import should point to a module - ServiceInterfaceEntry serviceInterfaceEntry = findSIE( - prefixAndIdentityLocalName, currentModule, - qNamesToSIEs, schemaContext); - boolean mandatory = refine.getConstraints().isMandatory(); - return new DependencyAttribute(attrNode, serviceInterfaceEntry, - mandatory, attrNode.getDescription()); + Optional dependencyAttributeOptional = extractDependency( + containerSchemaNode, attrNode, currentModule, qNamesToSIEs, + schemaContext); + if (dependencyAttributeOptional.isPresent()) { + return dependencyAttributeOptional.get(); } else { return TOAttribute.create(containerSchemaNode, - typeProviderWrapper); + typeProviderWrapper, packageName); } + } else if (attrNode instanceof LeafListSchemaNode) { return ListAttribute.create((LeafListSchemaNode) attrNode, typeProviderWrapper); } else if (attrNode instanceof ListSchemaNode) { - return ListAttribute.create((ListSchemaNode) attrNode, - typeProviderWrapper); + ListSchemaNode listSchemaNode = (ListSchemaNode) attrNode; + Optional dependencyAttributeOptional = extractDependency( + listSchemaNode, attrNode, currentModule, qNamesToSIEs, + schemaContext); + if (dependencyAttributeOptional.isPresent()) { + return dependencyAttributeOptional.get(); + } else { + return ListAttribute.create(listSchemaNode, + typeProviderWrapper, packageName); + } } else { throw new UnsupportedOperationException( "Unknown configuration node " + attrNode.toString()); } } + private static Optional extractDependency( + DataNodeContainer dataNodeContainer, DataSchemaNode attrNode, + Module currentModule, + Map qNamesToSIEs, + SchemaContext schemaContext) { + if (dataNodeContainer.getUses().size() == 1 + && getChildNodeSizeWithoutUses(dataNodeContainer) == 0) { + // reference + UsesNode usesNode = dataNodeContainer.getUses().iterator().next(); + checkState(usesNode.getRefines().size() == 1, + "Unexpected 'refine' child node size of " + + dataNodeContainer); + LeafSchemaNode refine = (LeafSchemaNode) usesNode.getRefines() + .values().iterator().next(); + checkState(refine.getUnknownSchemaNodes().size() == 1, + "Unexpected unknown schema node size of " + refine); + UnknownSchemaNode requiredIdentity = refine.getUnknownSchemaNodes() + .iterator().next(); + checkState( + ConfigConstants.REQUIRED_IDENTITY_EXTENSION_QNAME.equals(requiredIdentity + .getNodeType()), "Unexpected language extension " + + requiredIdentity); + String prefixAndIdentityLocalName = requiredIdentity + .getNodeParameter(); + // import should point to a module + ServiceInterfaceEntry serviceInterfaceEntry = findSIE( + prefixAndIdentityLocalName, currentModule, qNamesToSIEs, + schemaContext); + boolean mandatory = refine.getConstraints().isMandatory(); + AbstractDependencyAttribute reference; + if (dataNodeContainer instanceof ContainerSchemaNode) { + reference = new DependencyAttribute(attrNode, + serviceInterfaceEntry, mandatory, + attrNode.getDescription()); + } else { + reference = new ListDependenciesAttribute(attrNode, + serviceInterfaceEntry, mandatory, + attrNode.getDescription()); + } + return Optional.of(reference); + } + return Optional.absent(); + } + private static ServiceInterfaceEntry findSIE( String prefixAndIdentityLocalName, Module currentModule, Map qNamesToSIEs,