package org.opendaylight.controller.config.yangjmxgenerator;
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;
+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;
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;
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;
private final Map<String, QName> providedServices;
private Collection<RuntimeBeanEntry> runtimeBeans;
+ private final QName yangModuleQName;
public ModuleMXBeanEntry(IdentitySchemaNode id,
Map<String, AttributeIfc> yangToAttributes, String packageName,
Map<String, QName> providedServices2, String javaNamePrefix,
- String namespace, Collection<RuntimeBeanEntry> runtimeBeans) {
+ String namespace, Collection<RuntimeBeanEntry> runtimeBeans,
+ QName yangModuleQName) {
this.globallyUniqueName = id.getQName().getLocalName();
this.yangToAttributes = yangToAttributes;
this.nullableDescription = id.getDescription();
this.namespace = checkNotNull(namespace);
this.providedServices = Collections.unmodifiableMap(providedServices2);
this.runtimeBeans = runtimeBeans;
+ this.yangModuleQName = yangModuleQName;
}
public String getMXBeanInterfaceName() {
}
/**
- * @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<String, QName> getProvidedServices() {
return providedServices;
moduleLocalNameFromXPath);
yangToAttributes = fillConfiguration(choiceCaseNode,
currentModule, typeProviderWrapper,
- qNamesToSIEs, schemaContext);
+ qNamesToSIEs, schemaContext, packageName);
checkUniqueAttributesWithGeneratedClass(
uniqueGeneratedClassesNames, when.getQName(),
yangToAttributes);
e.getConflictingName(), when.getQName(),
when.getQName());
}
-
checkUniqueRuntimeBeansGeneratedClasses(
uniqueGeneratedClassesNames, when, runtimeBeans);
Set<RuntimeBeanEntry> runtimeBeanEntryValues = Sets
moduleIdentity, yangToAttributes, packageName,
providedServices, javaNamePrefix, currentModule
.getNamespace().toString(),
- runtimeBeans);
+ runtimeBeans,
+ ModuleUtil.getQName(currentModule));
moduleMXBeanEntry.setYangModuleName(currentModule
.getName());
moduleMXBeanEntry
.<RuntimeBeanEntry> emptyList());
}
}
+ // check attributes name uniqueness
+ for (Entry<String, ModuleMXBeanEntry> entry : result.entrySet()) {
+ checkUniqueRuntimeBeanAttributesName(entry.getValue(),
+ uniqueGeneratedClassesNames);
+ }
if (unaugmentedModuleIdentities.size() > 0) {
logger.warn("Augmentation not found for all module identities: {}",
unaugmentedModuleIdentities.keySet());
}
}
+ private static void checkUniqueRuntimeBeanAttributesName(
+ ModuleMXBeanEntry mxBeanEntry,
+ Map<String, QName> 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<String, QName> uniqueGeneratedClassNames, QName parentQName,
Map<String, AttributeIfc> yangToAttributes) {
ChoiceCaseNode choiceCaseNode, Module currentModule,
TypeProviderWrapper typeProviderWrapper,
Map<QName, ServiceInterfaceEntry> qNamesToSIEs,
- SchemaContext schemaContext) {
+ SchemaContext schemaContext, String packageName) {
Map<String, AttributeIfc> yangToAttributes = new HashMap<>();
for (DataSchemaNode attrNode : choiceCaseNode.getChildNodes()) {
AttributeIfc attributeValue = getAttributeValue(attrNode,
currentModule, qNamesToSIEs, typeProviderWrapper,
- schemaContext);
+ schemaContext, packageName);
yangToAttributes.put(attributeValue.getAttributeYangName(),
attributeValue);
}
}
}
- 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;
}
private static AttributeIfc getAttributeValue(DataSchemaNode attrNode,
Module currentModule,
Map<QName, ServiceInterfaceEntry> qNamesToSIEs,
- TypeProviderWrapper typeProviderWrapper, SchemaContext schemaContext) {
+ TypeProviderWrapper typeProviderWrapper,
+ SchemaContext schemaContext, String packageName) {
if (attrNode instanceof LeafSchemaNode) {
// simple type
} 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<QName, ServiceInterfaceEntry> 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<QName, ServiceInterfaceEntry> qNamesToSIEs,
return nullableDescription;
}
+ public QName getYangModuleQName() {
+ return yangModuleQName;
+ }
+
@Override
public String toString() {
return "ModuleMXBeanEntry{" + "globallyUniqueName='"