import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.annotateDeprecatedIfNecessary;
import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.checkModuleAndModuleName;
import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.createDescription;
-import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.resolveListKeyTOBuilder;
import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.addImplementedInterfaceFromUses;
import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.addRawInterfaceDefinition;
import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.moduleTypeBuilder;
import java.util.Map;
import java.util.Set;
import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
-import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
+import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
/**
*
*
*/
@Beta
-public final class RpcActionGenHelper {
+final class RpcActionGenHelper {
private static final QName CONTEXT_REFERENCE =
QName.create("urn:opendaylight:yang:extension:yang-ext", "2013-07-09", "context-reference").intern();
if (potential instanceof ActionNodeContainer) {
final Set<ActionDefinition> actions = ((ActionNodeContainer) potential).getActions();
for (ActionDefinition action: actions) {
- genCtx.get(module).addChildNodeType(potential, resolveOperation(potential, action, module,
+ genCtx.get(module).addTopLevelNodeType(resolveOperation(potential, action, module,
schemaContext, verboseClassComments, genTypeBuilders, genCtx, typeProvider, true));
}
}
}
for (final RpcDefinition rpc : rpcDefinitions) {
- DataSchemaNode parent = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext, rpc.getPath().getParent());
+ //FIXME: get correct parent for routed RPCs only
+ DataSchemaNode parent = null;
+
+ ContainerSchemaNode input = rpc.getInput();
+ boolean isAction = false;
+ if (input != null) {
+ for (DataSchemaNode schemaNode : input.getChildNodes()) {
+ if (getRoutingContext(schemaNode).isPresent()) {
+ isAction = true;
+ break;
+ }
+ }
+ }
+
//routedRPC?
- if (getRoutingContext(parent).isPresent()) {
- genCtx.get(module).addChildNodeType(parent, resolveOperation(parent, rpc, module, schemaContext,
+ if (isAction) {
+ genCtx.get(module).addTopLevelNodeType(resolveOperation(parent, rpc, module, schemaContext,
verboseClassComments, genTypeBuilders, genCtx, typeProvider, true));
} else {
//global RPC only
//input
final ContainerSchemaNode input = operation.getInput();
- final GeneratedTypeBuilder inType = resolveOperationNode(module, operation.getInput(), basePackageName,
- schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, true);
+ final GeneratedTypeBuilder inType = resolveOperationNode(interfaceBuilder, module, operation.getInput(),
+ basePackageName, schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, true);
annotateDeprecatedIfNecessary(operation.getStatus(), inType);
+ inType.setParentTypeForBuilder(interfaceBuilder);
genCtx.get(module).addChildNodeType(input, inType);
//output
final ContainerSchemaNode output = operation.getOutput();
- final GeneratedTypeBuilder outType = resolveOperationNode(module, operation.getOutput(), basePackageName,
- schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, false);
+ final GeneratedTypeBuilder outType = resolveOperationNode(interfaceBuilder, module, operation.getOutput(),
+ basePackageName, schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, false);
annotateDeprecatedIfNecessary(operation.getStatus(), outType);
+ outType.setParentTypeForBuilder(interfaceBuilder);
genCtx.get(module).addChildNodeType(output, outType);
final GeneratedType inTypeInstance = inType.toInstance();
if (isAction) {
//action, routed RPC
- String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, parent.getPath(),
- BindingNamespaceType.Data);
- GeneratedTypeBuilder parentType = addRawInterfaceDefinition(packageName, parent, schemaContext,
- parent.getQName().getLocalName(), verboseClassComments, genTypeBuilders);
- parentType.addImplementsType(TREE_NODE);
- parentType.addImplementsType(augmentable(parentType));
+ checkState(parent != null, "Parent node of " + operation.getQName().getLocalName() + " can't be NULL");
+ GeneratedTypeBuilder parentType = genCtx.get(module).getChildNode(parent.getPath());
+ checkState(parentType != null, "Parent generated type for " + parent
+ + " data schema node must have been generated already");
annotateDeprecatedIfNecessary(parent.getStatus(), parentType);
- operationMethod.addParameter(parameterizedTypeFor(INSTANCE_IDENTIFIER, parentType), "ii");
-
if (parent instanceof ListSchemaNode) {
//ListAction
- final GeneratedTOBuilder keyType = resolveListKeyTOBuilder(basePackageName, (ListSchemaNode) parent);
+ GeneratedTransferObject keyType = null;
+ for (MethodSignatureBuilder method : parentType.getMethodDefinitions()) {
+ if (method.getName().equals("getKey")) {
+ keyType = (GeneratedTransferObject) method.toInstance(parentType).getReturnType();
+ }
+ }
+
operationMethod.addParameter(
parameterizedTypeFor(KEYED_INSTANCE_IDENTIFIER, parentType, keyType), "kii");
- operationMethod.setReturnType(keyType);
interfaceBuilder.addImplementsType(parameterizedTypeFor(LIST_ACTION, parentType, inType, outType));
} else {
//Action
GenHelperUtil.resolveDataSchemaNodes(module, basePackageName, parentType, parentType,
((ContainerSchemaNode) parent).getChildNodes(), genCtx, schemaContext, verboseClassComments,
- genTypeBuilders, typeProvider);
+ genTypeBuilders, typeProvider, BindingNamespaceType.Data);
operationMethod.addParameter(parameterizedTypeFor(INSTANCE_IDENTIFIER, parentType), "ii");
interfaceBuilder.addImplementsType(parameterizedTypeFor(ACTION, parentType, inType, outType));
}
interfaceBuilder.addImplementsType(parameterizedTypeFor(RPC, inType, outType));
}
+ interfaceBuilder.addImplementsType(TREE_NODE);
operationMethod.addParameter(parameterizedTypeFor(RPC_CALLBACK, outType), "callback");
operationMethod.setComment(operationComment);
return interfaceBuilder;
}
- private static GeneratedTypeBuilder resolveOperationNode(final Module module, final ContainerSchemaNode
- operationNode, final String basePackageName, final SchemaContext schemaContext, final String
+ private static GeneratedTypeBuilder resolveOperationNode(GeneratedTypeBuilder parent, final Module module, final
+ ContainerSchemaNode operationNode, final String basePackageName, final SchemaContext schemaContext, final String
operationName, final boolean verboseClassComments, TypeProvider typeProvider, Map<String, Map<String,
GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx, final boolean isInput) {
final GeneratedTypeBuilder nodeType = addRawInterfaceDefinition(basePackageName, operationNode, schemaContext,
- operationName, verboseClassComments, genTypeBuilders);
+ operationName, "", verboseClassComments, genTypeBuilders);
addImplementedInterfaceFromUses(operationNode, nodeType, genCtx);
- nodeType.addImplementsType(TREE_NODE);
+ nodeType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
+ (BindingTypes.ITEM, parent)));
if (isInput) {
nodeType.addImplementsType(parameterizedTypeFor(INPUT, nodeType));
} else {
nodeType.addImplementsType(parameterizedTypeFor(INSTANTIABLE, nodeType));
nodeType.addImplementsType(augmentable(nodeType));
GenHelperUtil.resolveDataSchemaNodes(module, basePackageName, nodeType, nodeType, operationNode.getChildNodes(), genCtx,
- schemaContext, verboseClassComments, genTypeBuilders, typeProvider);
+ schemaContext, verboseClassComments, genTypeBuilders, typeProvider, BindingNamespaceType.Data);
final MethodSignatureBuilder nodeMethod = nodeType.addMethod("implementedInterface");
nodeMethod.setReturnType(parameterizedTypeFor(CLASS, nodeType));