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=5bcc5402afae09edbbe53eb58c3d077fba5fc2ce;hb=306f95ccf8d699e2eed111f193b2fc388fa03e70;hp=fdc573f9757b1acb2c32162c9f1be757916a3e58;hpb=dfe4a744e9b2ebbbd06e3e91b6100258c2744983;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 fdc573f975..5bcc5402af 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,11 +7,9 @@
*/
package org.opendaylight.controller.config.yangjmxgenerator;
-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;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -21,11 +19,12 @@ 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;
@@ -34,6 +33,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;
@@ -49,9 +49,10 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
-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;
/**
* Represents part of yang model that describes a module.
@@ -129,14 +130,16 @@ public class ModuleMXBeanEntry extends AbstractEntry {
private final String nullableDescription, packageName, javaNamePrefix,
namespace;
- private final Map providedServices;
+ private final Map providedServices;
private Collection runtimeBeans;
+ private final QName yangModuleQName;
public ModuleMXBeanEntry(IdentitySchemaNode id,
Map yangToAttributes, String packageName,
- Map providedServices2, String javaNamePrefix,
- String namespace, Collection runtimeBeans) {
+ Map providedServices2, String javaNamePrefix,
+ String namespace, Collection runtimeBeans,
+ QName yangModuleQName) {
this.globallyUniqueName = id.getQName().getLocalName();
this.yangToAttributes = yangToAttributes;
this.nullableDescription = id.getDescription();
@@ -145,6 +148,7 @@ public class ModuleMXBeanEntry extends AbstractEntry {
this.namespace = checkNotNull(namespace);
this.providedServices = Collections.unmodifiableMap(providedServices2);
this.runtimeBeans = runtimeBeans;
+ this.yangModuleQName = yangModuleQName;
}
public String getMXBeanInterfaceName() {
@@ -181,10 +185,11 @@ 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() {
+ public Map getProvidedServices() {
return providedServices;
}
@@ -317,7 +322,7 @@ public class ModuleMXBeanEntry extends AbstractEntry {
checkState(moduleIdentity != null, "Cannot find identity "
+ moduleLocalNameFromXPath
+ " matching augmentation " + augmentation);
- Map providedServices = findProvidedServices(
+ Map providedServices = findProvidedServices(
moduleIdentity, currentModule, qNamesToSIEs,
schemaContext);
@@ -339,7 +344,7 @@ public class ModuleMXBeanEntry extends AbstractEntry {
moduleLocalNameFromXPath);
yangToAttributes = fillConfiguration(choiceCaseNode,
currentModule, typeProviderWrapper,
- qNamesToSIEs, schemaContext);
+ qNamesToSIEs, schemaContext, packageName);
checkUniqueAttributesWithGeneratedClass(
uniqueGeneratedClassesNames, when.getQName(),
yangToAttributes);
@@ -357,7 +362,6 @@ public class ModuleMXBeanEntry extends AbstractEntry {
e.getConflictingName(), when.getQName(),
when.getQName());
}
-
checkUniqueRuntimeBeansGeneratedClasses(
uniqueGeneratedClassesNames, when, runtimeBeans);
Set runtimeBeanEntryValues = Sets
@@ -391,7 +395,8 @@ public class ModuleMXBeanEntry extends AbstractEntry {
moduleIdentity, yangToAttributes, packageName,
providedServices, javaNamePrefix, currentModule
.getNamespace().toString(),
- runtimeBeans);
+ runtimeBeans,
+ ModuleUtil.getQName(currentModule));
moduleMXBeanEntry.setYangModuleName(currentModule
.getName());
moduleMXBeanEntry
@@ -412,6 +417,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());
@@ -440,6 +450,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) {
@@ -485,23 +514,23 @@ 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);
}
return yangToAttributes;
}
- private static Map findProvidedServices(
+ private static Map findProvidedServices(
IdentitySchemaNode moduleIdentity, Module currentModule,
Map qNamesToSIEs,
SchemaContext schemaContext) {
- Map result = new HashMap<>();
+ Map result = new HashMap<>();
for (UnknownSchemaNode unknownNode : moduleIdentity
.getUnknownSchemaNodes()) {
if (ConfigConstants.PROVIDED_SERVICE_EXTENSION_QNAME
@@ -510,8 +539,7 @@ public class ModuleMXBeanEntry extends AbstractEntry {
.getNodeParameter();
ServiceInterfaceEntry sie = findSIE(prefixAndIdentityLocalName,
currentModule, qNamesToSIEs, schemaContext);
- result.put(sie.getFullyQualifiedName(), sie.getQName()
- .getLocalName());
+ result.put(sie.getFullyQualifiedName(), sie.getQName());
}
}
return result;
@@ -551,11 +579,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;
}
@@ -563,7 +592,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
@@ -572,49 +602,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 extends AbstractDependencyAttribute> 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 extends AbstractDependencyAttribute> 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 extends AbstractDependencyAttribute> 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,
@@ -670,6 +731,10 @@ public class ModuleMXBeanEntry extends AbstractEntry {
return nullableDescription;
}
+ public QName getYangModuleQName() {
+ return yangModuleQName;
+ }
+
@Override
public String toString() {
return "ModuleMXBeanEntry{" + "globallyUniqueName='"