- /**
- * Internal base class to abstract binding type-specific behavior.
- */
- private static abstract class BindingContext {
- final InstanceIdentifier<DataObject> appConfigPath;
- final Class<DataObject> appConfigBindingClass;
- final Class<? extends DataSchemaNode> schemaType;
- final QName bindingQName;
-
- protected BindingContext(Class<DataObject> appConfigBindingClass, InstanceIdentifier<DataObject> appConfigPath,
- Class<? extends DataSchemaNode> schemaType) {
- this.appConfigBindingClass = appConfigBindingClass;
- this.appConfigPath = appConfigPath;
- this.schemaType = schemaType;
-
- bindingQName = BindingReflections.findQName(appConfigBindingClass);
- }
-
- abstract NormalizedNode<?, ?> parseDataElement(Element element, DataSchemaNode dataSchema,
- DomToNormalizedNodeParserFactory parserFactory);
-
- abstract NormalizedNode<?, ?> newDefaultNode(DataSchemaNode dataSchema);
- }
-
- /**
- * BindingContext implementation for a container binding.
- */
- private static class ContainerBindingContext extends BindingContext {
- ContainerBindingContext(Class<DataObject> appConfigBindingClass) {
- super(appConfigBindingClass, InstanceIdentifier.create(appConfigBindingClass), ContainerSchemaNode.class);
- }
-
- @Override
- NormalizedNode<?, ?> newDefaultNode(DataSchemaNode dataSchema) {
- return ImmutableNodes.containerNode(bindingQName);
- }
-
- @Override
- NormalizedNode<?, ?> parseDataElement(Element element, DataSchemaNode dataSchema,
- DomToNormalizedNodeParserFactory parserFactory) {
- return parserFactory.getContainerNodeParser().parse(Collections.singletonList(element),
- (ContainerSchemaNode)dataSchema);
- }
- }
-
- /**
- * BindingContext implementation for a list binding.
- */
- private static class ListBindingContext extends BindingContext {
- final String appConfigListKeyValue;
-
- ListBindingContext(Class<DataObject> appConfigBindingClass, InstanceIdentifier<DataObject> appConfigPath,
- String appConfigListKeyValue) {
- super(appConfigBindingClass, appConfigPath, ListSchemaNode.class);
- this.appConfigListKeyValue = appConfigListKeyValue;
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private static ListBindingContext newInstance(Class<DataObject> bindingClass, String listKeyValue)
- throws Exception {
- // We assume the yang list key type is string.
- Identifier keyInstance = (Identifier) bindingClass.getMethod("getKey").getReturnType().
- getConstructor(String.class).newInstance(listKeyValue);
- InstanceIdentifier appConfigPath = InstanceIdentifier.builder((Class)bindingClass, keyInstance).build();
- return new ListBindingContext(bindingClass, appConfigPath, listKeyValue);
- }
-
- @Override
- NormalizedNode<?, ?> newDefaultNode(DataSchemaNode dataSchema) {
- // We assume there's only one key for the list.
- List<QName> keys = ((ListSchemaNode)dataSchema).getKeyDefinition();
- Preconditions.checkArgument(keys.size() == 1, "Expected only 1 key for list %s", appConfigBindingClass);
- QName listKeyQName = keys.iterator().next();
- return ImmutableNodes.mapEntryBuilder(bindingQName, listKeyQName, appConfigListKeyValue).build();
- }
-
- @Override
- NormalizedNode<?, ?> parseDataElement(Element element, DataSchemaNode dataSchema,
- DomToNormalizedNodeParserFactory parserFactory) {
- return parserFactory.getMapEntryNodeParser().parse(Collections.singletonList(element),
- (ListSchemaNode)dataSchema);
- }
- }